python3 爬虫五大模块之一:爬虫调度器
Python的爬虫框架主要可以分为以下五个部分:
爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义;
URL管理器:负责URL的管理,包括带爬取和已爬取的URL、已经提供相应的接口函数(类似增删改查的函数)
网页下载器:负责通过URL将网页进行下载,主要是进行相应的伪装处理模拟浏览器访问、下载网页
网页解析器:负责网页信息的解析,这里是解析方式视具体需求来确定
信息采集器:负责将解析后的信息进行存储、显示等处理
代码示例是爬取CSDN博主下的所有文章为例,文章仅作为笔记使用,理论知识rarely
一、爬虫调度器简介
爬虫调度器作为框架的核心组成部分和爬虫的入口,负责将各个模块进行统一管理和调度,类似于C语言里的main函数。
爬虫调度器核心框架:
''' 自定义Python伪代码: ''' # 1. 传入待爬取的网站URL链接 # 2. 将URL添加到URL管理器的待爬取url列表中 # 3. 执行爬行策略: while condition: #4. 将待爬取的URL从URL管理器中取出,并传递给网页下载器 #5. 将网页下载器下载的网页信息传递给网页解析器 #6. 将网页解析器解析后的新的URL信息添加到URL管理器 #7. 将网页解析器解析后的其他信息传递给采集器 # 8. 爬取完毕
二、爬虫调度器示例:(爬取CSDN博主下的所有文章)
# author : s260389826
# date : 2019/3/22
# position: chengdu
from cnsd import url_manager
from cnsd import html_downloader
from cnsd import html_parser
from cnsd import html_outputer
class SpiderMain:
def __init__(self): # 创建其余四个模块
self.urlManager = url_manager.UrlManager()
self.htmlDownloader = html_downloader.HtmlDownloader()
self.htmlParse = html_parser.HtmlParser()
self.htmlOutputer = html_outputer.HtmlOutputer()
# 根据博主名构建博主文章页的完整URL
def getAllUrl(self, usr_blog, page):
return "http://blog.csdn.net/" + usr_blog + "/article/list/" + str(page) + '?'
# 爬虫主函数
def crawl(self, usr_blog, total_pages):
if usr_blog is None or total_pages == 0:
print("spider_Main: initial url is None or total_pages is 0")
return
page = 1
seq = 0
root_url = self.getAllUrl(usr_blog, page) # 获取完整的URL
self.urlManager.add_page_url(root_url) # 添加到URL管理器
while self.urlManager.has_page_url():
page_url = self.urlManager.get_page_url() # 取出URL
html = self.htmlDownloader.downloader(page_url) # 下载网页
article_urls = self.htmlParse.parser(page# 解析网页_url, html) # 解析网页
for article_url in artic# 遍历文章的URLle_urls: # 遍历文章的URL
# print(article_url)
seq = seq + 1
html = self.htmlDownloader.downloader(article_url) # 下载文章
self.htmlOutputer.collect(usr_blog, seq, html) # 解析、存储文章
if page < total_pages: # 是否继续爬取下一页
page = page + 1
next_page_url = self.getAllUrl(usr_blog, page)
self.urlManager.add_page_url(next_page_url)
# print("-=-=-=-=-=-=-=-=-=-文章数量为:%d=-=-=-=-=-=-=-=-=-=-=-" % len(article_urls))
print("===================csdn spider over====================")
'''
该爬虫用来爬取CSDN博客博主的所有文章:
UserBlog : 博主账号名称
page_number : 博主博客下的页码数
'''
if __name__ == '__main__':
# print('Please input your CSDN blog\'name:')
# name = input()
# print('Please input your CSDN blog total pages:')
# page_number = input()
# base_url = 'http://blog.csdn.net/%s' % name
UserBlog = "yunsongice" #" http://blog.csdn.net/s2603898260"
page_number = int(16)
spider = SpiderMain()
spider.crawl(UserBlog, page_number)
三、上述代码用到的知识点:
1. 引用该packet下的其他类文件:
from cnsd import url_manager
from cnsd import html_downloader
from cnsd import html_parser
from cnsd import html_outputer
cnsd:在工程中创建的一个Python pagcket文件, 然后将其命名为“cnsd” (这是个手误操作):
创建后的目录为:
创建完packet目录后,依次创建了如上图所示的五个模块的python文件,引用的便是另外四个的文件名。
2. 通过构造器创建示例对象:
def __init__(self): # 创建其余四个模块
self.urlManager = url_manager.UrlManager()
self.htmlDownloader = html_downloader.HtmlDownloader()
self.htmlParse = html_parser.HtmlParser()
self.htmlOutputer = html_outputer.HtmlOutputer()
3. 标记主函数入口:
if __name__ == '__main__':