Модуль запросов Python не получает последние данные с веб-сервера - PullRequest
0 голосов
/ 26 января 2019

В приведенном ниже фрагменте кода видно, что я пытаюсь собрать некоторые данные с веб-сайта NCAA Men's Basketball для мужчин.

import requests

url = "https://www.ncaa.com/scoreboard/basketball-men/d1/"

response = requests.get(url)
html = response.text

print(html)
print(response.headers)
print("\n\n")
print(response.request.headers)

На сайте есть список игр и их результаты.Я выяснил, как получить все необходимые данные, используя Python Requests для HTTP-запроса, а затем BeautifulSoup для извлечения данных из HTML. Полный скребок здесь, если вы хотите взглянуть.

Проблема: Когда Requests получает ответ от веб-сайта NCAA, данные оченьстарше (иногда до 30 или 40 минут, по крайней мере), чем данные на реальном веб-сайте.

Я гуглял это часами.После прочтения документов Python Requests я полагаю, что обнаружил, что веб-сервер NCAA отправляет устаревшие данные.Но я не понимаю, почему она отправляет мои программы устаревшие данные, когда отправляет в Google Chrome (или любой другой веб-браузер) правильные данные.

Причина, по которой я считаю, что сервер отправляет устаревшие данные, заключается в том, что при печатизаголовки ответа, один из элементов: «Последнее изменение»: «Сб, 26 января 2019 17:49:13 GMT» , а другой - «Дата»: «Сб, 26 января 201918:20:29 GMT ', похоже, сервер получает запрос в нужное время, но предоставляет данные, которые не были изменены в течение некоторого времени.

Мой вопрос: Знаешь ли ты причину, по которой это может произойти?Есть ли что-то, что мне нужно добавить в мой HTTP-запрос, чтобы сервер отправлял мне данные в соответствии с тем, что отправляет веб-браузеры?

PS Мне очень жаль за длинный вопрос.Я старался быть кратким, но все же объяснять все ясно.

Ответы [ 3 ]

0 голосов
/ 26 января 2019

перед вашим requests.get(), попробуйте добавить заголовок:

import requests

url = "https://www.ncaa.com/scoreboard/basketball-men/d1/"

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}   


response = requests.get(url, headers = headers)
html = response.text

Мое другое предложение будет использовать:

url = 'https://data.ncaa.com/casablanca/scoreboard/basketball-men/d1/2019/01/26/scoreboard.json'

и использовать пакет json, чтобы прочитать его.Все живое и готово для вас в хорошем формате JSON

Код

import json
import requests

url = 'https://data.ncaa.com/casablanca/scoreboard/basketball-men/d1/2019/01/26/scoreboard.json'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}    

response = requests.get(url, headers = headers)

jsonStr = response.text

jsonObj = json.loads(jsonStr)

Я проверил, и объект JSON действительно возвращает результаты / данные.И все, что вам нужно сделать, это изменить дату в URL 2019/01/26, чтобы получить данные о последних датах завершения игр.


РЕДАКТИРОВАТЬ - ДОПОЛНИТЕЛЬНО

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

from pandas.io.json import json_normalize
import json
import requests

url = 'https://data.ncaa.com/casablanca/scoreboard/basketball-men/d1/2019/01/27/scoreboard.json'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}    

# Thanks to InfectedDrake wisdom, the following 3 lines that I previously had can be replaced by a single line. See below
#response = requests.get(url, headers = headers)
#jsonStr = response.text
#jsonObj = json.loads(jsonStr)

jsonObj = requests.get(url, headers = headers).json()

result = json_normalize(jsonObj['games'])
0 голосов
/ 28 января 2019

Как указано в приведенных выше ответах, вам нужно установить легитимного агента пользователя.Поэтому добавьте заголовки, чтобы эмулировать браузер:

# This is a standard user-agent of Chrome browser running on Windows 10 
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' }

Кроме того, вы можете добавить еще один набор заголовков, чтобы притвориться (больше) как законный браузер.Добавьте еще несколько заголовков, таких как:

headers = { 
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', 
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
'Accept-Language' : 'en-US,en;q=0.5', 
'Accept-Encoding' : 'gzip', 
'DNT' : '1', # Do Not Track Request Header 
'Connection' : 'close' }
0 голосов
/ 26 января 2019

Попробуйте изменить пользовательский агент в заголовке запроса, чтобы он совпадал с вашим пользовательским агентом Google Chrome, добавив его в заголовки:

headers = {
    'User-Agent': 'Add your google chrome user-agent here'
}
...