scrapy处理python爬虫调度详解

作者:小妮浅浅 时间:2021-09-10 11:30:00 

学习了简单的知识点,就会想要向有难度的问题挑战,这里必须要夸一夸小伙伴们。不过我们今天不需要做什么程序的测试,只用简单的两个代码对比,小伙伴们就能在其中体会两者的不同和难易程度。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()

来源:https://www.py.cn/jishu/jichu/21137.html

标签:scrapy,python爬虫,调度
0
投稿

猜你喜欢

  • MySQL数据库的约束使用实例

    2024-01-17 04:36:57
  • 重温Javascript继承机制

    2011-07-04 12:17:23
  • python gensim使用word2vec词向量处理中文语料的方法

    2023-02-25 08:12:56
  • Python内置的HTTP协议服务器SimpleHTTPServer使用指南

    2021-11-22 08:11:12
  • Python全局变量与局部变量区别及用法分析

    2021-01-24 07:35:21
  • PHP session 会话处理函数

    2023-11-15 14:55:53
  • Django学习之文件上传与下载

    2023-09-24 18:42:23
  • http通过StreamingHttpResponse完成连续的数据传输长链接方式

    2023-06-04 03:33:45
  • Vue2.0/3.0双向数据绑定的实现原理详解

    2024-05-21 10:17:58
  • SQL LOADER错误小结

    2024-01-20 23:26:36
  • Python中对数据库的操作详解

    2024-01-19 18:26:54
  • Python中if语句的基本格式实例代码

    2023-12-02 14:31:20
  • Python图片批量自动抠图去背景的代码详解

    2022-11-30 17:20:39
  • 让文本框textarea自动适应内容的高度

    2008-07-01 14:44:00
  • python中asyncio异步编程学习

    2022-10-20 06:19:37
  • python3.x实现base64加密和解密

    2023-12-17 00:30:33
  • Python subprocess库的使用详解

    2021-10-25 04:59:32
  • OpenCV 之按位运算举例解析

    2023-04-15 02:07:57
  • 监控 url fragment变化的js代码

    2023-08-25 10:20:58
  • python简单分割文件的方法

    2021-08-09 10:32:33
  • asp之家 网络编程 m.aspxhome.com