使用 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 抓取谷歌精选片段的主要内容,如果未能解决你的问题,请参考以下文章