【问题标题】:Scrape google search snippet results抓取谷歌搜索片段结果
【发布时间】:2018-01-15 06:09:51
【问题描述】:

我正在尝试编写一个小程序,你输入一个搜索查询,它会打开你的浏览器并显示结果,然后抓取谷歌搜索结果并打印出来,我不知道我会怎么做刮削部分。这就是我目前所拥有的:

import webbrowser 
query = input("What would you like to search: ")
for word in query:
    query = query + "+"
webbrowser.open("https://www.google.com/search?q="+query)

假设他们说 type:“谁是唐纳德·特朗普?” 他们的浏览器将打开,这将显示: donald trump search result

我将如何继续并抓取维基百科提供的摘要,然后将其打印回给用户?或者在任何情况下从网站上抓取任何数据???

【问题讨论】:

  • 您是在说从 Wikipedia.com 抓取数据还是从 Wikipedia provided 抓取 Google 提供的小 sn-p 数据?
  • sn-p 是首选,因为它提供了一个基本的总结,这就是我所需要的/
  • 我不认为 for 循环做你认为它做的事情。试试query = query.replace(" ","+")

标签: python web-scraping


【解决方案1】:

虽然确实有很多方法可以抓取数据,但我已经使用名为 BeautifulSoup 的库对此进行了演示。我相信这是一个比使用webbrowser 来抓取数据更灵活的选择。如果这对您来说是新的,请不要担心,我将引导您完成这些步骤。


您将需要 BeautifulSouprequests 模块。如果您没有它们,请使用 pip 安装它们
导入模块:
import requests
from bs4 import BeautifulSoup

获取用户输入并将其保存到变量中:

query = input("What would you like to search: ")
query = query.replace(" ","+")
query = "https://www.google.com/search?q=" + query

使用requests模块向主机发送GET请求:

r = requests.get(query)
html_doc = r.text

实例化一个BeautifulSoup 对象:

soup = BeautifulSoup(html_doc, 'html.parser')

终于刮到想要的文字了:

for s in soup.find_all(id="rhs_block"):
   print(s.text)

注意 ID。这个 ID 是 Google 放置所有 sn-p 文本的容器。通过这种方式,它会从字面上吐出它在这个容器中找到的所有文本,但是你当然可以将它的格式设置为看起来更整洁一些。
顺便说一句,如果您碰巧遇到UnicodeEncodeError,您必须将.encode('utf-8') 附加到每个text 属性的末尾。
如果您还有其他问题,请告诉我。干杯!

【讨论】:

  • 只是为了正式记录:我很难收到工作请求。随请求报废的 HTML 不包括 rhs_block id(或任何有用的 id)。用户 Naazneen Jatu 的回答将我引向了 selenium,但他的回答本身并不是很有用!这是一个关于硒如何工作的精彩“教程”的链接:stackoverflow.com/questions/45259232/… 我会警告每个看到这个的人......如果请求不适合您,请仅使用硒! Selenium 比请求复杂得多。
  • 这个解决方案现在不起作用。 Dimitry Zub 本页底部的第二个答案目前有效。请把它作为这个问题的答案
【解决方案2】:

要获取摘要,您可以使用bs4 提供的select_one() 方法,方法是选择CSS 选择器。您可以使用SelectorGadget Chrome 扩展程序或任何其他方式进行快速选择。

确保您使用的是 user-agent,否则,Google 可能会阻止您的请求,因为默认的 user-agent 将是 python-requests(如果您使用的是 requests 库) 虚假用户访问的user-agents列表。

从那里你可以使用select_one() 方法刮掉你想要的所有其他部分。请记住,只有在 Google 提供的情况下,您才能从 Knowladge 图表中抓取信息。您可以编写iftry-except 语句来处理异常。

代码和full example

from bs4 import BeautifulSoup
import requests
import lxml

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"
}

html = requests.get('https://www.google.com/search?q=who is donald trump', headers=headers).text

soup = BeautifulSoup(html, 'lxml')

summary = soup.select_one('.Uo8X3b+ span').text
print(summary)

输出:

Donald John Trump is an American media personality and businessman who served as the 45th president of the United States from 2017 to 2021.
Born and raised in Queens, New York City, Trump attended Fordham University and the University of Pennsylvania, graduating with a bachelor's degree in 1968.

使用来自 SerpApi 的 Google Knowledge Graph API 的另一种方法。这是一个免费试用的付费 API。查看Playground 了解更多信息。

import os
from serpapi import GoogleSearch

params = {
  "engine": "google",
  "q": "who is donald trump",
  "api_key": os.getenv("API_KEY"),
}

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

summary = results["knowledge_graph"]['description']
print(summary)

输出:

Donald John Trump is an American media personality and businessman who served as the 45th president of the United States from 2017 to 2021.
Born and raised in Queens, New York City, Trump attended Fordham University and the University of Pennsylvania, graduating with a bachelor's degree in 1968.

免责声明我为 SerpApi 工作。

【讨论】:

    【解决方案3】:

    我使用了 selenium 网络驱动程序。并成功提取google结果sn-ps。

    from selenium import webdriver
    browser = webdriver.Chrome(path\chromedriver') 
    #specify path of chrome driver
    browser.get('http://google.co.in/')
    sbar = browser.find_element_by_id('lst-ib')
    sbar.send_keys(x) # x is the query
    sbar.send_keys(Keys.ENTER)
    #elements on search page of google are having different class and ids so we have to try among severals to get an answer.
    try:
       elem = browser.find_element_by_css_selector('div.MUxGbd.t51gnb.lyLwlc.lEBKkf')
    except:
       pass
    try:
        elem = browser.find_element_by_css_selector('span.ILfuVd.yZ8quc')
    except:
        pass
    try:
        elem = browser.find_element_by_css_selector('div.Z0LcW')
    except:
         pass
    print (elem.text)
    

    我希望它有所帮助。如果您发现错误,请告知! 附言。注意缩进

    注意:您应该有您将使用的浏览器的驱动程序。

    【讨论】:

      【解决方案4】:

      上面的代码除了 ID 外都很好用。与id="rhs_block" 我没有得到任何结果。相反,我使用了id="res"。可能最近更新了

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 2018-12-19
        • 2020-10-09
        • 2021-07-20
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        相关资源
        最近更新 更多