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解析中国天气网的天气数据
Mar 21 Python
在Python的Flask框架中使用模版的入门教程
Apr 20 Python
Python使用爬虫猜密码
Feb 19 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
python实现决策树分类算法
Dec 21 Python
学习python分支结构
May 17 Python
python版DDOS攻击脚本
Jun 12 Python
详解基于python-django框架的支付宝支付案例
Sep 23 Python
pygame库实现移动底座弹球小游戏
Apr 14 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
Python如何把字典写入到CSV文件的方法示例
Aug 23 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图像处理函数大全(推荐收藏)
2013/07/11 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
python计算书页码的统计数字问题实例
2014/09/26 Python
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
劳资人员岗位职责
2013/12/19 职场文书
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
七夕情人节促销方案
2014/06/07 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
hive数据仓库新增字段方法
2022/06/25 数据库