scrapy处理python爬虫调度详解


Posted in Python onNovember 23, 2020

学习了简单的知识点,就会想要向有难度的问题挑战,这里必须要夸一夸小伙伴们。不过我们今天不需要做什么程序的测试,只用简单的两个代码对比,小伙伴们就能在其中体会两者的不同和难易程度。scrapy能否适合处理python爬虫调度的问题,小编直接说出答案小伙伴们也不能马上信服,下面就让我们在示例中找寻答案吧。

总的来说,需要使用代码来爬一些数据的大概分为两类人:

非程序员,需要爬一些数据来做毕业设计、市场调研等等,他们可能连 Python 都不是很熟;

程序员,需要设计大规模、分布式、高稳定性的爬虫系统,对他们来说,语言都无所谓的,更别说用不用框架了。

对于一个任何一个已经入门的程序员来说,Python 都算不上一个很复杂的语言,除了不用大括号可能让一些人感觉有些不适应之外,基本上看看语法上手就能写了。但是恰恰是因为我们都是老司机了,所以不能体会到使用一门编程语言对于外行来说可能『比登天还难』。如果不用 scrapy,可能我只需要这样:

import requests
def main():
  for i in range(100):
    rsp = requests.get(f"http://www.example.com/{i}.html")
    with open("example-{i}.txt", "w") as f:
      f.write(rsp.text)
if __name__ == "__main__":
  main()

就写好了一个简单的爬虫,而使用 scrapy 呢,大概需要这样吧:

import scrapy
class QuotesSpider(scrapy.Spider):
  name = 'quotes'
  def start_requests(self):
    urls = [
      'http://quotes.toscrape.com/page/1/',
      'http://quotes.toscrape.com/page/2/'
    ]
    for url in urls:
      yield scrapy.Request(url=url, callback=self.parse)
  def parse(self, response):
    page = response.url.split('/')[-2]
    filename = 'quotes-%s.html' % page
    with open(filename, 'wb') as f:
      f.write(response.body)
    self.log('Save file %s' % filename)

先不说代码增长了一倍有余,初学者会问到这些问题:什么是 class?为什么类还有参数?啊,什么是继承?yield 又是什么鬼,那个 scrapy.Request 又是啥?这些都是负担。

既然要开发大型爬虫系统,那么其中很重要的一部分就是爬虫的调度了。一种比较简单的模式是 scheduler 作为 master,全局调度。另一种模式没有 master,所有的爬虫 worker 都是对等的。在实际生产中显然是第一种用的更多。

显然 scheduler 这部分是不能再用一个爬虫框架来实现的,连主循环都没有咋写逻辑呢?我们可能还要实现增量爬取,或者消费业务方发来的爬取请求等各种业务,这块显然是在 scheduler 里面的,那么这个爬虫系统无非是 scheduler 分发任务给各个 worker 来抓取。worker 还可以使用 scrapy 实现,但是呢,这个 worker 其实已经弱化为一层薄薄的 downloader 了,那我要他干嘛呢?scrapy 的核心逻辑也不过是个深度或者广度优先的遍历而已,少一个依赖不好么……

爬虫的工作量要么在反爬,要么在调度等业务逻辑,本身只是一个 requests.get 而已,scrapy 提供的种种抽象对于初学者太复杂,大型系统又用不上,所以个人不推荐使用包括但不限于 scrapy 在内的所有爬虫框架。

内容扩展:

Scrapy模块

1、scheduler:用来存放url队列

2、downloader:发送请求

3、spiders:提取数据和url

4、itemPipeline:数据保存

from twisted.internet import reactor, defer
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
import time
import logging
from scrapy.utils.project import get_project_settings
 
 
#在控制台打印日志
configure_logging()
#CrawlerRunner获取settings.py里的设置信息
runner = CrawlerRunner(get_project_settings())
 
@defer.inlineCallbacks
def crawl():
 while True:
  logging.info("new cycle starting")
  yield runner.crawl("xxxxx")
  #1s跑一次
  time.sleep(1)
 reactor.stop()
 
crawl()
reactor.run()

到此这篇关于scrapy处理python爬虫调度详解的文章就介绍到这了,更多相关scrapy适合处理python爬虫调度吗内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中用max()方法求最大值的介绍
May 15 Python
python list排序的两种方法及实例讲解
Mar 20 Python
python logging日志模块的详解
Oct 29 Python
简单实现python收发邮件功能
Jan 05 Python
python解决字符串倒序输出的问题
Jun 25 Python
selenium+python环境配置教程详解
May 28 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
Cython编译python为so 代码加密示例
Dec 23 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
pycharm进入时每次都是insert模式的解决方式
Feb 05 Python
python scipy 稀疏矩阵的使用说明
May 26 Python
利用Python将多张图片合成视频的实现
Nov 23 #Python
Python系统公网私网流量监控实现流程
Nov 23 #Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 #Python
10个示例带你掌握python中的元组
Nov 23 #Python
详解anaconda安装步骤
Nov 23 #Python
Python可以用来做什么
Nov 23 #Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 #Python
You might like
利用PHP动态生成VRML网页
2006/10/09 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Python函数调用追踪实现代码
2020/11/27 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
介绍下Lucene建立索引的过程
2016/03/02 面试题
关键字throw与throws的用法差异
2016/11/22 面试题
项目建议书格式
2014/03/12 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
浅谈如何保证Mysql主从一致
2022/03/13 MySQL