#python #html #web-scraping #beautifulsoup #python-requests
Вопрос:
Я пытаюсь получить расписание игроков с этого веб-сайта, но когда я использую requests.get, он ничего не возвращает.
r = requests.get("http://www.fplstatistics.co.uk/")
soup = BeautifulSoup(compiled.sub("",r.text),'lxml')
allFixtures = soup.find("span", {"class": "dtr-data"})
return allFixtures
Комментарии:
1. Я не вижу класса
dtr-data
на веб-сайте.2. там написано <span class=»dtr-данные»>Лестер(H) Бернли(A) Норвич(H) Ньюкасл(A) <span class=»dtr-данные»></span>
3. 1. Я нашел тег, используя предоставленный вами текст, но в нем нет класса . 2. Какие именно данные вам нужны? всю таблицу или только Имена?
4. Только названия светильников. Я хочу, чтобы он вернулся «Лестер(H) Бернли(A) Норвич(H) Ньюкасл(A)»
5. Я нахожу, что сайт отображается динамически и может потребовать
selenium
конечных точек или api.
Ответ №1:
Необходимая вам информация не содержится в HTML, возвращенном с вашего URL-адреса. Браузер создает еще один вызов, чтобы получить это с помощью javascript (который запросы не поддерживают).
Наблюдая с помощью инструментов разработчика вашего браузера, вы можете увидеть, как выполняется запрос на получение данных, возвращаемых в формате JSON.
URL-адрес, который он использует для получения этого, к сожалению, нуждается в некоторой информации, которая скрыта в одном из разделов скрипта внутри HTML. Необходимые ключ и значение используются в шестнадцатеричном формате (если вы поищете в HTML, вы найдете его).
Регулярное выражение может быть использовано для извлечения ключа и значения, необходимых для выполнения вызова. При этом можно выполнить второй вызов запроса, чтобы получить JSON (так же, как это сделал бы браузер). Я предлагаю вам распечатать это, чтобы вы могли видеть структуру всей возвращаемой информации.
Должно сработать следующее:
import requests
import re
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"}
s = requests.Session()
req_main = s.get("http://www.fplstatistics.co.uk/", headers=headers)
k = re.search(r'"\x6E\x61\x6D\x65":"(.*?)"', req_main.text).group(1)
v = re.search(r'"\x76\x61\x6C\x75\x65":(.*?)}', req_main.text).group(1)
url_json = f"http://www.fplstatistics.co.uk/Home/AjaxPricesIHandler?{k}={v}amp;pyseltype=0"
req_json = s.get(url_json, headers=headers)
fixtures = [fixture[-1] for fixture in req_json.json()["aaData"]]
for fixture in fixtures:
print(fixture)
Давая вам начало вывода:
Aston Villa(H) Leicester(A) Watford(H) Liverpool(A)
Aston Villa(H) Leicester(A) Watford(H) Liverpool(A)
Aston Villa(H) Leicester(A) Watford(H) Liverpool(A)