Requests.get не возвращает полный результат - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь получить результаты пиццы с сайта Bing, и вот мой код

import requests

    search = input("Search for:")
    Params = {"q": search}
    r = requests.get("http://www.bing.com/search", params=Params)
    f = open("test.html", "w+", encoding='utf-8')
    print(r.url)
    print(r.status_code)
    f.write(r.text)

Он работает без ошибок

Search for:pizza
http://www.bing.com/search?q=pizza
200

Process finished with exit code 0

Но когда я открываю файл в который программа сохранила текст я не вижу результатов

Вот изображение html файл:
Here is the Pic of html file

1 Ответ

1 голос
/ 01 апреля 2020

Хотя комментарии в вопросе верны, в этом случае они не применяются. простая проверка для JS загруженных событий, которая изменяет dom, состоит в том, чтобы просто отключить javascript и перезагрузить страницу в вашем браузере. Если это выдает то же самое, что вы получили из запросов, то вы знаете, что содержимое заполняется событием dom после источника страницы, и запросы не будут видеть никаких изменений dom, внесенных в содержимое.

Однако в этом случае, если я загружаю поисковый URL в браузере с отключенным JS, я все равно вижу целый ряд результатов. Да, некоторые элементы отсутствуют. Но это не объясняет, почему в вашем коде вы вообще не видите результатов поиска.

поэтому другой момент, который следует учитывать, - это тот факт, что когда мы делаем веб-запросы как часть заголовков http, мы отправляем строку user-agent, которая идентифицирует, какой мы тип клиента http. Теперь некоторые сайты могут фильтровать или блокировать определенных пользовательских агентов. или предоставлять результаты только тем, которые являются настоящими веб-браузерами. Кажется, это root вашей проблемы.

Если вы обновите свой код и установите заголовки http со строкой пользовательского агента, такой как веб-браузер, вы должны увидеть, что вы получите целый набор результатов и html, который точно совпадает с тем, что вы видите в браузере. Минус любые элементы в браузере, которые загружаются после исходного кода через события JS.

import requests

search = input("Search for:")
Params = {"q": search}
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
r = requests.get("http://www.bing.com/search", params=Params, headers=headers)
f = open("test.html", "w+", encoding='utf-8')
print(r.url)
print(r.status_code)
f.write(r.text)

Теперь, когда это работает и даст вам больше того, что вы хотите, вопрос теперь о морали один. Bing решил не возвращать результаты на ваш запрос. Вы можете, конечно, l ie и сказать, что не из запросов, а из веб-браузера. Или вы могли бы уважать их выбор, так как они не хотят, чтобы к их сервису обращались подобным образом.

Если вы заинтересованы именно в результатах поиска, bing предоставляет API поиска, который отвечает в формате JSON, и некоторые люди уже написано python модулей для его использования.

https://pypi.org/search/?q=bing+api&o=

...