@Corvus7

Перестал работать парсер, появляется requests.exceptions.ConnectTimeout, в чем может быть проблема?

Всем привет. Изучаю написание парсеров на python. Для практики начала писать парсер для сбора данных с главной страницы википедии https://ru.wikipedia.org/wiki/Заглавная_страница
Несколько дней парсер работал, но сегодня работать перестал, появляется такой ответ:
...
requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='ru.wikipedia.org', port=443): Max retries exceeded with url: /wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 (Caused by ConnectTimeoutError(, 'Connection to ru.wikipedia.org timed out. (connect timeout=None)'))

Скрин фрагмента:
Скриншот фрагмента кода удалён модератором.
В интернете внятного объяснения причин и решения найти не смог. Если здесь есть люди, сталкивавшиеся с такой проблемой, хотелось бы узнать, из за чего такое возникает и как можно исправить?

Код моего парсера:
from pydoc import classname
from unittest.main import main
import requests
from bs4 import BeautifulSoup


# Парсер главной страницы википедии
# https://ru.wikipedia.org/wiki/Заглавная_страница


# Отправка запроса для получения html кода главной страницы
def get_html(url):
    print('get_html start')
    resp = requests.get(url)
    return resp.text

# Поиск всех видимых на главной станице абзацев статей
def get_all_paragraphs(get_article_text):
    all_paragraphs_text = ''
    for p in get_article_text:
        all_paragraphs_text = all_paragraphs_text + '\n' + p.text
    return all_paragraphs_text

# Извлечения колличества статей из найденной строки
def get_number_of_aricles(line_with_number):
    return line_with_number.split(' ')[1]

# Создание экземпляра класса, содержащего данные из полученного html кода страницы, и поиск нужных элементов
def get_data(html):
    print('get_data start')
    soup_of_html = BeautifulSoup(html, 'lxml')
    
    selected_article = soup_of_html.find('div', id='main-tfa').find('div').text
    print(selected_article)
    selected_article_title = soup_of_html.find('div', id='main-tfa').find('h2').find('span', class_='mw-headline').find('a').text
    print(selected_article_title)
    get_selected_article_text = soup_of_html.find('div', id='main-tfa').find_all('p')
    print(get_all_paragraphs(get_selected_article_text))
    number_of_selected_articles = soup_of_html.find('div', id='main-tfa').find('span', class_='mw-ui-button mw-ui-quiet').text
    print(get_number_of_aricles(number_of_selected_articles))

    print('------------------------------')

    good_article = soup_of_html.find('div', id='main-tga').find('div').text 
    print(good_article)
    good_article_title = soup_of_html.find('div', id='main-tga').find('h2').find('span', class_='mw-headline').find('a').text
    print(good_article_title)
    get_good_article_text = soup_of_html.find('div', id='main-tga').find_all('p')
    print(get_all_paragraphs(get_good_article_text))
    number_of_good_articles = soup_of_html.find('div', id='main-tga').find('span', class_='mw-ui-button mw-ui-quiet').text
    print(get_number_of_aricles(number_of_good_articles))

    print('------------------------------')

    last_favorites_list_title = soup_of_html.find('div', id='main-tfl').find_all('span')[0].text
    print(last_favorites_list_title)
    last_favorites_list = soup_of_html.find('div', id='main-tfl').find_all('h2')[0].text.lstrip()
    print(last_favorites_list)
    previous_favorites_list_title = soup_of_html.find('div', id='main-tfl').find_all('span')[1].text
    print(previous_favorites_list_title)
    previous_favorites_list = soup_of_html.find('div', id='main-tfl').find_all('h2')[1].text.lstrip()
    print(previous_favorites_list)
    
    print('------------------------------')

    image_of_day_title = soup_of_html.find('div', id='main-potd').find('span', id='Изображение_дня').text
    print(image_of_day_title)
    image_of_day_alt = soup_of_html.find('div', id='main-potd').find('img').get('alt')
    print(image_of_day_alt)
    image_of_day_src = soup_of_html.find('div', id='main-potd').find('img').get('src')
    print(image_of_day_src)

    print('------------------------------')

    from_new_materials_title = soup_of_html.find('div', id='main-dyk').find('div').text
    print(from_new_materials_title)
    do_you_know_title = soup_of_html.find('div', id='main-dyk').find('span', id='Знаете_ли_вы?').text
    print(do_you_know_title)
    do_you_know_list = soup_of_html.find('div', id='main-dyk').find_all('ul') #[0].text
    
    all_list = ''
    for l in do_you_know_list:
        all_list = all_list + l.text + '\n'
    all_list = all_list.replace('Обсудить', '').replace('Предложения', '').replace('Архив', '').replace('Просмотр шаблона', '').rstrip()
    print(all_list)

    print('------------------------------')
    

    return selected_article

# Основная функция, отправляющая запрос и разбирающая полученные данные из html кода
def main():
    print('main start')
    url = 'https://ru.wikipedia.org/wiki/Заглавная_страница'
    get_data(get_html(url))


# Проверка значения __name__ при запуске исходного файла как основной программы и запуск функции main() в случае True
if __name__ == '__main__':
    main()
  • Вопрос задан
  • 242 просмотра
Пригласить эксперта
Ответы на вопрос 1
Скорее всего слишком часто делал запросы на страничку, и сервер тебя забанил.
Попробуй добавить в запрос headers и user_agent, если не поможет, тогда тебе нужны прокси.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы