scrapy出现SSL问题 如何解决? <twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe...

问题:<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renegotiation disabled')]>

自从升级了python3.10 有些维护的网站就爬取不了了
报错如上
经分析 可知问题有2

1. 没有添加请求头

只需要添加请求头即可

2. 版本问题

需要查看自己两个库的版本pyOpenSSLcryptography

这两个库的版本必须完美卡在一个版本区间
比如 PyOpenSSL如果在21.0.0 以上 即失败
cryptography,如果安装最新也会失败

执行一下命令

pip install cryptography==3.4.8
pip install pyOpenSSL==21.0.0

然后重新执行我们的代码

完美执行。

在使用 `Twisted` 库结合 `Scrapy` 框架进行爬虫开发时,尤其是涉及到自定义 `Item Pipeline`(如 `TupianDownloadPipeline`)时,可能会遇到 `TypeError` 提示 `file_path()` 方法接收到一个意外的参数 `'item'`。这种错误通常与方法定义和调用时的参数不匹配有关。 在 Scrapy 中,`FilePipeline` 或 `ImagePipeline` 的子类(如 `TupianDownloadPipeline`)需要实现 `file_path` 方法,该方法用于定义下载文件的存储路径。Scrapy 在调用 `file_path()` 方法时会传入多个参数,包括 `request`、`response`、`info` 以及 `item`(如果有的话)。如果 `file_path()` 方法没有正确声明接受 `item` 参数,则会引发 `TypeError`。 以下是一个修复后的 `file_path()` 方法示例: ```python from scrapy.pipelines.files import FilesPipeline class TupianDownloadPipeline(FilesPipeline): def file_path(self, request, response=None, info=None, item=None): # 根据 item 或 request 定义文件路径 if item: return f"files/{item['name']}.jpg" return 'files/default.jpg' ``` 在上述代码中,`file_path()` 方法明确声明接受 `item` 参数,并在构造文件路径时使用了 `item['name']`。这样可以避免因未声明参数而导致的 `TypeError` [^2]。 此外,确保 `TupianDownloadPipeline` 正确注册在 `settings.py` 中: ```python ITEM_PIPELINES = { 'myproject.pipelines.TupianDownloadPipeline': 1, } ``` 如果仍然遇到问题,建议检查 Scrapy 和 Twisted 的版本是否兼容。某些版本的 Scrapy 可能会在调用 `file_path()` 时传递额外的参数,而旧版本的 `FilesPipeline` 实现可能未对此进行适配。可以尝试升级 Scrapy 和相关依赖库: ```bash pip install --upgrade scrapy twisted ``` 若用户使用了自定义的 `Request` 或 `Pipeline` 实现,需确保所有参数传递逻辑一致,尤其是在异步环境下使用 `Twisted` 的 `reactor` 时,模块加载顺序和参数传递机制可能会影响运行时行为 [^3]。 ### 总结 - `file_path()` 方法需要显式声明接收 `item` 参数。 - 确保 Scrapy 和 Twisted 的版本兼容。 - 检查 `Pipeline` 是否正确注册并在项目中启用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值