Selenium с безголовым хромированным драйвером не может очищать веб-данные?

Я написал простую программу для очистки данных с https://stats.nba.com. Мой код здесь работает абсолютно нормально, так как он может отлично получать данные с веб-сайта:

chrome_options = webdriver.ChromeOptions()
d = webdriver.Chrome(ChromeDriverManager().install(),options=chrome_options)
d.get('https://stats.nba.com/teams/advanced/?sort=W&dir=-1')
scrape = BeautifulSoup(d.page_source, 'html.parser').find('table')

for row in scrape.find_all('tr'):
    for col in row.find_all('td'):
    #...more parsing code here

Однако, как только я добавляю chrome_options.add_argument('--headless'), весь код выходит из строя, и я получаю AttributeError: 'NoneType' object has no attribute 'find_all'.

Почему это происходит? Я везде искал и не нашел решения. Спасибо!

Изменить: проблемы, похоже, в том, что d.page_source дает разные результаты для безголовых и безголовых. Кто-нибудь знает, почему есть несоответствие?


person blueblast    schedule 01.07.2020    source источник
comment
Похоже, вам следует проверить содержимое d.page_source и понять, в чем проблема.   -  person Chris    schedule 01.07.2020
comment
@Chris Я только что проверил, и, как ни странно, безголовый вывод d.page_source не имеет нужной мне таблицы; однако вывод d.page_source без заголовка содержит таблицу. Почему может существовать это несоответствие?   -  person blueblast    schedule 02.07.2020
comment
Если нет рекапчи или чего-то подобного, возможно, страница отображается по-разному для разных окон просмотра.   -  person borisdonchev    schedule 02.07.2020
comment
@borisdonchev Как мне это обойти?   -  person blueblast    schedule 02.07.2020
comment
Попробуйте добавить что-нибудь, чтобы изменить это, например: chrome_options.add_argument("--start-maximized")   -  person borisdonchev    schedule 02.07.2020
comment
@borisdonchev Уже пробовал, не повезло. Я думаю, что мне, возможно, придется использовать другой веб-драйвер или, может быть, даже другой веб-сайт для данных.   -  person blueblast    schedule 02.07.2020


Ответы (1)


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

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

поэтому попробуйте добавить это в свой код:

# ...
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
chrome_options.add_argument(f'user-agent={user_agent}')
# ... 

Вот результат, который я получаю от этого:

scrape = BeautifulSoup(d.page_source, 'html.parser').find('table')
for row in scrape.find_all('tr'):
    print(row)
# <tr>
# <th></th>
# <th cf="" class="text" data-field="TEAM_NAME" ripple="" sort=""><br/>TEAM</th>
# <th cf="" data-dir="-1" data-field="GP" data-rank="" ripple="" sort="">GP</th>
# <th cf="" class="sorted asc" data-dir="-1" data-field="W" data-rank="" ripple="" sort="">W</th>
# <th cf="" data-dir="-1" data-field="L" data-rank="" ripple="" sort="">L</th>
person borisdonchev    schedule 01.07.2020
comment
Можете ли вы сохранить HTML-содержимое страницы и проверить его? Есть вероятность, что получаемый вами контент выглядит не так, как вы ожидаете. - person borisdonchev; 02.07.2020
comment
Да, когда я бегаю без головы, выходные данные HTML по какой-то причине отличаются. я не понимаю почему - person blueblast; 02.07.2020
comment
@blueblast Отредактировал ответ. Вы можете проверить, работает ли сейчас (: - person borisdonchev; 02.07.2020