python爬虫如何使用调度器

760次阅读
没有评论

python爬虫如何使用调度器

我们一般使用爬虫看到的都是最后的数据结果,对于整个的获取过程没有过多了解过。对于初学python的小伙伴们来说,不光是代码的练习,还是原理的分析都是必不可少的。小编把整个爬取的过程分为了几个部分,从一开始的下载,到数据的去重解析,再到整个爬虫循环的结束,以图片和代码的双重形式展现给大家,希望能够对爬虫调度器有一个深刻的理解。

我们可以编写几个元件,每个元件完成一项功能,下图中的蓝底白字就是对这一流程的抽象:

python爬虫如何使用调度器

  • UrlManager:将存储和获取url以及url去重的几个步骤在url管理器中完成(当然也可以针对每一步分别编写相应的函数,但是这样更直观)。url管理器要有两个url仓库,一个存储未爬取的url,一个存储已爬取的url,除了仓库之外,还应该具有一些完成特定功能的函数,如存储url、url去重、从仓库中挑选并返回一个url等
  • HtmlDownloader:将下载网页内容的功能在HTML下载器中完成,下载器的功能较为单一,不多解释。但从整个爬虫的角度上来说,下载器是爬虫的核心,在实际操作的过程中,下载器要和目标网站的各种反爬虫手段斗智斗勇(各种表单、隐藏字段和假链接、验证码、IP限制等等),这也是最耗费大脑的步骤
  • HtmlParser:解析提取数据的功能在HTML解析器中完成,解析器内的函数应该分别具有返回数据和新url的功能
  • DAtaOutput:存储数据的功能由数据存储器完成
  • SpiderMan:主循环由爬虫调度器来完成,调度器为整个程序的入口,将其余四个元件有序执行

 

爬虫调度器将要完成整个循环,下面写出python下爬虫调度器的程序:

# coding: utf-8
new_urls = set()
data = {}
 
class SpiderMan(object):
    def __init__(self):
        #调度器内包含其它四个元件,在初始化调度器的时候也要建立四个元件对象的实例
        self.manager = UrlManager()
        self.downloader = HtmlDownloader()
        self.parser = HtmlParser()
        self.output = DataOutput()
 
    def spider(self, origin_url):
        #添加初始url
 
        self.manager.add_new_url(origin_url)
        #下面进入主循环,暂定爬取页面总数小于100
        num = 0
        while(self.manager.has_new_url() and self.manager.old_url_size()<100):
            try:
                num = num + 1
                print "正在处理第{}个链接".format(num)
                #从新url仓库中获取url
                new_url = self.manager.get_new_url()
                #调用html下载器下载页面
                html = self.downloader.download(new_url)
                #调用解析器解析页面,返回新的url和data
                try:
                    new_urls, data = self.parser.parser(new_url, html)
                except Exception, e:
                    print e
                for url in new_urls:
                    self.manager.add_new_url(url)
                #将已经爬取过的这个url添加至老url仓库中
                self.manager.add_old_url(new_url)
                #将返回的数据存储至文件
                try:
                    self.output.store_data(data)
                    print "store data succefully"
                except Exception, e:
                    print e
                print "第{}个链接已经抓取完成".format(self.manager.old_url_size())
 
            except Exception, e:
                print e
        #爬取循环结束的时候将存储的数据输出至文件
        self.output.output_html()

 

从整个循环的流程我们可以看出,由爬虫调度器指挥四个元件完成数据的抓取、筛选、保存流程,并以此为基础还可以进行新的循环。看懂原理之后,我们就可以使用以上的代码进行实战啦。

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:wuyou2021-05-21发表,共计2280字。
新手QQ群:570568346,欢迎进群讨论 Python51学习