代码之家  ›  专栏  ›  技术社区  ›  Muhammad Zeeshan

如何一次抓取100多个谷歌页面

  •  1
  • Muhammad Zeeshan  · 技术社区  · 9 年前

    我使用python中的请求库来 GET 来自谷歌结果的数据。 https://www.google.com.pk/#q=pizza&num=10 将返回我提到的谷歌的前10个结果 num=10 最终 https://www.google.com.pk/#q=pizza&num=100 将返回100个谷歌结果。

    但是

    如果我写的任何数字超过100,让 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”中,我只得到谷歌前100个结果的URL,而不是200个

    2 回复  |  直到 9 年前
        1
  •  6
  •   AChampion    9 年前

    你可以使用谷歌的一个更程序化的api来获取结果,而不是尝试屏幕抓取人工搜索界面,没有错误检查或断言这符合所有谷歌T&C,建议您查看使用此url的详细信息:

    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
    

    E、 g.为“google”获得200个结果:

    >>> 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'},
      ...
    ]
    

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

    您可以使用 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

    谷歌还有一个客户端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']
    
        2
  •  -1
  •   Ilia Choly    9 年前

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