Получение ошибки «Превышено максимальное количество попыток с URL», когда для запросов установлено значение 1 за 30 секунд (требуется целевым веб-сайтом robot.txt )

#python-3.x #beautifulsoup #python-requests

#python-3.x #beautifulsoup #python-запросы

Вопрос:

Я пытаюсь очистить www.eliteprospects.com , веб-сайт хоккейной статистики, на котором есть статистика игроков для юниоров (16-20). игроки. Когда я запускаю скрипт python, я получаю ошибки, для которых я не могу найти решение.

Я прочитал столько предыдущих вопросов Stackoverflow, связанных с «Превышено максимальное количество попыток с URL», и ни один из них, похоже, не соответствует моей конкретной проблеме. Веб-сайт, который я пытаюсь очистить, www.eliteprospects.com , имеет robot.txt страница с запросами, ограниченными 1 в 30 секунд. Я ввел в свой код строку sleep (30) после вызова requests.get (url) и все еще получаю ошибку.

Из предыдущих вопросов по stackoverflow многие из них связаны и иногда очень похожи на мою проблему, но когда я реализую любое из предлагаемых решений, я продолжаю получать эти же ошибки.

Я не уверен, что я делаю неправильно, это мой код? Это веб-сайт? Я запустил поисковый робот со слишком большим количеством запросов на ранней стадии и был забанен? Есть ли что-то в моих циклах for, что я не вижу, потому что я слишком долго смотрел на это? Я понятия не имею…. Пожалуйста, помогите.

Приветствия,

Ошибки, которые я получаю…

 Traceback (most recent call last):
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3connection.py", line 159, in _new_conn
    (self._dns_host, self.port), self.timeout, **extra_kw)
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3utilconnection.py", line 57, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "C:UsersTPCalAppDataLocalProgramsPythonPython37-32libsocket.py", line 748, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3connectionpool.py", line 354, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "C:UsersTPCalAppDataLocalProgramsPythonPython37-32libhttpclient.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:UsersTPCalAppDataLocalProgramsPythonPython37-32libhttpclient.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:UsersTPCalAppDataLocalProgramsPythonPython37-32libhttpclient.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:UsersTPCalAppDataLocalProgramsPythonPython37-32libhttpclient.py", line 1016, in _send_output
    self.send(msg)
  File "C:UsersTPCalAppDataLocalProgramsPythonPython37-32libhttpclient.py", line 956, in send
    self.connect()
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3connection.py", line 181, in connect
    conn = self._new_conn()
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3connection.py", line 168, in _new_conn
    self, "Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x0E241110>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesrequestsadapters.py", line 449, in send
    timeout=timeout
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesurllib3utilretry.py", line 398, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='www.elitepospects.com', port=80): Max retries exceeded with url: /league/whl/stats/2005-2006?sort=tpamp;page=1 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0E241110>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/Analytics/EliteProspects/EliteProspects.py", line 42, in <module>
    headers = headers)
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesrequestsapi.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesrequestsapi.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesrequestssessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesrequestssessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "D:AnalyticsEliteProspectsvenvlibsite-packagesrequestsadapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='www.elitepospects.com', port=80): Max retries exceeded with url: /league/whl/stats/2005-2006?sort=tpamp;page=1 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0E241110>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
  

Мой скрипт на Python…

 from requests import get
from bs4 import BeautifulSoup
from time import time
from time import sleep
from IPython.core.display import clear_output
from warnings import warn
import pandas as pd


leagues = ['whl', 'ohl', 'qmjhl']
leagues_url = [str(i) for i in leagues]
seasons = ['2005-2006', '2006-2007', '2007-2008', '2008-2009', '2009-2010',
           '2010-2011', '2011-2012', '2012-2013', '2013-2014', '2014-2015',
           '2016-2017', '2017-2018']
seasons_url = [str(i) for i in seasons]
pages = [str(i) for i in range(1, 5)]

players = []
games_played = []
goals = []
assists = []
penalty_minutes = []
plus_minus = []

start_time = time()
requests = 0

for league in leagues_url:
    for season in seasons_url:
        for page in pages:
            response = get('http://www.elitepospects.com/league/'
                             league
                             '/stats/'
                             season
                             '?sort=tpamp;page='
                             page)
            sleep(30)
            requests  = 1
            elapsed_time = time() - start_time
            print('Requests: {}; Frequency: {} requests/s'.format(requests, requests / elapsed_time))
            clear_output(wait=True)
            if response.status_code != 200:
                warn('Request: {}; Status code: {}'.format(requests, response.status_code))
            if requests > 180:
                warn('Number of requests was greater than expected.')
                break
            page_html = BeautifulSoup(response.text, 'html.parser')
            table = page_html.find('div', {'id': 'skater-stats'})
            table_rows = table.find_all('tr')
            for tr in table_rows:
                if tr.find('td', {'style': 'white-space: nowrap;'}) is not None:
                    player = tr.span.a.text
                    players.append(player)
                    gp = tr.find('td', {'class': 'gp'}).text
                    games_played.append(int(gp))
                    g = tr.find('td', {'class': 'g'})
                    goals.append(int(g))
                    a = tr.find('td', {'class': 'a'})
                    assists.append(a)
                    pim = tr.find('td', {'class': 'pim'})
                    penalty_minutes.append(int(pim))
                    pm = tr.find('td', {'class': 'pm'})
                    plus_minus.append(int(pm))

player_stats = pd.DataFrame({'player_name': players,
                             'gp': games_played,
                             'g': goals,
                             'a': assists,
                             'pim': penalty_minutes,
                             'plus_minus': plus_minus})

print(player_stats.info())
print(player_stats.describe())
print(player_stats.head(10))

player_stats.to_csv('CHL_player_stats.csv', index=False)
  

Комментарии:

1. Было бы целесообразно сначала изолировать проблему с тем, что вас забанили. Запустите свой код с помощью vpn. Cryptostorm — это бесплатный VPN, который я использовал. Или вы можете попробовать взять свой ноутбук в кафе бесплатно «vpn», используя их IP-адрес.

2. Если вы пытаетесь изолировать, если ваш IP запрещен, что произойдет, когда вы зайдете на сайт из веб-браузера?

3. @Ян-Фогельман… сайт отлично работает в моем браузере. Я проверил это, думая, что если это был мой IP, то он может работать не так, как обычно, но все работает как обычно.

Ответ №1:

Я думаю, что это проблема с неправильным написанием:

в вашем скрипте неправильно указан проспект

elitepospects -> eliteprospects

 from requests import get
from bs4 import BeautifulSoup
from time import time
from time import sleep
from IPython.core.display import clear_output
from warnings import warn
import pandas as pd


leagues = ['whl', 'ohl', 'qmjhl']
leagues_url = [str(i) for i in leagues]
seasons = ['2005-2006', '2006-2007', '2007-2008', '2008-2009', '2009-2010',
           '2010-2011', '2011-2012', '2012-2013', '2013-2014', '2014-2015',
           '2016-2017', '2017-2018']
seasons_url = [str(i) for i in seasons]
pages = [str(i) for i in range(1, 5)]

players = []
games_played = []
goals = []
assists = []
penalty_minutes = []
plus_minus = []

start_time = time()
requests = 0

for league in leagues_url:
    for season in seasons_url:
        for page in pages:
            print(page)
            print('https://www.elitepospects.com/league/'
                 str(league)
                 '/stats/'
                 str(season)
                 '?sort=tpamp;page='
                 str(page))

            response = get('https://www.eliteprospects.com/league/'
                 str(league)
                 '/stats/'
                 str(season)
                 '?sort=tpamp;page='
                 str(page))
            sleep(30)
            requests  = 1
            elapsed_time = time() - start_time
            print('Requests: {}; Frequency: {} requests/s'.format(requests, requests / elapsed_time))
            clear_output(wait=True)
            if response.status_code != 200:
                warn('Request: {}; Status code: {}'.format(requests, response.status_code))
            if requests > 180:
                warn('Number of requests was greater than expected.')
                break
            page_html = BeautifulSoup(response.text, 'html.parser')
            table = page_html.find('div', {'id': 'skater-stats'})
            table_rows = table.find_all('tr')
            for tr in table_rows:
                if tr.find('td', {'style': 'white-space: nowrap;'}) is not None:
                    player = tr.span.a.text
                    players.append(player)
                    gp = tr.find('td', {'class': 'gp'}).text
                    games_played.append(int(gp))
                    g = tr.find('td', {'class': 'g'})
                    goals.append(int(g))
                    a = tr.find('td', {'class': 'a'})
                    assists.append(a)
                    pim = tr.find('td', {'class': 'pim'})
                    penalty_minutes.append(int(pim))
                    pm = tr.find('td', {'class': 'pm'})
                    plus_minus.append(int(pm))

player_stats = pd.DataFrame({'player_name': players,
                             'gp': games_played,
                             'g': goals,
                             'a': assists,
                             'pim': penalty_minutes,
                             'plus_minus': plus_minus})

print(player_stats.info())
print(player_stats.describe())
print(player_stats.head(10))

player_stats.to_csv('CHL_player_stats.csv', index=False)
  

Редактировать :

Я думаю, вы обнаружите, что также существует проблема с поиском тега player, я также отключил открытый текст, чтобы лучше просматривать ведение журнала в записных книжках Jupyter.

 from requests import get
from bs4 import BeautifulSoup
from time import time
from time import sleep
#from IPython.core.display import clear_output
from warnings import warn
import pandas as pd
#from selenium import webdriver


leagues = ['whl', 'ohl', 'qmjhl']
leagues_url = [str(i) for i in leagues]
seasons = ['2005-2006', '2006-2007', '2007-2008', '2008-2009', '2009-2010',
           '2010-2011', '2011-2012', '2012-2013', '2013-2014', '2014-2015',
           '2016-2017', '2017-2018']
seasons_url = [str(i) for i in seasons]
pages = [str(i) for i in range(1, 5)]

players = []
games_played = []
goals = []
assists = []
penalty_minutes = []
plus_minus = []

start_time = time()
requests = 0

for league in leagues_url:
    for season in seasons_url:
        for page in pages:
            print(page)
            print('https://www.eliteprospects.com/league/'
                 str(league)
                 '/stats/'
                 str(season)
                 '?sort=tpamp;page='
                 str(page))



            response = get('https://www.eliteprospects.com/league/'
                 str(league)
                 '/stats/'
                 str(season)
                 '?sort=tpamp;page='
                 str(page))

            sleep(3)
            requests  = 1
            elapsed_time = time() - start_time
            print('Requests: {}; Frequency: {} requests/s'.format(requests, requests / elapsed_time))
            #clear_output(wait=True)
            if response.status_code != 200:
                warn('Request: {}; Status code: {}'.format(requests, response.status_code))
            if requests > 180:
                warn('Number of requests was greater than expected.')
                break
            page_html = BeautifulSoup(response.text, 'html.parser')
            table = page_html.find('div', {'id': 'skater-stats'})
            table_rows = table.find_all('tr')

            #for td in table.find_all('td',{'class': 'player'}):
            #    print(td.text)

            for tr in table_rows:
                if tr.find('td', {'style': 'white-space: nowrap;'}) is not None:
                    #print(tr.s)
                    try: 
                        #player = tr.span.a.text
                        #players.append(player)
                        player = tr.find('td', {'class': 'player'}).text
                        players.append(player)
                        print(player)
                        gp = tr.find('td', {'class': 'gp'}).text
                        games_played.append(str(gp))
                        g = tr.find('td', {'class': 'g'})
                        goals.append(str(g))
                        a = tr.find('td', {'class': 'a'})
                        assists.append(a)
                        pim = tr.find('td', {'class': 'pim'})
                        penalty_minutes.append(str(pim))
                        pm = tr.find('td', {'class': 'pm'})
                        plus_minus.append(str(pm))
                    except:
                        print('X')

player_stats = pd.DataFrame({'player_name': players,
                             'gp': games_played,
                             'g': goals,
                             'a': assists,
                             'pim': penalty_minutes,
                             'plus_minus': plus_minus})

print(player_stats.info())
print(player_stats.describe())
print(player_stats.head(10))

player_stats.to_csv('CHL_player_stats.csv', index=False)
  

Комментарии:

1. Вау … спасибо. Разве я не чувствую себя немного глупо прямо сейчас. Я действительно ценю ваше время, Ян, мучо грасиас.