十三:爬虫-Scrapy框架(下)

一:各文件的使用回顾

1.items的使用

items 文件主要用于定义储存爬取到的数据的数据结构,方便在爬虫和 Item Pipeline 之间传递数据。

items.pyimport scrapyclass TencentItem(scrapy.Item):# define the fields for your item here like:title = scrapy.Field()position = scrapy.Field()date = scrapy.Field()

2.pipline的使用

(1)pipelines介绍

管道文件 pipelines.py 主要用来对抓取的数据进行处理:一般一个类即为一个管道,比如创建存入MySQLMangoDB 的管道类。管道文件中 process_item() 方法即为处理所抓数据的具体方法。

(2)pipelines常用方法
  1. process_item(self,item,spider):处理爬虫抓取的具体数据,在 process_item() 函数中 必须要 return item,因为存在多管道时,会把此函数的返回值继续交由下一个管道继续处理;
  2. open_spider():爬虫项目启动时只执行一次,一般用于数据库连接;
  3. close_spider():爬虫项目结束时只执行一次,一般用于收尾工作,如数据库的关闭。
(3)pipelines注意点
  1. pipeline对应的值越小优先级越高
  2. pipeline中的process_item方法的名字不能够修改为其他的名称

二:工作流程回顾

1.如何处理翻页

2.scrapy.Request知识点

scrapy.Request(url, callback=None, method='GET', headers=None, body=None,cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, flags=None)常用参数为:
callback:指定传入的URL交给那个解析函数去处理
meta:实现不同的解析函数中传递数据,meta默认会携带部分信息,比如下载延迟,请求深度
dont_filter:让scrapy的去重不会过滤当前URL,scrapy默认有URL去重功能,对需要重复请求的URL有重要用途

三:Scrapy下载中间件

下载中间件是scrapy提供用于用于在爬虫过程中可修改RequestResponse,用于扩展scrapy的功能
使用方法:

  • 编写一个Download Middlewares和我们编写一个pipeline一样,定义一个类,然后在settings中开启Download Middlewares默认方法
  • 处理请求,处理响应,对应两个方法:
process_request(self,request,spider):当每个request通过下载中间件时,该方法被调用process_response(self,request,response,spider):当下载器完成http请求,传递响应给引擎的时候调用

当每个Request对象经过下载中间件时会被调用,优先级越高的中间件,越先调用;该方法应该返回以下对象:None/Response对象/Request对象/抛出IgnoreRequest异常

  • 返回None:scrapy会继续执行其他中间件相应的方法;
  • 返回Response对象:scrapy不会再调用其他中间件的process_request方法,也不会去发起下载,而是直接返回该Response对象
  • 返回Request对象:scrapy不会再调用其他中间件的process_request()方法,而是将其放置调度器待调度下载
  • 如果这个方法抛出异常,则会调用process_exception方法

process_response(request,response,spider)
当每个Response经过下载中间件会被调用,优先级越高的中间件,越晚被调用,与process_request()相反;该方法返回以下对象:Response对象/Request对象/抛出IgnoreRequest异常。

  • 返回Response对象:scrapy会继续调用其他中间件的process_response方法;
  • 返回Request对象:停止中间器调用,将其放置到调度器待调度下载;
  • 抛出IgnoreRequest异常:Request.errback会被调用来处理函数,如果没有处理,它将会被忽略且不会写进日志。

1.中间件工作流程

下载中间件的工作原理如下:

  1. Scrapy 引擎收到需要下载的请求时,会将请求发送给下载中间件。
  2. 下载中间件接收到请求后,可以对请求进行修改,比如添加 headers、代理等。
  3. 修改后的请求被发送到目标服务器,目标服务器返回响应数据。
  4. 下载中间件接收到响应数据后,可以对响应进行修改,比如解密、解压缩、修改编码等。
  5. 修改后的响应被返回给 Scrapy 引擎,引擎会继续处理响应数据。

2.通过中间件设置随机UA

爬虫在频繁访问一个页面的时候,这个请求如果一直保持一致。那么很容易被服务器发现,从而禁止掉这个请求头的访问。因此我们要在访问这个页面之前随机的更改请求头,这样才可以避免爬虫被抓。随机更改请求头,可以在下载中间件实现。在请求发送给服务器之前,随机的选择一个请求头。这样就可以避免总使用一个请求头。

需求: 通过中间件设置随机UA
中间件核心介绍:
# 拦截所有的请求def process_request(self, request, spider):# request 是请求对象  spider指向的是当前爬虫对象# Called for each request that goes through the downloader# middleware.# Must either:# - return None: continue processing this request# 返回空 继续执行这个方法送往下载器 等合适的下载器进行处理# - or return a Response object# 返回的是一个响应对象 终止当前流程 直接将该响应通过引擎返回给爬虫# - or return a Request object# 返回的是一个请求对象 终止当前流程 将请求对象返回给调度器 大多数情况下是更换新的request请求# - or raise IgnoreRequest: process_exception() methods of# 抛出异常  异常会给process_exception()方法进行处理 如果没有一个异常处理该异常# 那么该请求就直接被忽略了 也不会记录错误日志#   installed downloader middleware will be calledreturn None# 自定义下载中间件
# 导入随机UA的库
import random
from fake_useragent import UserAgentclass UADownloaderMiddleware:def process_request(self, request, spider):ua = UserAgent()user_agent = ua.randomrequest.headers['User-Agent'] = user_agent注意: 在settings中开启当前中间件 
DOWNLOADER_MIDDLEWARES = {# 'mw.middlewares.MwDownloaderMiddleware': 543,'mw.middlewares.UADownloaderMiddleware': 543,
}爬虫程序.py
class UaSpider(scrapy.Spider):name = 'ua'allowed_domains = ['httpsbin.org']start_urls = ['https://httpbin.org/user-agent']def parse(self, response):print(response.text)# dont_filter=True scrapy会进行自动去重yield scrapy.Request(url=self.start_urls[0],callback=self.parse,dont_filter=True)

3.Scrapy下载图片

scrapy为下载item中包含的文件提供了一个可重用的item pipelines,这些pipeline有些共同的方法和结构,一般来说你会使用Images Pipeline

内置方式下载图片:

使用images pipeline下载文件步骤:

  • 定义好一个Item,然后在这个item中定义两个属性,分别为image_urls以及imagesimage_urls是用来存储需要下载的文件的url链接,需要给一个列表
  • 当文件下载完成后,会把文件下载的相关信息存储到itemimages属性中。如下载路径、下载的url和图片校验码等
  • 在配置文件settings.py中配置IMAGES_STORE,这个配置用来设置文件下载路径
  • 启动pipeline:在ITEM_PIPELINES中设置scrapy.pipelines.images.ImagesPipeline:1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/227515.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[mysql 基于C++实现数据库连接池 连接池的使用] 持续更新中

目背景 常见的MySQL、Oracle、SQLServer等数据库都是基于C/S架构设计的,即(客户端/服务器)架构,也就是说我们对数据库的操作相当于一个客户端,这个客户端使用既定的API把SQL语句通过网络发送给服务器端,MyS…

Animate 2024(Adobe an2024)

Animate 2024是一款由Adobe公司开发的动画和互动内容创作工具,是Flash的演进版本。Animate 2024为设计师和开发者提供了更丰富的功能,让他们能够创建各种类型的动画、交互式内容和多媒体应用程序。 Animate 2024具有以下特点: 强大的设计工…

一个静态网站可以增加什么第三方功能/服务

一个静态网站,无后台功能,怎么增加一些实用功能呢?我们来看看一些免费的第三方服务。 静态页面寄存 Gitee pages/Github pages 都可以,绑定一个域名,版本一提交,直接发布有效果。 评论 每个 URL 页面都…

华为hcia之ipv6实验手册

R3: dhcp enable ipv6 dhcpv6 pool test address prefix 2000:23::/64 excluded-address 2000:23::2 dns-server 2000:23::2 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address 2000:12::2/64 ipv6 address auto link-local undo ipv6 nd ra halt //无状态配置 inter…

SpringBoot用JDK1.8的依赖设置pom.xml

pom.xml的修改主要是两个地方: 1.修改springframework的版本为2.5.0,版本太高可能和其他插件搭配有冲突; 2.Java的版本修改成8,也就是对应JDK1.8。

uni-app API接口扩展组件(uni-ui)

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

云原生|kubernetes|kubernetes资源备份和集群迁移神器velero的部署和使用

前言: kubernetes集群需要灾备吗?kubernetes需要迁移吗? 答案肯定是需要的 那么,如何做kubernetes灾备和迁移呢?当然了,有很多的方法,例如,自己编写shell脚本,或者使用…

Geotrust的rapidssl证书产品

Geotrust成立于2001年,现在是Digicert旗下的SSL数字证书品牌,经营范围遍布全球,为众多用户提供网站数据加密和身份认证服务。RapidSSL是Geotrust旗下的子品牌证书,主要有两款入门级的SSL数字证书,今天就随SSL盾小编了解…

RM3100 stm32驱动(硬件i2c)

目录 RM3100接线HAL库I2C函数HAL_I2C_Mem_ReadHAL_I2C_Mem_WriteHAL_I2C_Master_Transmit / HAL_I2C_Master_Receive例子 HSHAKE寄存器 cubemx配置RM3100寄存器驱动最终效果 RM3100接线 原理图 SA0 SA1接地,此时i2c设备地址为0100000,即0x20 如果SA0接…

大创项目推荐 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 *…

springBoot2.3-基本介绍及入门案例

本次学习雷丰阳springBoot(2.3版本)。建议先修ssm 一、SpringBoot基本介绍 springBoot是当今最为流行的java开发框架。 1、springBoot的底层是spring, 因此继承了spring的粘合其他框架的能力。 2、本质上还是其他框架包括spring在工作 , springBoot起到一个整合其他…

uni-app page新建以及page外观配置

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

暗光增强——URetinex-Net网络推理测试

目录 一、URetinex-Net网络二、源码包三、测试3.1 修改参数3.2 测试结果 四、推理速度五、总结 一、URetinex-Net网络 URetinex-Net 设计了三个基于学习的模块,分别负责数据相关的初始化、高效的展开优化和用户指定的光照增强。由于 URetinex-Net 的推理速度非常快…

【温故而知新】vue运用之探讨下单页面应用(SPA)与多页面应用(MPA)

一、概念 1.单页面应用SPA(Single page application) Vue单页面应用是一种采用Vue.js框架开发的Web应用程序,它仅有一个HTML文件,通过前端路由实现页面的切换和渲染。与传统的多页面应用相比,Vue单页面应用在用户体验和开发效率方面有着明显的优势。 在Vue单页面应用中…

与擎创科技共建一体化“数智”运维体系,实现数字化转型

小窗滴滴小编获取最新版公司简介 前言: 哈喽大家好,最近分享的互联网IT热讯大家都挺喜欢,小编看着数据着实开心,感谢大家支持,小编会继续给大家推送。 新岁即将启封,我们一年一期的运维干货年末大讲也要…

Zookeeper-Zookeeper应用场景实战

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。 可供选择的Java客户端API有: ZooKeeper官方的Java客户端API。 第三方的Java客户端API,比如Curator。 ZooKeeper官方的客户端API提供了基本的操作…

OCP NVME SSD规范解读-4.NVMe IO命令-2

NVMe-IO-3: 由于设备具有掉电保护功能(如Power Loss Protection,PLP),因此在以下情况下,性能不应降低: FUA(Force Unit Access):是计算机存储设备中的一种命…

ubuntu22.04安装anacoda遇到的坑

这几天把用了3年的windows10换成了ubuntu22.04 各种环境都得配置,本文记录下遇到的坑。 1、anacoda在ubuntu上也可以用官方也提供了安装包,但是没有图形界面,需要以命令行的方式安装和运行配置 1.1 安装:官网下载后,…

List常见方法和遍历操作

List集合的特点 有序: 存和取的元素顺序一致有索引:可以通过索引操作元素可重复:存储的元素可以重复 List集合的特有方法 Collection的方法List都继承了List集合因为有索引,所以有了很多操作索引的方法 ublic static void main…

鸿蒙HarmonyOS-图表应用

简介 随着移动应用的不断发展,数据可视化成为提高用户体验和数据交流的重要手段之一。在HarmonyOS应用开发中,一个强大而灵活的图表库是实现这一目标的关键。而MPChart就是这样一款图表库,它为开发者提供了丰富的功能和灵活性,使得…