首页 > 解决方案 > Requests.get 没有返回完整的结果

问题描述

我正在尝试从必应搜索中获取披萨的结果,这是我的代码:

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文件的图片:

这是html文件的图片

标签: pythonpython-requestsuser-agent

解决方案


虽然问题中的评论是正确的,但它们不适用于这种情况。对修改 dom 的 JS 加载事件的简单检查就是关闭 javascript 并在浏览器中重新加载页面。如果这产生的结果与您从请求中获得的相同,那么您知道内容正在由页面源之后的 dom 事件填充,并且请求不会看到对内容进行的任何 dom 更改。

但是在这种情况下,如果我在禁用 JS 的浏览器中加载搜索 url,我仍然会看到一大堆结果。是的,缺少一些元素。但它没有解释为什么在您的代码中您根本看不到任何搜索结果。

所以要考虑的另一件事是,当我们将 web 请求作为 http 标头的一部分时,我们会发送一个用户代理字符串来标识我们是哪种类型的 http 客户端。现在一些网站可能会过滤或阻止某些用户代理。或仅向真正的 Web 浏览器提供结果。这似乎是你问题的根源。

如果您更新您的代码并使用用户代理字符串(如网络浏览器)设置 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 选择不将结果返回给您的 requests.get 调用。您当然可以撒谎并告诉 bing 您不是来自请求,而是来自网络浏览器。或者您可以尊重他们的选择,即他们不希望像这样访问他们的服务。

如果您对搜索结果特别感兴趣,bing 确实提供了一个以 JSON 格式响应的搜索 API,并且有些人已经编写了 python 模块来使用它。

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


推荐阅读