python爬虫调度器用法及实例代码


Posted in Python onNovember 30, 2020

我们一般使用爬虫看到的都是最后的数据结果,对于整个的获取过程没有过多了解过。对于初学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)
    #将返回的数据存储至文件
     self.output.store_data(data)
     print "store data succefully"
    print "第{}个链接已经抓取完成".format(self.manager.old_url_size())
   except Exception, e:
    print e
  #爬取循环结束的时候将存储的数据输出至文件
  self.output.output_html()

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

到此这篇关于python爬虫调度器用法及实例代码的文章就介绍到这了,更多相关python爬虫调度器是什么内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python在控制台输出进度条的方法
Jun 20 Python
在Python的Django框架中调用方法和处理无效变量
Jul 15 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
python实现分页效果
Oct 25 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
opencv python 图像去噪的实现方法
Aug 31 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
python区块及区块链的开发详解
Jul 03 Python
Python实现最大子序和的方法示例
Jul 05 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
python爬虫中url管理器去重操作实例
Nov 30 #Python
python爬虫中的url下载器用法详解
Nov 30 #Python
Python接口自动化测试框架运行原理及流程
Nov 30 #Python
Django数据模型中on_delete使用详解
Nov 30 #Python
Django数据统计功能count()的使用
Nov 30 #Python
Python常用断言函数实例汇总
Nov 30 #Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 #Python
You might like
信用卡效验程序
2006/10/09 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
jQuery弹框插件使用方法详解
2020/05/26 jQuery
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
python3.8 微信发送服务器监控报警消息代码实现
2019/11/05 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
在Python中实现字典反转案例
2020/12/05 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
html5实现滑块功能之type=&quot;range&quot;属性
2020/02/18 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
党支部2014年度工作总结
2014/12/04 职场文书
异地恋情人节寄语
2015/02/28 职场文书
义卖募捐活动总结
2015/05/09 职场文书
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js