【问题标题】:How to scrape more than 100 google pages in one pass如何一次性抓取 100 多个谷歌页面
【发布时间】:2016-04-09 10:01:39
【问题描述】:

我在 python 中使用 requests 库来获取来自 google 结果的GET 数据。 https://www.google.com.pk/#q=pizza&num=10 将返回 google 的前 10 个结果,正如我提到的 num=10。最终https://www.google.com.pk/#q=pizza&num=100 将返回 100 条 google 结果。

但是

如果我写任何超过 100 的数字 let https://www.google.com.pk/#q=pizza&num=200 ,谷歌仍然返回前 100 个结果

如何一次获得超过 100 个?

代码:

import requests
url = 'http://www.google.com/search'
my_headers = { 'User-agent' : 'Mozilla/11.0' }
payload = { 'q' : pizza, 'start' : '0', 'num' : 200 }
r = requests.get( url, params = payload, headers = my_headers )

在“r”中,我只得到 google 前 100 个结果的 URL,而不是 200 个

【问题讨论】:

  • Google 强制限制,每页最大结果数为 100。
  • 不是 100 页,而是 100 个结果。

标签: python web-scraping html-parsing python-requests google-custom-search


【解决方案1】:

您可以使用 google 提供的更程序化的 api 来获取结果,而不是尝试屏幕抓取人工搜索界面,没有错误检查或断言,这符合所有 google 条款和条件,建议您查看使用此的详细信息网址:

import requests

def search(query, pages=4, rsz=8):
    url = 'https://ajax.googleapis.com/ajax/services/search/web'
    params = {
        'v': 1.0,     # Version
        'q': query,   # Query string
        'rsz': rsz,   # Result set size - max 8
    }

    for s in range(0, pages*rsz+1, rsz):
        params['start'] = s
        r = requests.get(url, params=params)
        for result in r.json()['responseData']['results']:
            yield result

例如获得 200 个与“google”相关的结果:

>>> list(search('google', pages=24, rsz=8))
[{'GsearchResultClass': 'GwebSearch',
  'cacheUrl': 'http://www.google.com/search?q=cache:y14FcUQOGl4J:www.google.com',
  'content': 'Search the world&#39;s information, including webpages, images, videos and more. \n<b>Google</b> has many special features to help you find exactly what you&#39;re looking\xa0...',
  'title': '<b>Google</b>',
  'titleNoFormatting': 'Google',
  'unescapedUrl': 'https://www.google.com/',
  'url': 'https://www.google.com/',
  'visibleUrl': 'www.google.com'},
  ...
]

要使用 Google 的自定义搜索 API,您需要注册为开发人员。您每天可以获得 100 个免费查询(我不确定这是 API 调用还是它允许对同一查询进行分页算作 1 个查询):

  • 注册@https://console.developers.google.com
  • 创建项目
  • 创建key
  • 启用自定义搜索 API
  • 创建自定义搜索引擎@https://cse.google.com
    • 使用虚拟站点初始化 CSE
    • 编辑 CSE 以搜索整个网络
    • 删除虚拟站点
  • 获取 CSE 参考(查看cx=&lt;cse reference&gt; 的公共 URL)

您可以使用requests进行查询:

import requests
url = 'https://www.googleapis.com/customsearch/v1'
params = {
    'key': '<key>',
    'cx': '<cse reference>',
    'q': '<search>',
    'num': 10,
    'start': 1
}

resp = requests.get(url, params=params)
results = resp.json()['items']

使用start,您可以进行与上述类似的分页。

还有很多其他可用参数,您可以查看 CSE 的 REST 文档:https://developers.google.com/custom-search/json-api/v1/reference/cse/list#request

Google 也有一个客户端 API 库:pip install google-api-python-client 你也可以使用:

from googleapiclient import discovery
service = discovery.build('customsearch', 'v1', developerKey='<key>')
params = {
    'q': '<query>',
    'cx': '<cse reference>',
    'num': 10,
    'start': 1
}
query = service.cse().list(**params)
results = query.execute()['items']

【讨论】:

  • 谢谢你,它在最初的几次尝试中给出了结果,之后它没有检索到任何结果,可能是谷歌开始阻止我的 IP?有什么解决办法吗?
  • 官方不推荐使用 AJAX 搜索 url,事实上这个 url 的大多数形式在几年前就被删除了,这个特殊的形式可能被遗漏了。有 API 搜索限制。以编程方式访问 google 的官方方法是通过自定义搜索 API developers.google.com/custom-search,您需要注册一个密钥 - 对此有很大限制,如果您想要完全访问权限,则需要付费。
  • NP。在您开始付款之前,您每天会收到 100 次 CSE 查询。
【解决方案2】:

您可以为此目的使用浏览器自动化。我用它来抓取图像列表。使用浏览器自动化,您可以单击下一个或上一个按钮并取消结果。我无法粘贴代码。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2019-09-19
    • 1970-01-01
    • 2018-12-19
    • 2015-03-27
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多