Запросы Python.get не возвращают все элементы с веб-сайта

#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)