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 Socket编程详细介绍
Mar 23 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
对python-3-print重定向输出的几种方法总结
May 11 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
Python实现决策树C4.5算法的示例
May 30 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
python requests包的request()函数中的参数-params和data的区别介绍
May 05 Python
python openssl模块安装及用法
Dec 06 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
手把手教你实现PyTorch的MNIST数据集
Jun 28 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
用缓存实现静态页面的测试
2006/12/06 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
Using the TextRange Object
2006/10/14 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
线程和进程的区别及Python代码实例
2015/02/04 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python全栈知识点总结
2019/07/01 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
高中生自我评价个人范文
2013/11/09 职场文书
公司业务主管岗位职责
2013/12/07 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
成绩单评语
2015/01/04 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
护理心得体会范文
2016/01/22 职场文书
优秀新员工事迹材料
2019/05/13 职场文书