第十一章 Scrapy入门:多线程+异步

在这里插入图片描述

简介

Scrapy 框架

  1. Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架。
  2. 用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片。
    (提高请求效率)
  3. Scrapy 使用了Twisted(aiohttp)异步网络框架来处理网络通讯,可以加快下载速度,并且包含了各种中间件接口,可以灵活的完成各种需求。

安装

pip install --upgrade pip
建议首先更新pip 再安装下列依赖库 否则可能会遇到诸多错误:

pip install twisted
安装 twisted可能会遇到这样问题
building ‘twisted.test.raiser’ extension
error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools
意思是说缺少C++的一些编译工具

所以这里建议大家直接安装编译好的twisted的whl文件
对应资源下载网址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

下载twisted对应版本的whl文件,cp后面是python版本,amd64代表64位,运行命令:
pip install C:\Users\CR\Downloads\Twisted-17.5.0-cp36-cp36m-win_amd64.whl
(后边一部分是 whl文件的绝对路径)

lxml之前应该安装过 可以略过
pip install lxml

这个安装应该没问题
pip install pywin32

安装scrapy框架
pip install Scrapy

如果中途报错,有TimeOut的字眼,应该是网络问题,重复安装几次就行

当然最省事的还是直接替换安装源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名

知识

整体结构

在这里插入图片描述

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等

Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Scrapy默认是单线程执行爬取任务的,但可以使用Twisted框架的异步特性来实现多线程。下面是一种实现多线程的方法: 1. 创建一个Spider类,并继承scrapy.Spider。 2. 在Spider类中,添加一个start_requests方法,用于生成初始的请求。 3. 在start_requests方法中,使用yield关键字返回一个或多个Request对象。 4. 在Spider类中,添加一个parse方法,用于处理爬取到的响应。 5. 在parse方法中,解析响应的内容,并提取所需的数据。 6. 在parse方法中,可以使用yield关键字返回需要继续爬取的请求,实现爬取链接的自动跟进。 7. 在项目的settings.py文件中,设置CONCURRENT_REQUESTS参数为所需的线程数。 示例代码如下: ```python import scrapy from scrapy.crawler import CrawlerProcess class MySpider(scrapy.Spider): name = 'my_spider' def start_requests(self): urls = ['http://example.com/page1', 'http://example.com/page2', ...] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): # 解析响应并提取数据 data = response.xpath('//div[@class="data"]/text()').get() yield {'data': data} # 提取链接并继续爬取 next_page_url = response.xpath('//a[@class="next-page"]/@href').get() if next_page_url: yield scrapy.Request(url=next_page_url, callback=self.parse) process = CrawlerProcess(settings={ 'CONCURRENT_REQUESTS': 8, # 设置线程数 }) process.crawl(MySpider) process.start() ``` 在上述示例中,通过设置CONCURRENT_REQUESTS参数为8,实现了8个线程并发执行爬取任务。你可以根据实际需求调整线程数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值