Scrapy中间件(代理、Cookie、请求头、UA)

2024-04-09 21:04

本文主要是介绍Scrapy中间件(代理、Cookie、请求头、UA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Scrapy中间件(代理、Cookie、请求头、UA)

目录

  • Scrapy中间件(代理、Cookie、请求头、UA)
    • 爬虫中间件
      • from_crawler
      • process_spider_input
      • process_spider_output
      • process_spider_exception
      • process_start_requests
      • spider_opened
    • 下载中间件
    • 使用代理
    • 携带Cookie
    • 携带请求头
    • 携带UserAgent

爬虫中间件

爬虫和引擎之间的中间件

位于middlewares.py

class CppSpiderMiddleware:# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the spider middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return sdef process_spider_input(self, response, spider):# Called for each response that goes through the spider# middleware and into the spider.# Should return None or raise an exception.return Nonedef process_spider_output(self, response, result, spider):# Called with the results returned from the Spider, after# it has processed the response.# Must return an iterable of Request, or item objects.for i in result:yield idef process_spider_exception(self, response, exception, spider):# Called when a spider or process_spider_input() method# (from other spider middleware) raises an exception.# Should return either None or an iterable of Request or item objects.passdef process_start_requests(self, start_requests, spider):# Called with the start requests of the spider, and works# similarly to the process_spider_output() method, except# that it doesn’t have a response associated.# Must return only requests (not items).for r in start_requests:yield rdef spider_opened(self, spider):spider.logger.info("Spider opened: %s" % spider.name)

from_crawler

from_crawler会在创建爬虫实例时被调用,用于初始化中间件实例

class CppSpiderMiddleware:@classmethod
def from_crawler(cls, crawler):# 该方法是Scrapy用于创建爬虫实例的方法。# 首先创建了一个中间件实例 `s`s = cls()# 然后通过 `crawler.signals.connect` 方法连接了 `spider_opened` 信号和对应的处理方法。crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return s

process_spider_input

response响应返回spider时经过的中间件,可以对响应进行预处理或检查

def process_spider_input(self, response, spider):# 当响应从爬虫中间件进入爬虫时,调用该方法进行处理。# response: 是响应对象# spider: 是当前爬虫实例# 应该返回 `None` 或引发异常return None

process_spider_output

当spider处理完响应后被调用,主要用于对结果的二次处理(request、item)

必须返回一个可迭代的Request对象或item对象

def process_spider_output(self, response, result, spider):# 当爬虫处理完响应后,调用该方法对处理结果进行处理。# response 是爬虫处理后的响应对象# result 是爬虫的处理结果# spider 是当前爬虫实例# 必须返回一个可迭代的Request对象或item对象。for i in result:yield i

process_spider_exception

该方法一般在爬虫或者process_spider_input抛出异常时执行,一般用于对异常结果进行处理

def process_spider_exception(self, response, exception, spider):# 当爬虫中抛出异常时,调用该方法进行处理。# response 是发生异常的响应对象# exception 是抛出的异常对象# spider 是当前爬虫实例。# 应返回None或者一个可迭代的Request对象或item对象。pass

process_start_requests

在爬虫启动时被调用,用于对初始化请求进行处理

该方法必须返回可迭代的Request对象,不能是item对象

def process_start_requests(self, start_requests, spider):# 在爬虫启动时,对初始请求进行处理。# start_requests 是初始请求的列表# spider 是当前爬虫实例# Must return only requests (not items).for r in start_requests:yield r

spider_opened

该方法在爬虫被打开时调用,一般用于记录日志

def spider_opened(self, spider):spider.logger.info("Spider opened: %s" % spider.name)

在这行代码中,使用了Python的字符串格式化来构造日志信息,其中%s会被替换为spider.name的值,从而输出Spider opened: [spider_name]的日志信息

下载中间件

引擎和下载器之间的中间件

与爬虫中间件类似

class CppDownloaderMiddleware:# 不是所有的方法都需要定义。如果某个方法没有被定义,# Scrapy会认为这个下载中间件不会修改传递的对象.@classmethoddef from_crawler(cls, crawler):# Scrapy使用该方法创建您的爬虫s = cls()# 通过signals连接spider_opened信号和spider_opened方法crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return s# 拦截处理所有的请求对象# 参数:request就是拦截到的请求对象,spider爬虫文件中爬虫类实例化的对象# spider参数的作用可以实现爬虫类和中间类的数据交互def process_request(self, request, spider):# 返回None:继续处理本次请求,执行下一个中间件的process_request方法# 返回一个Response对象:执行当前中间件的process_response方法,重新回到引擎,被调度# 返回一个Request对象:直接返回给引擎,被调度。进入调度器等待下次被调用# 抛出IgnoreRequest异常:调用已安装的下载中间件的process_exception方法return None# 拦截处理所有的响应对象# 参数:response就是拦截到的响应对象,request就是被拦截到响应对象对应的唯一的一个请求对象def process_response(self, request, response, spider):# - 返回一个Response对象:继续执行,进入引擎,被调度到爬虫进行解析# - 返回一个Request对象:进入引擎,返回到调度器被重新调用# - 或者抛出IgnoreRequest异常:抛出异常return response# 拦截和处理发生异常的请求对象# 参数:reqeust就是拦截到的发生异常的请求对象# 方法存在的意义:将发生异常的请求拦截到,然后对其进行修正def process_exception(self, request, exception, spider):# 当下载处理程序或process_request()方法(来自其他下载中间件)引发异常时调用。# 必须返回以下之一:# - 返回None:继续处理该异常# - 返回一个Response对象:停止process_exception()链# - 返回一个Request对象:停止process_exception()链pass# 记录下载日志def spider_opened(self, spider):spider.logger.info("Spider opened: %s" % spider.name)

使用代理

在下载中间件中的process_request使用

def get_proxy(self):import requestsres = requests.get('http://127.0.0.1:5010/get/').json()if res.get('https'):return 'https://' + res.get('proxy')else:return 'http://' + res.get('proxy')def process_request(self, request, spider):request.meta['proxy'] = self.get_proxy()return None

如有第三方代理池需要自己定义

如果代理不能用,会触发process_exception,因此需要再里面补充

def process_exception(self, request, exception, spider):# 第二步:代理可能不能用,会触发process_exception,在里面写def process_exception(self, request, exception, spider):print('-----', request.url)  # 这个地址没有爬return request

携带Cookie

def process_request(self, request, spider):# 添加cookierequest.cookies['cookies'] = 'cookies'print(request.url+':请求对象拦截成功!')return None

携带请求头

def process_request(self, request, spider):request.headers['referer'] = 'http://www.lagou.com'return None

携带UserAgent

用fake_useragent模块生成随机的UA

# fake_useragent模块
from fake_useragent import UserAgent# 动态生成User-agent使用
def process_request(self, request, spider):request.headers['User-Agent']=str(UserAgent().random)print(request.url+':请求对象拦截成功!')return None

这篇关于Scrapy中间件(代理、Cookie、请求头、UA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889205

相关文章

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后