本次爬取的是百度百科网络爬虫词条以及相关的标题、摘要和链接等信息
一、运行流程
爬虫框架的动态运行流程如下:
运行流程
其中,
爬虫调度端主要负责统筹其他四个模块的协调工作;
URL管理器主要负责管理URL链接,维护已经爬取的URL集合和未爬取的URL集合,提供获取新URL链接的接口;
网页下载器则根据提供到的URL下载网页,并提供下载成功的网页数据;
网页解析器根据提供的网页数据,解析新的URL链接和词条标题、摘要,返回相关数据给调度端;
数据存储器通过mongo数据库的形式保存给到的数据;
二、具体代码介绍
1、UrlManager即URL管理器
def has_new_url(self):
return len(self.new_urls)
def get_new_url(self):
if(self.has_new_url()):
new_url = self.new_urls.pop()
self.old_urls.add(new_url)
return new_url
return None
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)
has_new_url() 判断是否还有未爬取的URL集合,调度器会根据该函数判断是否要继续进行爬虫操作,未爬取的URL集合为空的时候,爬虫会自动停止;
get_new_url() 从未爬取的URL集合中获取一个URL,并将其从未爬取的URL集合中删除,添加到已爬取的集合中,调度器会让下载器根据该URL下载网页数据并进行数据的爬取和保存;
add_new_url() 添加到未爬取的URL集合时,必须判断是否有重合的URL,以免重复爬虫了。
2、HtmlDownloader为网页下载器
def download(self, url):
if url is None:
return None
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'}
r = requests.get(url=url, headers=headers)
if r.status_code == 200:
r.encoding = 'utf-8'
return r.text
return None
注意r.encoding,因为我是在window下编码的,下载的网页数据中,中文是乱码显示的,添加了r.encoding后中文就正常显示了,参考链接:https://jingyan.baidu.com/article/2c8c281dbb969d0008252a80.html
3、HtmlParser是网页解析器
(1)新的URL集合
links = html.find_all('a', href=re.compile(r'/item/'))
匹配的新的URL如下:
只要链接中包含item,都添加到新的未爬取的URL集合中
(2)获取摘要和词条标题
def _get_new_data(self, page_url, html):
data={}
# 获取词语的简介内容
data['summary'] = (html.select('.lemma-summary')[0].get_text()).strip()
data['url'] = page_url
# 词语
data['title'] = html.select('dd h1')[0].get_text()
return data
解析的字段
三、运行结果
mongo 数据库保存每个词条的标题、摘要和百度链接
运行结果
网友评论