博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫|如何在scrapy请求异常之后再设置代理IP
阅读量:4129 次
发布时间:2019-05-25

本文共 1166 字,大约阅读时间需要 3 分钟。

我们都知道 scrapy 可以设置代理 IP,但是不知道大家有没有遇到这样一个场景:

常规的代理IP设置,会对每个请求都生效,也就是说每个请求都会去使用代理

但是有些请求根本不需要代理,我希望当我的请求出现错误或超时的时候再去设置代理IP

这样既节省了资源,又缩短了请求的时间,毕竟有些代理质量真的一言难尽

那么怎么才能让它请求超时的时候,再使用代理IP进行重新请求呢?

很容易就想到下载中间件,DowmloaderMiddleware

一个介于request, response中间的钩子,用于修改request和处理response

首先我们需要捕获超时等异常的请求,在下载中间件中添加如下代码:

from twisted.internet.error import TCPTimedOutError, TimeoutErrordef process_exception(self, request, exception, spider):        if isinstance(exception, TimeoutError):            self.process_request_back(request, spider)  # 连接超时才启用代理ip机制            return request                elif isinstance(exception, TCPTimedOutError):            self.process_request_back(request, spider)            return request

以上代码的作用就是捕获异常请求,同时调用设置代理IP的函数,并返回该请求

下面的设置IP的代码

def process_request_back(self, request, spider):        request.meta["proxy"] = xun.proxy        request.headers["Proxy-Authorization"] = xun.headers

注意不能使用 process_request() 方法, 如果代理添加在该方法下,就是常规的代理IP方法

同时对于 scrapy 出现 TimeoutError,TCPTimedOutError等异常的时候,还可以通过以下几种方案来解决:

主要通过设置文件来更改

1、降低同时请求的数量

CONCURRENT_REQUESTS = 5

2、 增加超时时间

DOWNLOAD_TIMEOUT = 300

3、 增加异常重试次数

RETRY_TIMES = 5

第四种就是开头所讲的,在请求超时后再添加代理IP

你学废了吗?

转载地址:http://skzvi.baihongyu.com/

你可能感兴趣的文章
openstack虚拟机创建流程
查看>>
Android中AsyncTask的简单用法
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
fastcgi_param 详解
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
Objective-C 基础入门(一)
查看>>
Flutter Boost的router管理
查看>>
iOS开发支付集成之微信支付
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Node.js-模块和包
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>