python - 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文件的图片:
解决方案
虽然问题中的评论是正确的,但它们不适用于这种情况。对修改 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 模块来使用它。
推荐阅读
- javascript - Shopify API 访问已被禁用
- c++ - 来自 if/else 语句的 MSVC 编译器反汇编代码
- wpf - 在用户控件(winforms)的 windowsformhost(wpf)上调用鼠标双击
- python - 如何在程序使用 python 运行时从数据库中获取新数据而不刷新我的程序
- python - 更改 urllib2 的 IP 地址
- ubuntu - 安装 TPM 模拟器时出现 SSL 错误
- java - 如何使按钮单击功能被多次单击?
- google-sheets - 动态条件格式(最后一个值为 +1 的单元格)
- sql-server - 如何在 SSIS 数据流中捕获多个错误列
- vue.js - Vue 源代码 Q1:对“this._init”感到困惑