6

我试图在谷歌上的一个简单查询中获得第一个非广告结果。

res = requests.get('https://www.google.com?q=' + query)

为查询分配任何值,您将收到错误消息。我试图添加一些标题,但没有任何改变。

我试图添加谷歌通常与查询相关联的所有其他参数,并且没有任何变化。

如果您使用硒进行搜索,则没有问题。

错误代码是 429,但这似乎只是此查询的标准响应。它与我的 IP 无关,而且我没有向 Google 发送垃圾邮件,而且这不会在一段时间后消失。

你知道为什么会发生这种情况吗?我可以添加一些标题,或者任何其他解决方案来查看结果,就好像你在谷歌上搜索那个关键字一样?

4

5 回答 5

5

由于您得到status code 429这意味着您在给定的时间内发送了太多请求(“速率限制”)。在此处阅读更多详细信息。

在您的请求中添加标头,如下所示:

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)\
            AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'}

所以最终的请求将是:

url = 'https://www.google.com?q=' + query
res = requests.get(url, headers=headers)
于 2019-06-25T16:34:20.630 回答
4

429 请求过多

HTTP 429 Too Many Requests响应状态代码表示用户在给定时间内发送了太多请求(“速率限制”)。响应表示应该包含解释条件的详细信息,并且可以包含一个Retry-After标头,指示在发出新请求之前要等待多长时间。

当服务器受到攻击或刚刚收到来自单方的大量请求时,使用429状态码响应每个请求都会消耗资源。因此,服务器不需要使用429状态码;在限制资源使用时,仅断开连接或采取其他步骤可能更合适。

但是,当我为您编写代码并执行相同的测试时,我得到了完美的结果,如下所示:

  • 代码块:

    import requests
    
    query = "selenium"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
    url = 'https://www.google.com?q=' + query
    res = requests.get(url, headers=headers)
    print(res)
    
  • 控制台输出:

    <Response [200]>
    

您可以在加载资源失败中找到相关讨论:服务器通过 Selenium 使用 ChromeDriver Chrome 响应状态为 429 (Too Many Requests) 和 404 (Not Found)

于 2019-06-26T13:49:35.537 回答
2

我找到了谷歌简单查询、rest-api 请求导致 429 错误的原因。

用户代理标头是原因之一,但我尝试在请求中插入用户代理标头。但响应时出现 429 错误。

最后我找到了原因,原因是饼干。

如果您想访问 google 页面 api,首先您必须从 google.com、trend.google.com、YouTube.com 等基本 google url 获取 cookie。可以使用任何请求方法访问此基本站点。

 googleTrendsUrl = 'https://google.com'
 response = requests.get(googleTrendsUrl)
 if response.status_code == 200:
    g_cookies = response.cookies.get_dict()

并且此 cookie 通过用户代理插入到 api 请求中

  headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)\
            AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'}
  url = 'https://www.google.com?q=' + query
  res = requests.get(url, headers=headers, cookies=g_cookies)
于 2021-05-27T07:21:31.753 回答
0

如今,仅仅将用户代理更改为一个好的用户代理并不总是完美的,因为谷歌已经实施了更好的抓取保护。您可能想尝试https://rapidapi.com/restyler/api/google-search26,它在后台使用高质量代理来避免命中 429 和验证码。

于 2021-10-30T18:19:13.583 回答
0

这是 StackOverFlow 上最常见的问题,在标签中被问了 200 多次[requests][bs4]几乎每个解决方案都只是简单地添加user-agent.

User-agentuser-agent当机器人或浏览器发送虚假字符串以宣布自己为不同的客户端时,需要充当“真实”用户访问。

当在使用库时将 nouser-agent传递给请求时,它默认为python-requests并且 Google 知道它是一个机器人/脚本,然后它会阻止请求(或它所做的任何事情)并且您会收到不同的 HTML(带有某种错误)使用不同的选择器。检查你的. 名单headersrequestsCSSuser-agentuser-agents

我写了一篇专门的博客,介绍如何在网络抓取搜索引擎时减少被阻止的机会

注意:添加user-agent并不意味着它会解决问题,即使在旋转user-agents.

通过user-agent

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

requests.get('URL', headers=headers)

或者,您可以使用来自 SerpApi的Google Organic Results API来实现相同的目的。这是一个带有免费计划的付费 API。

不同之处在于,您不必花时间试图绕过 Google 的阻止并找出为什么某些事情不能正常工作。相反,您需要专注于要提取的数据。看看操场

免责声明,我为 SerpApi 工作。

于 2021-10-28T06:39:20.203 回答