python.失败,OpenSSL失败,SSL,Scrapy中出现错误(版本1.0.4)

zzlelutf  于 2022-11-09  发布在  Python
关注(0)|答案(4)|浏览(324)

我正在处理一个数据抓取项目,我的代码使用了Scrapy(版本1.0.4)和Selenium(版本2.47.1)。

from scrapy import Spider
from scrapy.selector import Selector
from scrapy.http import Request
from scrapy.spiders import CrawlSpider
from selenium import webdriver

class TradesySpider(CrawlSpider):
    name = 'tradesy'
    start_urls = ['My Start url',]

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)
        while True:
           tradesy_urls = Selector(response).xpath('//div[@id="right-panel"]"]')
           data_urls = tradesy_urls.xpath('div[@class="item streamline"]/a/@href').extract()
           for link in data_urls:
               url = 'My base url'+link
               yield Request(url=url,callback=self.parse_data)
               time.sleep(10)
           try:
               data_path = self.driver.find_element_by_xpath('//*[@id="page-next"]')
           except:
               break
           data_path.click()
           time.sleep(10)

    def parse_data(self,response):
        'Scrapy Operations...'

当我执行我的代码时,我得到了一些URL的预期输出,但对于其他URL,我得到了以下错误。

2016-01-19 15:45:17 [scrapy] DEBUG: Retrying <GET MY_URL> (failed 1 times): [<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', 'SSL3_READ_BYTES', 'ssl handshake failure')]>]

请提供此查询的解决方案。

7vhp5slm

7vhp5slm1#

根据这个reported issue,您可以创建自己的ContextFactory来处理SSL。

上下文.py:

from OpenSSL import SSL
from scrapy.core.downloader.contextfactory import ScrapyClientContextFactory

class CustomContextFactory(ScrapyClientContextFactory):
    """
    Custom context factory that allows SSL negotiation.
    """

    def __init__(self):
        # Use SSLv23_METHOD so we can use protocol negotiation
        self.method = SSL.SSLv23_METHOD

设置.py

DOWNLOADER_CLIENTCONTEXTFACTORY = 'yourproject.context.CustomContextFactory'
iswrvxsc

iswrvxsc2#

使用Scrapy 1.5.0时,我遇到了此错误:

Error downloading: https://my.website.com>: [<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', 'tls12_check_peer_sigalg', 'wrong curve')]>]

最后的工作是更新我的Twisted版本(从17.9.0 -〉19.10.0)。我还更新了Scrapy到2.4.0,以及其他一些:

  • 密码学==2.2.2 -〉2.3
  • 参数==1.4.0 -〉1.5.0
  • 第17.5.0版-〉第19.0.0版
  • 1.24.3的平均值
wljmcqd8

wljmcqd83#

更新日期2022年7月27日
正如这里提到的,你可以在settings.py模块中将DOWNLOADER_CLIENT_TLS_METHOD设置为TLSv1.2。其他版本也可以尝试,只是尝试调整哪个版本有效。
只需在项目的www.example.com中将DOWNLOADER_CLIENT_TLS_METHOD属性设置为“TLSv1.2”settings.py即可。您无需再使用自定义上下文工厂来解决此问题。

ev7lccsx

ev7lccsx4#

eLRuLL答案的变体,不需要额外的文件。它“装饰”ScrapyClientContextFactory类的init方法。

from OpenSSL import SSL
from scrapy.core.downloader.contextfactory import ScrapyClientContextFactory

init = ScrapyClientContextFactory.__init__ 
def init2(self, *args,**kwargs):
  init(self, *args,**kwargs)
  self.method = SSL.SSLv23_METHOD
ScrapyClientContextFactory.__init__ = init2

相关问题