URLLib с сертификатом сбоя квитирования оповещения SSLv3 - PullRequest
1 голос
/ 28 января 2020

Я использую Python 3.7.3 и библиотеку запросов_pkcs12, чтобы очистить веб-сайт, где я должен передать сертификат и пароль, а затем загрузить и извлечь zip-файлы по ссылкам на странице. У меня первая часть работает нормально. Но когда я пытаюсь прочитать файлы, используя urllib, я получаю сообщение об ошибке.

import urllib.request
from bs4 import BeautifulSoup
import requests
from requests_pkcs12 import get

# get page and setup BeautifulSoup
# r = requests.get(url) # old non-cert method
r = get(url, pkcs12_filename=certpath, pkcs12_password=certpwd)

# find zip files to download
soup = BeautifulSoup(r.content, "html.parser")

# Read files
i = 1
for td in soup.find_all(lambda tag: tag.name=='td' and tag.text.strip().endswith('DAILY.zip')):
    link = td.find_next('a')
    print(td.get_text(strip=True), link['href'] if link else '')  # good
    zipurl = 'https:\\my.downloadsite.com" + link['href'] if link else ''
    print (zipurl)  # good
    # Read zip file from URL    
    url = urllib.request.urlopen(zipurl)  # ERROR on this line SSLv3 alert handshake failure
    zippedData = url.read()

Я видел различные старые посты с Python 2.x о способах решения этой проблемы, но мне было интересно, что лучше способ сделать это сейчас, с новыми библиотеками в Python 3.7.x.

Ниже приведена трассировка стека ошибки.

Here is the stack of the error:

1 Ответ

0 голосов
/ 30 января 2020

Ответ состоял в том, чтобы не использовать urllib и вместо этого использовать ту же замену запросов, которая позволяет передавать ему pfx и пароль.

Последние 2 строки:

url = urllib.request.urlopen(zipurl)  # ERROR on this line SSLv3 alert handshake failure
zippedData = url.read()

следует заменить на:

url = get(zipurl, pkcs12_filename=certpath, pkcs12_password=certpwd)
zippedData = url.content
...