Python的爬虫框架主要可以分为以下五个部分:
爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义;
URL管理器:负责URL的管理,包括带爬取和已爬取的URL、已经提供相应的接口函数(类似增删改查的函数)
网页下载器:负责通过URL将网页进行下载,主要是进行相应的伪装处理模拟浏览器访问、下载网页
网页解析器:负责网页信息的解析,这里是解析方式视具体需求来确定
信息采集器:负责将解析后的信息进行存储、显示等处理
代码示例是爬取CSDN博主下的所有文章为例,文章仅作为笔记使用,理论知识rarely
一、URL管理器简介
URL管理器主要负责对爬虫的URL进行管理,它会将待爬取的URL和已经爬取的URL分别记录下来。
URL管理器如要对外提供添加、查询URL的功能。
核心框架如下:
''' 自定义Python伪代码 ''' # 1. 初始化待管理的URL # 2. 提供一系列操作URL的接口函数 # 例如: # 添加一个URL # 添加多个URl # 查询是否有未爬取的URL # 取出未爬取的URL # ...
二、URL管理器示例:(爬取CSDN博主下的所有文章)
# author : s260389826
# date : 2019/3/22
# position: chengdu
class UrlManager(object):
def __init__(self):
self.urls_article_new = set() #待爬取文章
self.urls_article_old = set() #已爬取文章
self.urls_page_new = set() #待爬取页
self.urls_page_old = set() #已爬取页
def add_article_url(self, url):
'''
一次添加一个文章的URL
'''
if url is None:
print("url_manager: add article url error")
return
if url not in self.urls_article_new and url not in self.urls_article_old:
self.urls_article_new.add(url)
def add_article_urls(self, urls):
'''
一次添加多个文章的URL
'''
if urls is None or len(urls) == 0:
print("url_manager: add article urls error")
return
for url in urls:
self.add_article_url(url)
def add_page_url(self, url):
'''
一次添加一个页的URL
'''
if url is None:
print("url_manager: add page url error")
return
if url not in self.urls_page_new and url not in self.urls_page_old:
self.urls_page_new.add(url)
def add_page_urls(self, urls):
'''
一次添加多个页的URL
'''
if urls is None or len(urls) == 0:
print("url_manager: add page urls error")
return
for url in urls:
self.add_page_url(url)
def has_page_url(self):
'''
查询是否有带爬取的页
'''
return len(self.urls_page_new) != 0
def get_page_url(self):
'''
取出带爬取的页
'''
page_url = self.urls_page_new.pop()
self.urls_page_old.add(page_url)
return page_url
三、上述代码用到的知识点:
1. URL管理器使用集合:
def __init__(self):
self.urls_article_new = set()
self.urls_article_old = set()
self.urls_page_new = set()
self.urls_page_old = set()
使用集合主要为了去除重复的URL,它可以自动的去除重复URL。非必须但是比较方便
2. 集合操作:
page_url = self.urls_page_new.pop()
self.urls_page_old.add(page_url)
pop(): 从集合中去掉一个元素
add(): 往集合中添加一个元素