Я пытаюсь очистить этот сайт под названием whoscored.com, и вот простой код, который я использую для очистки определенной страницы.
import requests
import pandas as pd
from bs4 import BeautifulSoup
headers = {'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/47.0.2526.106 Safari/537.36'}
page =
"https://www.whoscored.com/Teams/13/RefereeStatistics/England-Arsenal"
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'lxml')
print(pageSoup)
Код работает нормально, но вот что он возвращает:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<meta content = "text/html; charset=utf-8" http-equiv = "Content-Type"/>
<title>404 - File or directory not found.</title>
<style type = "text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-
serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-
family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-
top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id = "header"><h1>Server Error</h1></div>
<div id = "content">
<div class = "content-container"><fieldset>
<h2>404 - File or directory not found.</h2>
<h3>The resource you are looking for might have been removed, had its name
changed, or is temporarily unavailable.</h3>
</fieldset></div>
</div>
<script type = "text/javascript">
//<![CDATA[
(function() {
var _analytics_scr = document.createElement('script');
_analytics_scr.type = 'text/javascript'; _analytics_scr.async = true;
_analytics_scr.src = '/_Incapsula_Resource?
SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3&ns=1&cb=1578388490';
var _analytics_elem = document.getElementsByTagName('script')[0];
_analytics_elem.parentNode.insertBefore(_analytics_scr, _analytics_elem);
})();
// ]]>
</script></body>
</html>
Как видите, он возвращает 404 - file or directory not found
или The resource you are looking for might have been removed, had its name
changed, or is temporarily unavailable.
В конце есть еще одна куча ошибок, с которыми я не очень хорошо знаком.
У меня есть несколько идей, почему это может происходить. Может быть, есть JavaScript (я вижу это в конце) или это связано с какой-то контрмерой на веб-сайте. Тем не менее, я хотел бы точно знать, в чем проблема и что я могу сделать, чтобы решить эту проблему, и убедиться, что я получаю данные, которые я пытаюсь извлечь из страница, что, кстати, представляет собой всю таблицу. Немногое, что я получил от чтения подобных вопросов здесь, заключается в том, что мне нужно использовать Selenium, но я не уверен, как это сделать. Любая помощь будет оценена по достоинству.
Я на холостом ходу. Моя версия Python — 37 (64-разрядная), а мой компьютер — 64-разрядный.
фактический URL-адрес — whoscored.com/Teams/13/RefereeStatistics/Англия-Арсенал, но, похоже, меры по защите от ботов действуют, поэтому проверьте условия сайта в отношении парсинга.
Я отредактирую вопрос. Я, вероятно, сделал ошибку, копируя извинения URL. Тем не менее, это все еще создает ту же проблему
В коде у вас есть England/Arsenal
в URL, но это должно быть England-Arsenal
- см. /
и -
Но страница использует JavaScript, поэтому с помощью BeautifulSoup
вы не можете получить данные. Вам нужно будет использовать Selenium
для управления веб-браузером, который будет загружать страницу и запускать JavaScript. После рендеринга страницы вы можете получить HTML из браузера (используя Selenium) и использовать BeautifulSoup
для поиска ваших данных.
Получите таблицы с Selenium и BeautifulSoup
import selenium.webdriver
from bs4 import BeautifulSoup
url = "https://www.whoscored.com/Teams/13/RefereeStatistics/England-Arsenal"
driver = selenium.webdriver.Firefox()
#driver = selenium.webdriver.Chrome()
driver.get(url)
#print(driver.page_source) # HTML
soup = BeautifulSoup(driver.page_source, 'lxml')
all_tables = soup.find_all('table')
print('len(all_tables):', len(all_tables))
for table in all_tables:
print(table)
Не могли бы вы предложить какой-нибудь материал/ресурс для чтения, чтобы начать с Selenium?
Я всегда использую Google, чтобы найти решение какой-то проблемы. Вы можете начать с официальной документации для Селен с Питоном. Также есть Элементарный селен и один совет с этой страницы, остальные Советы в архиве
Я помещаю код, который использует Selenium + BeautifulSoup для получения таблиц на вашей странице.
Спасибо @furas. Я сам писал код, который мог бы помочь мне очищать другие таблицы. Я пройдусь по всем предложенным ссылкам.
У меня есть несколько вопросов/проблем. Во-первых, почему я не могу найти все значения таблицы из HTML страницы - используя печать (driver.page_source)? Это из-за разницы между динамическим и статическим контентом? Во-вторых, как распечатать только одну таблицу из all_tables
? Я использовал [:-2], но он печатает только имена столбцов. Кроме того, у меня возникли проблемы с сохранением полученного df в csv с помощью df.to_csv(). Код не показывает никаких ошибок, но я нигде не могу найти файл .csv на своем компьютере.
там три <table>
, поэтому у вас есть all_tables[0]
, all_tables[1]
и all_tables[2]
, но страница может использовать <table>
для отображения разных элементов, т.е. он может использовать его для отображения меню. Используйте полный путь в df.to_csv('/full/path/to/file.csv')
, и вы будете знать, где он должен быть.
используя print(driver.page_source)
, вы должны увидеть весь HTML - HTML, загруженный с сервера + HTML, созданный с помощью JavaScript. Но трудно найти что-то на экране, когда он отображает так много тегов HTML. driver.page_source
- это строка, поэтому вы можете попытаться найти что-то, используя функцию строки, т.е. driver.page_source.find("<table")
но с BeautifulSoup (или lxml, pyquery) проще что-то найти.
когда я открываю ваш URL-адрес из скрипта в веб-браузере, я также получаю ошибку 404, поэтому ваш URL-адрес неверен.