Python从Google提取天气数据?本文教你使用requests和 Beautiful Soup 在 Python 中抓取 Google 天气搜索页面以提取有用的信息,例如当前天气、温度、未来几天的天气等等。
你可能知道,网络抓取本质上是从网站中提取数据。用像 Python 这样的高级编程语言来完成这样的任务非常方便和强大。在本教程中,你将学习如何使用请求和BeautifulSoup从Google搜索引擎中抓取天气数据。
Python如何获取天气数据?虽然,这不是获取特定位置实际天气的完美和官方方式,因为有数百个天气API可供使用。但是,熟悉抓取对你来说是一个很好的练习。
还有一些已经用 Python 构建的方便的工具,例如wttr.in。查看本教程以了解如何使用它。
相关: 如何在 Python 中制作电子邮件提取器。
Python如何从Google提取天气数据?好的,让我们开始吧,安装所需的依赖项:
pip3 install requests bs4
Python从Google提取天气数据?首先,让我们做一点实验,打开一个谷歌搜索栏,输入例如:“weather london”,你会看到官方天气,让我们右击查看HTML代码,如下图所示:
注意:Google 没有合适的天气 API,因为它还会从 weather.com 中抓取天气数据,因此我们基本上是从它那里抓取数据。
Python如何从Google提取天气数据?你将被转发到负责显示地区、日期和小时以及实际天气的 HTML 代码:
太好了,让我们尝试在 Python 交互式 shell 中快速提取此信息:
In [7]: soup = BeautifulSoup(requests.get("https://www.google.com/search?q=weather+london").content)
In [8]: soup.find("div", attrs={'id': 'wob_loc'}).text
Out[8]: 'London, UK'
不要担心我们是如何创建soup对象的,你现在需要担心的是如何从 HTML 代码中获取该信息,所有你必须指定给soup.find()方法的是 HTML 标签名称和匹配的属性,在这种情况下,id为“wob_loc”的div元素将为我们提供 location 。
同样,让我们提取当前日期和时间:
In [9]: soup.find("div", attrs={"id": "wob_dts"}).text
Out[9]: 'Wednesday 3:00 PM'
实际天气:
In [10]: soup.find("span", attrs={"id": "wob_dc"}).text
Out[10]: 'Sunny'
复制好的,现在你已经熟悉了,让我们创建我们的快速脚本来获取有关天气的更多信息(尽可能多的信息)。打开一个新的 Python 脚本并跟随我。
Python如何获取天气数据?首先,让我们导入必要的模块:
from bs4 import BeautifulSoup as bs
import requests
值得注意的是,谷歌试图阻止我们以编程方式抓取其网站,因为它是一种非官方的获取数据的方式,因为它为我们提供了一个方便的替代方案,即自定义搜索引擎(查看本教程了解如何使用它) ,但只是出于教育目的,我们将假装我们是一个合法的网络浏览器,让我们定义用户代理:
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"
# US english
LANGUAGE = "en-US,en;q=0.5"
Python从Google提取天气数据?此链接为你提供最新的浏览器版本,请确保你更换USER_AGENT
为最新版本。让我们定义一个给定 URL 的函数,它尝试提取所有有用的天气信息并将其返回到字典中:
def get_weather_data(url):
session = requests.Session()
session.headers['User-Agent'] = USER_AGENT
session.headers['Accept-Language'] = LANGUAGE
session.headers['Content-Language'] = LANGUAGE
html = session.get(url)
# create a new soup
soup = bs(html.text, "html.parser")
Python如何从Google提取天气数据?我们在这里所做的就是使用该浏览器和语言创建一个会话,然后使用session.get(url)从网络下载 HTML 代码,最后使用HTML 解析器创建BeautifulSoup对象。
让我们获取当前区域、天气、温度以及实际日期和时间:
# store all results on this dictionary
result = {}
# extract region
result['region'] = soup.find("div", attrs={"id": "wob_loc"}).text
# extract temperature now
result['temp_now'] = soup.find("span", attrs={"id": "wob_tm"}).text
# get the day and hour now
result['dayhour'] = soup.find("div", attrs={"id": "wob_dts"}).text
# get the actual weather
result['weather_now'] = soup.find("span", attrs={"id": "wob_dc"}).text
既然显示了当前的降水、湿度和风,为什么不抓住它们呢?
# get the precipitation
result['precipitation'] = soup.find("span", attrs={"id": "wob_pp"}).text
# get the % of humidity
result['humidity'] = soup.find("span", attrs={"id": "wob_hm"}).text
# extract the wind
result['wind'] = soup.find("span", attrs={"id": "wob_ws"}).text
Python如何获取天气数据?让我们尝试获取有关接下来几天的天气信息,如果你花一些时间查找它的 HTML 代码,你会发现类似于以下内容:
<div class="wob_df"
style="display:inline-block;line-height:1;text-align:center;-webkit-transition-duration:200ms,200ms,200ms;-webkit-transition-property:background-image,border,font-weight;font-weight:13px;height:90px;width:73px"
data-wob-di="3" role="button" tabindex="0" data-ved="2ahUKEwifm-6c6NrkAhUBdBQKHVbBADoQi2soAzAAegQIDBAN">
<div class="Z1VzSb" aria-label="Saturday">Sat</div>
<div style="display:inline-block"><img style="margin:1px 4px 0;height:48px;width:48px" alt="Sunny"
src="//ssl.gstatic.com/onebox/weather/48/sunny.png" alt="如何在Python中从Google中提取天气数据?代码示例" data-atf="1"></div>
<div style="font-weight:normal;line-height:15px;font-size:13px">
<div class="vk_gy" style="display:inline-block;padding-right:5px"><span class="wob_t"
style="display:inline">25</span><span class="wob_t" style="display:none">77</span>°</div>
<div class="vk_lgy" style="display:inline-block"><span class="wob_t" style="display:inline">17</span><span
class="wob_t" style="display:none">63</span>°</div>
</div>
</div>
复制我知道不是人类可读的,但是这个父div包含有关第二天的所有信息,即“星期六”,如第一个子div元素所示,在aria-label属性中具有Z1VzSb类,天气信息在img元素中的alt属性,在本例中为"Sunny" 。但是,摄氏度和华氏度都有最大值和最小值,这些代码行会处理一切:
# get next few days' weather
next_days = []
days = soup.find("div", attrs={"id": "wob_dp"})
for day in days.findAll("div", attrs={"class": "wob_df"}):
# extract the name of the day
day_name = day.findAll("div")[0].attrs['aria-label']
# get weather status for that day
weather = day.find("img").attrs["alt"]
temp = day.findAll("span", {"class": "wob_t"})
# maximum temparature in Celsius, use temp[1].text if you want fahrenheit
max_temp = temp[0].text
# minimum temparature in Celsius, use temp[3].text if you want fahrenheit
min_temp = temp[2].text
next_days.append({"name": day_name, "weather": weather, "max_temp": max_temp, "min_temp": min_temp})
# append to result
result['next_days'] = next_days
return result
现在结果字典得到了我们需要的一切,让我们通过使用argparse解析命令行参数来完成脚本:
if __name__ == "__main__":
URL = "https://www.google.com/search?lr=lang_en&ie=UTF-8&q=weather"
import argparse
parser = argparse.ArgumentParser(description="Quick Script for Extracting Weather data using Google Weather")
parser.add_argument("region", nargs="?", help="""Region to get weather for, must be available region.
Default is your current location determined by your IP Address""", default="")
# parse arguments
args = parser.parse_args()
region = args.region
URL += region
# get data
data = get_weather_data(URL)
显示一切:
# print data
print("Weather for:", data["region"])
print("Now:", data["dayhour"])
print(f"Temperature now: {data['temp_now']}°C")
print("Description:", data['weather_now'])
print("Precipitation:", data["precipitation"])
print("Humidity:", data["humidity"])
print("Wind:", data["wind"])
print("Next days:")
for dayweather in data["next_days"]:
print("="*40, dayweather["name"], "="*40)
print("Description:", dayweather["weather"])
print(f"Max temperature: {dayweather['max_temp']}°C")
print(f"Min temperature: {dayweather['min_temp']}°C")
Python从Google提取天气数据?如果你运行这个脚本,它会自动获取由你的IP 地址确定的当前区域的天气。但是,如果你想要一个不同的区域,你可以将它作为参数传递:
C:\weather-extractor>python weather.py "New York"
复制这将显示美国纽约州的天气数据:
Weather for: New York, NY, USA
Now: wednesday 2:00 PM
Temperature now: 20°C
Description: Mostly Cloudy
Precipitation: 0%
Humidity: 52%
Wind: 13 km/h
Next days:
======================================== wednesday ========================================
Description: Mostly Cloudy
Max temperature: 21°C
Min temperature: 12°C
======================================== thursday ========================================
Description: Sunny
Max temperature: 22°C
Min temperature: 14°C
======================================== friday ========================================
Description: Partly Sunny
Max temperature: 28°C
Min temperature: 18°C
======================================== saturday ========================================
Description: Sunny
Max temperature: 30°C
Min temperature: 19°C
======================================== sunday ========================================
Description: Partly Sunny
Max temperature: 29°C
Min temperature: 21°C
======================================== monday ========================================
Description: Partly Cloudy
Max temperature: 30°C
Min temperature: 19°C
======================================== tuesday ========================================
Description: Mostly Sunny
Max temperature: 26°C
Min temperature: 16°C
======================================== wednesday ========================================
Description: Mostly Sunny
Max temperature: 25°C
Min temperature: 19°C
Python如何获取天气数据?好的,我们完成了本教程,我希望这有助于你了解如何结合请求和BeautifulSoup从网页中获取数据。
顺便说一句,还有另一个教程用于在 Python 中提取 YouTube 视频数据或在 Python 中访问维基百科页面!