Задать вопрос
@RG2

Как решить проблему ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]?

В общем, вот мой код. Раньше всё нормально работал.
import requests
import json
from bs4 import BeautifulSoup
import chardet
import xlsxwriter
import re
from datetime import date, timedelta
import urllib.request as urlrq
import certifi
import ssl

PAGES_COUNT = 80
OUT_FILENAME = 'out.json'

def get_soup(url, **kwargs):
    response = requests.get(url, **kwargs)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, features='html.parser')
    else:
        soup = None
    return soup


def crawl_products(pages_count):
    urls = []
    fmt = 'https://www.rfbr.ru/rffi/ru/contest?CONTEST_STATUS_ID=-1&CONTEST_TYPE=-1&CONTEST_YEAR=-1&page={page}'

    for page_n in range(1, 1 + pages_count):
        print('page: {}'.format(page_n))

        page_url = fmt.format(page=page_n)
        soup = get_soup(page_url)
        if soup is None:
            break

        for tag in soup.select('.tr .link'):
            href = tag.attrs['href']
            url = 'https://www.rfbr.ru/rffi/ru/contest{}'.format(href)
            urls.append(url)
    return urls


def parse_products(urls):
    data = []

    for url in urls:
        print('product: {}'.format(url))

        soup = get_soup(url)
        if soup is None:
            break

        for i in soup.find_all("h1"):
            name = i.text
        for j in soup.find_all("main", {"class":"template__main"}):
            for jj in j.find_all("div", {"class":"sfc l-3 mt-5 mb-10 lh-xl"}):
                ja = re.sub(r'[^\x00-\x7f]', r'', str(jj))
                jo = re.sub(r'\<[^>]*\>', '', str(ja))
                ji = re.sub(r'_', '', str(jo))
                ju = re.sub(r'  ', '', str(ji))
                je = re.sub(r' :', '', str(ju))
                jy = je[13:]
                amount = jy
        rponse = requests.get(url)
        sp = BeautifulSoup(rponse.text, "lxml")
        document ={}
        dcs = sp(attrs={"class": "list-in article"})
        for z in dcs:
            document[z.h2.text] = list(z.ol.stripped_strings)
            # document[z.h2.text] = tuple(z.ol.stripped_strings)

        # в одну строку с разделителем запятая
        for z in dcs:
            document[z.h2.text] = ', '.join(z.ol.stripped_strings)
        try:
            article = [l.get_text(strip=True) for l in soup.find("div", {"class":"article"}) if l.get_text(strip=True)]
            art = article[1]
        except:
            article = [l.get_text(strip=True) for l in soup.find("h1", {"class":"title"}) if l.get_text(strip=True)]
        for row in soup.select('td'):
            cols = row.select('td')
            cols = [c.text.strip() for c in cols]
        item = {
            'Название': name,
            'Статус': 'Заявки не принимаются',
            'Время окончания приема заявок': amount,
            'Полное описание условий конкурса': art
        }
        item['Документы'] = document
        data.append(item)

    return data


def dump_to_json(filename, data, **kwargs):
    kwargs.setdefault('ensure_ascii', False)
    kwargs.setdefault('indent', 1)

    with open(OUT_FILENAME, 'w') as f:
        json.dump(data, f, **kwargs)


def main():
    urls = crawl_products(PAGES_COUNT)
    data = parse_products(urls)
    dump_to_json(OUT_FILENAME, data)

    with open(OUT_FILENAME, 'w') as f:
        json.dump(data, f, ensure_ascii=False, indent=1)


if __name__ == '__main__':
    main()


Но в один прекрасный момент код стал выдавать вот такую ошибку.
Traceback (most recent call last):
  File "C:\Users\Руслан\AppData\Local\Programs\Python\Python311\Lib\site-packages\requests\adapters.py", line 489, in send
    resp = conn.urlopen(
  File "C:\Users\Руслан\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
    retries = retries.increment(
  File "C:\Users\Руслан\AppData\Local\Programs\Python\Python311\Lib\site-packages\urllib3\util\retry.py", line 592, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.rfbr.ru', port=443): Max retries exceeded with url: /rffi/ru/contest?CONTEST_STATUS_ID=-1&CONTEST_TYPE=-1&CONTEST_YEAR=-1&page=1 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:992)')))

Работало нормально, и тут такое. Как оказалось, всё дело в сертификате.

Как сделать так, чтобы ssl был выключен, и код спокойно работал? Помогите. Я пробовал всё. Не помогло.
  • Вопрос задан
  • 2339 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@AlexVWill
certificate has expired

Написано же в чем причина - закончился срок действия сертификата, нужно его перевыпустить.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@RG2 Автор вопроса
Я уже исправил. Добавил verify=False в каждом requests.get.
Теперь осталось только убрать предупреждения. Ибо они мешают.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы