如何在Python中从Google中提取天气数据(代码示例)

Python从Google提取天气数据?本文教你使用requests和 Beautiful Soup 在 Python 中抓取 Google 天气搜索页面以提取有用的信息,例如当前天气、温度、未来几天的天气等等。
你可能知道,网络抓取本质上是从网站中提取数据。用像 Python 这样的高级编程语言来完成这样的任务非常方便和强大。在本教程中,你将学习如何使用请求和BeautifulSoup从Google搜索引擎中抓取天气数据。
Python如何获取天气数据?虽然,这不是获取特定位置实际天气的完美和官方方式,因为有数百个天气API可供使用。但是,熟悉抓取对你来说是一个很好的练习。
还有一些已经用 Python 构建的方便的工具,例如wttr.in。查看本教程以了解如何使用它。
【如何在Python中从Google中提取天气数据(代码示例)】相关:  如何在 Python 中制作电子邮件提取器。
Python如何从Google提取天气数据?好的,让我们开始吧,安装所需的依赖项:

pip3 install requests bs4

Python从Google提取天气数据?首先,让我们做一点实验,打开一个谷歌搜索栏,输入例如:“weather london”,你会看到官方天气,让我们右击查看HTML代码,如下图所示:
如何在Python中从Google中提取天气数据(代码示例)

文章图片
注意:Google 没有合适的天气 API,因为它还会从 weather.com 中抓取天气数据,因此我们基本上是从它那里抓取数据。
Python如何从Google提取天气数据?你将被转发到负责显示地区、日期和小时以及实际天气的 HTML 代码:
如何在Python中从Google中提取天气数据(代码示例)

文章图片
太好了,让我们尝试在 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="https://www.lsbin.com//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 = https://www.lsbin.com/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 中访问维基百科页面!

    推荐阅读