使用 python 抓取谷歌精选片段

Posted

技术标签:

【中文标题】使用 python 抓取谷歌精选片段【英文标题】:scraping google featured snippets using python 【发布时间】:2020-10-22 04:25:46 【问题描述】:

https://www.google.com/search?q=LAPTOP+ACER+I3/4/1TB/8GEN+full+specs

例如:我想搜索这个产品并直接从特色 sn-ps 中抓取它的规格。我如何将所有东西都放在那个盒子里??

【问题讨论】:

【参考方案1】:

根据Google featured snippets,

精选的 sn-ps 来自网络搜索列表。 Google 的自动化系统会确定一个页面是否会成为一个很好的特色 sn-p 以突出显示特定的搜索请求。

因此,如果您想抓取多个搜索,这将不是一种可靠的方法,因为它们会千差万别。

但是,对于这个特定的搜索,您可以重定向您的抓取工具以跟踪该链接,然后您必须编写代码来抓取该链接的信息。

我如何将所有东西都放在那个盒子里??

该框仅包含您可以看到的信息,可能不是您想要的所有信息。如果您只想抓取这些信息,那非常简单。

import requests
from bs4 import BeautifulSoup

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
div = soup.find("div", "class": "webanswers-webanswers_table__webanswers- 
table")
tr = div.findAll("tr")
for row in tr:
    td = row.findAll("td")
    print(td[0].text.strip(), ": " ,td[1].text.strip())

如果上述代码不起作用或返回 429 或其他状态代码,Google 可能会阻止抓取脚本/蜘蛛。尝试添加用户代理,例如:

headers = 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36'
response = requests.get(url, headers=headers)

如果同样失败,请尝试使用selenium

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait as wait

url = "https://www.google.com/search?q=acer+i3+8th+gen+1tb+laptop+full+specs"

driver = webdriver.Firefox("path/to/geckodriver")
driver.get(url)

snippet = wait(driver, 60).until(lambda driver: 
driver.find_element_by_css_selector("div.webanswers-webanswers_table__webanswers-table"))
print(snippet.text)

【讨论】:

它说“NoneType 没有属性 findAll”。我猜它找不到那个类的div。这是我面临的主要问题。当我打印 div 变量时,它返回“None”。【参考方案2】:

您可以通过以下方式实现:

requests-html beautifulsoup Google 直接应答框 API

使用 Requests-html 和example in online IDE:

from requests_html import HTMLSession

session = HTMLSession()
response = session.get('https://www.google.com/search?q=Acer+Aspire+3+A315-53+Laptop++specs')

specs_no_split = response.html.find('.Crs1tb', first=True).text
# splitting by a new line and grabbing every second value
specs_split = response.html.find('.Crs1tb', first=True).text.split('\n')[0::2]
# converting from list to a string
specs_filtered = ''.join(specs_split)
print(specs_no_split)
print(specs_split)
print(specs_filtered)

# output:
'''
Acer Aspire 3 A315-53 (NX.H38SI.002) Laptop (Core i3 8th Gen/4 GB/1 TB/Windows 10) Specifications
display type
LED
display size
15.6 Inches (39.62 cm)
display resolution
1920 x 1080 Pixels
display touchscreen
No
display features
Full HD LED Backlit IPS Display
ще 1 рядок

['Acer Aspire 3 A315-53 (NX.H38SI.002) Laptop (Core i3 8th Gen/4 GB/1 TB/Windows 10) Specifications', 'LED', '15.6 Inches (39.62 cm)', '1920 x 1080 Pixels', 'No', 'Full HD LED Backlit IPS Display']

Acer Aspire 3 A315-53 (NX.H38SI.002) Laptop (Core i3 8th Gen/4 GB/1 TB/Windows 10) SpecificationsLED15.6 Inches (39.62 cm)1920 x 1080 PixelsNoFull HD LED Backlit IPS Display
'''

使用 BeautifulSoup 和 example in online IDE:

from bs4 import BeautifulSoup
import requests, 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=https://www.google.com/search?q=Acer+Aspire+3+A315-53+Laptop+specs, headers=headers).text
soup = BeautifulSoup(html, 'lxml')

specifications = soup.find('div', class_='wDYxhc').text
print(specifications)

# Output:
'''
Acer Aspire 3 A315-53-35ZY 15.6" Notebook, Intel i3, 4GB Memory, Windows 10Operating System. Windows 10.Hard Drive. HDD.Memory. 4GB RAM DDR4.Graphics card. Intel UHD Graphics 620.Processor. 2.2 Ghz Intel i3 processor.Display. 15.6-inch 1920 x 1080 resolution.
'''

或者,您可以使用来自 SerpApi 的 Google Direct Answer Box API。这是一个带有免费计划的付费 API。

不同之处在于您只需要考虑要提取的数据,以及要使用的查询参数,而不是弄清楚如何绕过块或提取某些东西。

要集成的代码 (example in online IDE):

from serpapi import GoogleSearch
import os

params = 
  "api_key": os.getenv("API_KEY"),
  "engine": "google",
  "q": "Acer Aspire 3 A315-53 Laptop specs",
  "google_domain": "google.com",


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

specs = results['answer_box']['contents']['formatted']
print(specs)

# output:
'''
['display_type': 'display size', 'led': '15.6 Inches (39.62 cm)', 'display_type': 'display resolution', 'led': '1920 x 1080 Pixels', 'display_type': 'display touchscreen', 'led': 'No', 'display_type': 'display features', 'led': 'Full HD LED Backlit IPS Display']
'''

免责声明,我为 SerpApi 工作。

【讨论】:

以上是关于使用 python 抓取谷歌精选片段的主要内容,如果未能解决你的问题,请参考以下文章

使用谷歌浏览器中的检查元素功能来抓取网站[关闭]

使用python抓取AJAX电子商务网站

使用片段的谷歌地图

oauth 谷歌使用 python

oauth 谷歌使用 python

在 Android 片段中使用谷歌地图