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__':

 

posted @ 2019-03-23 11:36  叨陪鲤  阅读(44)  评论(0编辑  收藏  举报