在scrapy源码中添加功能,对HTTP响应状态码493的url进行保存

在Scrapy爬虫项目中遇到HTTP 493状态码的问题,这通常是由于IP代理导致的目标网站阻止访问。虽然关闭代理可以解决,但在需要代理的场景下,决定保存所有遇到493状态码的URL。通过深入研究scrapy源代码,特别是`scrapy.spidermiddlewares.httperror`文件,找到了处理HTTP错误的地方,并添加代码捕获并保存493状态码响应的URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在scrapy爬虫过程中,遇到了这样一个问题:

[scrapy.spidermiddlewares.httperror] INFO: Ignoring response <493> HTTP status code is not handled or not allowed

我们翻译一下(百度翻译):

忽略响应< 493 >不处理或不允许HTTP状态代码

经测试,该问题是源于IP代理的设置引起,目标网站可能有阻止代理IP访问的机制,只要关闭IP代理就能得到正确的响应(200)

但是在项目中又不得不使用IP代理,原因很多,例如有一些网站由于网络环境因素,直接爬取速度过慢,使用代理提高爬取速度等

于是只好把出现该问题的url全都保存下来

但是目标网址拒绝访问,连response都没有,怎么保存呢?

这时就需要研究scrapy源代码

经过一下午的奋斗,终于找到了框架内部根据HTTP错误打印响应码的位置,是在scrapy.spidermiddlewares.httperror文件中

下面是进入该文件的方法

 

然后我们添加代码,只要是出现493的response,都把它的url取下来:

添加的代码:

# 记得在开头import os
# 将错误码为493的url保存到指定目录
if response.status == 493:
    httperror493_path = u'../data/httperror493/'
    if not os.path.isdir(httperror493_path):
        os.makedirs(httperror493_path)
    f = open(httperror493_path + 'httperror493_url.txt', 'a', encoding='utf-8')
    f.write(response.url + '\n')

 

在处理网络爬虫时,确保URL的正确编码与解码是实现有效抓取的关键环节。对于这个问题,推荐您参考《Python爬虫入门:Scrapy框架详解与urllib库深度解析》,其中详细解释了如何利用Scrapy框架和urllib库来处理网页数据的抓取和特殊字符的编码解码问题。 参考资源链接:[Python爬虫入门:Scrapy框架详解与urllib库深度解析](https://wenku.youkuaiyun.com/doc/63subpsa8w?spm=1055.2569.3001.10343) 首先,使用Scrapy框架时,框架内置的URL处理机制会自动对特殊字符进行编码。然而,当你使用urllib库时,需要手动处理。编码通常发生在构建URL时,而解码则发生在处理响应内容时。例如,当你需要对中文等非ASCII字符进行编码时,可以使用urllib.parse模块中的quote函数,示例如下: ```python from urllib.parse import quote # 假设需要编码的URL含有中文字符 original_url = '***商品详情' encoded_url = quote(original_url, encoding='utf-8') print(encoded_url) # 输出编码后的URL,如 '***' ``` 相反地,在获取到HTTPResponse后,如果响应内容是二进制形式,可以使用decode方法将二进制数据解码为字符串,以正确处理中文等字符: ```python response = urllib.request.urlopen(encoded_url) binary_data = response.read() text_data = binary_data.decode('utf-8') print(text_data) # 输出解码后的网页源码 ``` 在使用urllib.request构造请求对象时,如果需要设置自定义的User-Agent或其他头部信息,可以像这样: ```python headers = {'User-Agent': 'Mozilla/5.0'} request = urllib.request.Request(url=encoded_url, headers=headers) response = urllib.request.urlopen(request) ``` 此外,当响应中包含重定向时,geturl()方法可以获取实际访问的URL,而getcode()可以获取HTTP状态码。通过这些方法,你可以进一步定制你的请求,如处理重定向或检查请求是否成功。 综上所述,处理URL编码与解码是确保数据抓取正确性的基础。通过上述方法,你可以有效地利用Scrapy框架和urllib库进行网页数据的抓取,并确保对特殊字符进行正确的编码与解码。为了进一步深化理解,建议继续阅读《Python爬虫入门:Scrapy框架详解与urllib库深度解析》,以获取更多实用示例和高级技巧。 参考资源链接:[Python爬虫入门:Scrapy框架详解与urllib库深度解析](https://wenku.youkuaiyun.com/doc/63subpsa8w?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值