温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python爬虫的示例分析

发布时间:2021-07-15 14:29:14 来源:亿速云 阅读:214 作者:小新 栏目:开发技术

这篇文章主要为大家展示了“python爬虫的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python爬虫的示例分析”这篇文章吧。

爬虫简单架构

python爬虫的示例分析

程序入口函数(爬虫调度段)

#coding:utf8 import time, datetime from maya_Spider import url_manager, html_downloader, html_parser, html_outputer class Spider_Main(object):  #初始化操作  def __init__(self):   #设置url管理器   self.urls = url_manager.UrlManager()   #设置HTML下载器   self.downloader = html_downloader.HtmlDownloader()   #设置HTML解析器   self.parser = html_parser.HtmlParser()   #设置HTML输出器   self.outputer = html_outputer.HtmlOutputer()  #爬虫调度程序  def craw(self, root_url):   count = 1   self.urls.add_new_url(root_url)   while self.urls.has_new_url():    try:     new_url = self.urls.get_new_url()     print('craw %d : %s' % (count, new_url))     html_content = self.downloader.download(new_url)     new_urls, new_data = self.parser.parse(new_url, html_content)     self.urls.add_new_urls(new_urls)     self.outputer.collect_data(new_data)     if count == 10:      break     count = count + 1    except:     print('craw failed')   self.outputer.output_html() if __name__ == '__main__':  #设置爬虫入口  root_url = 'http://baike.baidu.com/view/21087.htm'  #开始时间  print('开始计时..............')  start_time = datetime.datetime.now()  obj_spider = Spider_Main()  obj_spider.craw(root_url)  #结束时间  end_time = datetime.datetime.now()  print('总用时:%ds'% (end_time - start_time).seconds)

URL管理器

class UrlManager(object):  def __init__(self):   self.new_urls = set()   self.old_urls = set()  def add_new_url(self, url):   if url is None:    return   if url not in self.new_urls and url not in self.old_urls:    self.new_urls.add(url)  def add_new_urls(self, urls):   if urls is None or len(urls) == 0:    return   for url in urls:    self.add_new_url(url)  def has_new_url(self):   return len(self.new_urls) != 0  def get_new_url(self):   new_url = self.new_urls.pop()   self.old_urls.add(new_url)   return new_url

网页下载器

import urllib import urllib.request class HtmlDownloader(object):  def download(self, url):   if url is None:    return None   #伪装成浏览器访问,直接访问的话csdn会拒绝   user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'   headers = {'User-Agent':user_agent}   #构造请求   req = urllib.request.Request(url,headers=headers)   #访问页面   response = urllib.request.urlopen(req)   #python3中urllib.read返回的是bytes对象,不是string,得把它转换成string对象,用bytes.decode方法   return response.read().decode()

网页解析器

import re import urllib from urllib.parse import urlparse from bs4 import BeautifulSoup class HtmlParser(object):  def _get_new_urls(self, page_url, soup):   new_urls = set()   #/view/123.htm   links = soup.find_all('a', href=re.compile(r'/item/.*?'))   for link in links:    new_url = link['href']    new_full_url = urllib.parse.urljoin(page_url, new_url)    new_urls.add(new_full_url)   return new_urls  #获取标题、摘要  def _get_new_data(self, page_url, soup):   #新建字典   res_data = {}   #url   res_data['url'] = page_url   #<dd class="lemmaWgt-lemmaTitle-title"><h2>Python</h2>获得标题标签   title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title").find('h2')   print(str(title_node.get_text()))   res_data['title'] = str(title_node.get_text())   #<div class="lemma-summary" label-module="lemmaSummary">   summary_node = soup.find('div', class_="lemma-summary")   res_data['summary'] = summary_node.get_text()   return res_data  def parse(self, page_url, html_content):   if page_url is None or html_content is None:    return None   soup = BeautifulSoup(html_content, 'html.parser', from_encoding='utf-8')   new_urls = self._get_new_urls(page_url, soup)   new_data = self._get_new_data(page_url, soup)   return new_urls, new_data

网页输出器

class HtmlOutputer(object):  def __init__(self):   self.datas = []  def collect_data(self, data):   if data is None:    return   self.datas.append(data )  def output_html(self):   fout = open('maya.html', 'w', encoding='utf-8')   fout.write("<head><meta http-equiv='content-type' content='text/html;charset=utf-8'></head>")   fout.write('<html>')   fout.write('<body>')   fout.write('<table border="1">')   # <th width="5%">Url</th>   fout.write('''<tr  width="90%">      <th>Theme</th>      <th width="80%">Content</th>      </tr>''')   for data in self.datas:    fout.write('<tr>\n')    # fout.write('\t<td>%s</td>' % data['url'])    fout.write('\t<td align="center"><a href=\'%s\'>%s</td>' % (data['url'], data['title']))    fout.write('\t<td>%s</td>\n' % data['summary'])    fout.write('</tr>\n')   fout.write('</table>')   fout.write('</body>')   fout.write('</html>')   fout.close()

运行结果

python爬虫的示例分析

以上是“python爬虫的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI