scrapy处理python爬虫调度详解

 更新时间:2020年11月23日 14:07:55   作者:小妮浅浅  
在本篇文章里小编给大家整理的是一篇关于scrapy处理python爬虫调度的相关内容,有兴趣的朋友们学习下。

学习了简单的知识点,就会想要向有难度的问题挑战,这里必须要夸一夸小伙伴们。不过我们今天不需要做什么程序的测试,只用简单的两个代码对比,小伙伴们就能在其中体会两者的不同和难易程度。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爬虫调度吗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 60行Python PyGame代码实现简单的迷宫游戏

    60行Python PyGame代码实现简单的迷宫游戏

    这篇文章主要为大家详细介绍如何通过了60行Python PyGame代码实现一个简单的迷宫游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2023-12-12
  • Python-ElasticSearch搜索查询的讲解

    Python-ElasticSearch搜索查询的讲解

    今天小编就为大家分享一篇关于Python-ElasticSearch搜索查询的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • python3 实现函数写文件路径的正确方法

    python3 实现函数写文件路径的正确方法

    今天小编就为大家分享一篇python3 实现函数写文件路径的正确方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程

    在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程

    这篇文章主要介绍了在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python用for循环实现九九乘法表

    Python用for循环实现九九乘法表

    本文通过实例代码给大家介绍了Python用for循环实现九九乘法表的方法,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • Empty test suite.(PyCharm程序运行错误的解决方法)

    Empty test suite.(PyCharm程序运行错误的解决方法)

    今天小编就为大家分享一篇Empty test suite.(PyCharm程序运行错误的解决方法),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python列表嵌套引发的问题总结

    python列表嵌套引发的问题总结

    这篇文章主要介绍了python列表嵌套引发的问题总结,下面问文章引发问题来自日常工作总结,具有一定的参考价值需要的小伙伴可以参考一下
    2022-05-05
  • python with statement 进行文件操作指南

    python with statement 进行文件操作指南

    在Python中,with关键字是一个替你管理实现上下文协议对象的好东西。例如:file等。在file的结束,会自动关闭该文件句柄。而这正是本文所需要的
    2014-08-08
  • Python实现用户登录注册

    Python实现用户登录注册

    这篇文章主要为大家详细介绍了Python实现用户登录注册,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Python使用MapReduce编程模型统计销量

    Python使用MapReduce编程模型统计销量

    MapReduce是面向大数据并行处理的计算模型、框架和平台,是一种计算引擎,可以把我们对大批量数据的计算通过抽象成map与reduce两个子任务进行计算从而更快的得到想要的结果
    2022-04-04

最新评论