【问题标题】:Web scrape from google quick answer box来自谷歌快速回答框的网页抓取
【发布时间】:2017-03-14 17:18:07
【问题描述】:

我正在尝试从谷歌快速答案框中抓取答案,但我想要的元素没有提供任何价值。但它根据元素来源显示价值。我使用的代码如下:

from bs4 import BeautifulSoup
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
query = question
query = urllib.urlencode ( { 'q' : query } )
url = "http://www.google.com/search?%s&"+query
page = opener.open(url)
soup = BeautifulSoup(page,"html.parser")
box=soup.find_all('div', class_='_XWk')
print(box)

【问题讨论】:

  • 首先,您的网址模板有问题。 URL 参数语法显然被破坏了。其次,我尝试了你的代码,发现page变量是和对象,而不是包含HTML的字符串,所以把它放到BeautifulSoup构造函数中是绝对没用的。
  • 第三,不推荐使用urllib(2),最好使用requests。有关更多信息,请参阅此链接:stackoverflow.com/questions/2018026/…
  • 最后,我想帮助你,但我在俄罗斯,在搜索结果页面上找不到具有此类类的 div。也许这取决于国家?如果您从浏览器保存搜索结果页面并将其作为 HTML 文件放在这里,我可以提供帮助
  • 这些是浏览器的搜索结果页面。它只出现在检查代码部分。
    泰戈尔
  • 在浏览器中操作时地址栏中的内容是什么?

标签: python-2.7 beautifulsoup


【解决方案1】:

由于您试图从整个 HTML 中仅抓取一个元素(如果是这样),因此无需使用 find_all()/findAll() 方法。

相反,您可以使用bs4 提供的find()select_one() 方法来抓取一个特定元素或使用CSS 选择器进行选择。您可以使用SelectorGadget 找到css 选择器。


例如:假设您想从 Google 搜索答案框结果中抓取天气数据。 你可以这样做:

  1. 使用自定义脚本。我又刮了一点,只是为了表明这是一个简单的过程。
  2. 使用来自 SerpApi 的 Google Direct Answer Box API。这是一个付费 API,可免费试用 5,000 次搜索。查看playground 进行测试。

代码和full example in the 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"
}

response = requests.get('https://www.google.com/search?q=london weather', headers=headers).text
soup = BeautifulSoup(response, 'lxml')

weather_condition = soup.select_one('#wob_dc').text
tempature = soup.select_one('#wob_tm').text
precipitation = soup.select_one('#wob_pp').text
humidity = soup.select_one('#wob_hm').text
wind = soup.select_one('#wob_ws').text
current_time = soup.select_one('#wob_dts').text

print(f'Weather condition: {weather_condition}\nTempature: {tempature}°F\nPrecipitation: {precipitation}\nHumidity: {humidity}\nWind speed: {wind}\nCurrent time: {current_time}')

# output:
'''
Weather condition: Mostly cloudy
Tempature: 47°F
Precipitation: 79%
Humidity: 49%
Wind speed: 9 mph
Current time: Thursday 10:00 AM
'''

基本上,主要区别在于,通过使用 Google Direct Answer Box API,最终用户的所有操作都已完成,并带有 json 输出,您无需弄清楚内容并修改 HTML 元素即可获得所需输出或猜测为什么输出不同,虽然它应该是完全不同的。

获取天气答案框的代码:

from serpapi import GoogleSearch
import os

params = {
  "engine": "google",
  "q": "london weather",
  "api_key": os.getenv("API_KEY"),
  "hl": "en",
}

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

loc = results['answer_box']['location']
weather_date = results['answer_box']['date']
weather = results['answer_box']['weather']
temp = results['answer_box']['temperature']
unit = results['answer_box']['unit']
precipitation = results['answer_box']['precipitation']
humidity = results['answer_box']['humidity']
wind = results['answer_box']['wind']

forecast = results['answer_box']['forecast']

print(f'{loc}\n{weather_date}\n{weather}\n{temp}\n{unit}\n{precipitation}\n{humidity}\n{wind}\n\n{forecast}')

# output:
'''
London, UK
Thursday 7:00 AM
Mostly sunny
53
Fahrenheit
2%
89%
1 mph

[{'day': 'Thursday', 'weather': 'Mostly cloudy', 'temperature': {'high': '70', 'low': '53'}]
...
'''

免责声明,我为 SerpApi 工作。

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多