从谷歌搜索中提取结果数量

Posted

技术标签:

【中文标题】从谷歌搜索中提取结果数量【英文标题】:extract the number of results from google search 【发布时间】:2019-04-10 03:54:19 【问题描述】:

我正在编写一个网络爬虫来提取谷歌搜索中搜索结果的数量,该搜索结果显示在搜索结果页面的左上角。我已经写了下面的代码,但我不明白为什么phrase_extract 是None。我想提取短语“大约 12,010,000,000 个结果”。我在哪个部分犯了错误?可能解析 html 不正确?

import requests
from bs4 import BeautifulSoup

def pyGoogleSearch(word):   
    address='http://www.google.com/#q='
    newword=address+word
    #webbrowser.open(newword)
    page=requests.get(newword)
    soup = BeautifulSoup(page.content, 'html.parser')
    phrase_extract=soup.find(id="resultStats")
    print(phrase_extract)

pyGoogleSearch('world')

【问题讨论】:

您应该考虑使用他们的API,而不是抓取 超过一定数量就不是免费的了。但是你知道为什么API的结果与这种方法不同吗? API 是一种比抓取更有前途的方法。网站所有者不会等待通知您有关更改的信息,因此您的代码可能会在某个时间变得无法正常工作。但是,API 开发和维护良好,与抓取相比,响应时间要快得多。 @Gahan 所以这就是为什么当我用漂亮的汤刮刮时,与在 google 和 alos api 中搜索相比,我得到不同的结果?这意味着我通过这三种不同的方法得到了三种不同的结果 当然可以,因为您使用 id 或标签类别抓取数据,它们可能会更改它或嵌套在另一个标签中。它只是html结构。而您有 API 文档。 【参考方案1】:

您实际上使用了错误的 url 来查询 google 的搜索引擎。你应该使用http://www.google.com/search?q=<query>

所以它看起来像这样:

def pyGoogleSearch(word):
    address = 'http://www.google.com/search?q='
    newword = address + word
    page = requests.get(newword)
    soup = BeautifulSoup(page.content, 'html.parser')
    phrase_extract = soup.find(id="resultStats")
    print(phrase_extract)

您也可能只想要该元素的文本,而不是元素本身,因此您可以执行类似的操作

phrase_text = phrase_extract.text

或以整数形式获取实际值:

val = int(phrase_extract.text.split(' ')[1].replace(',',''))

【讨论】:

谢谢!有用!但这里有两个问题。首先,当我打印phrase_extract 时,它向我显示:About 515,000,000 results 而类不是“sd”。第二个问题是结果 515,000,000 和我在 google 搜索时看到的数字不同。 我用窗口下方的 xml 代码的整个图像编辑了我的问题。图片出现在我的问题中的“此处的整个图片描述”中。 有人知道如何从文本中提取 515,000,000 的确切数字吗?我使用 text.split 但它给了我这个错误: ValueError: invalid literal for int() with base 10: '3,170,000,000' @RoseA 我添加了一个用于获取整数值的 sn-p 谢谢你,如果你知道我的其他问题的答案,如果你能解决他们,我将不胜感激【参考方案2】:

您还可以尝试查看上面div 的输出。有时它会显示输出。

此外,请确保您使用的是 user-agent,因为 Google 可以将您的脚本视为具有不同 .class#id 标记等的平板电脑 user-agent(不同的东西)。这可能是您的输出为空[] 的原因。

这里是代码和replit.com查看搜索结果的数量

from lxml import html
import requests

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"


response = requests.get('https://www.google.com/search?q=beautiful+cookies',
                        headers=headers,
                        stream=True)

response.raw.decode_content = True

tree = html.parse(response.raw)

# lxml is used to select element by XPath
# Requests + lxml: https://***.com/a/11466033/1291371
# note: you can achieve it easily with bs4 as well by grabbing "#result-stats" id selector.
result = tree.xpath('//*[@id="result-stats"]/text()')[0]

print(result)

# About 3,890,000,000 results

或者,您可以使用 SerpApi 中的 Google Search Engine Results API 来实现相同但更简单的方式。

部分 JSON:

"search_information": 
 "organic_results_state":"Results for exact spelling",
 "total_results": 3890000000,
 "time_taken_displayed": 0.65,
 "query_displayed": "beautiful cookies"

要集成的代码:

import os
from serpapi import GoogleSearch

params = 
    "engine": "google",
    "q": "beautiful cookies",
    "api_key": os.getenv("API_KEY"),


search = GoogleSearch(params)
results = search.get_dict()

result = results["search_information"]['total_results']
print(result)

# 4210000000

Discrailmer,我为 SerpApi 工作。

【讨论】:

以上是关于从谷歌搜索中提取结果数量的主要内容,如果未能解决你的问题,请参考以下文章

从谷歌和雅虎收集搜索结果的程序[关闭]

从谷歌搜索建议解析xml结果时出现异常

如何从谷歌地图自动完成中提取纬度和经度

从谷歌搜索中删除专家交换

403 Forbidden - 从谷歌的图片搜索中获取网址

从谷歌地图API位置搜索框的示例中获取坐标? [重复]