通过python爬虫程序爬取未来几日的天气状况

需求分析

昨天,我做了一个天气预警信息的爬取,这个程序可以获取高温,或者其他极端的天气的预警信息情况。但是呢,其中有一位小伙伴就和我说,他希望不只能看到天气预警信息,也希望能够看到当前的天气状况,这样这个程序会比较方便,希望我能再出一期爬取天气状况的文章

其实,在昨天爬取天气预警信息的时候,我首先已经考虑过了爬取天气状况,但是由于这个功能有一些麻烦,所以昨天没能成功实现

具体的困难在于什么地方呢?简单来说就是,单纯获取天气状况不是什么困难的事情,困难的地方在于,如何让使用者选择地区呢?

如果我们打开地区状况,我们会发现这个范围是很广泛的,具体到了每个市里面有每个区,每个区里面甚至还有具体的区域甚至景点。比如说,著名的景点,故宫博物院就有单独的天气状况信息,我们在程序中应该如何接受用户提交的地点信息情况呢?

有两种选择,第一种情况,我们只提供有限的地点以供选择,比如说,我们将所有可以提供天气状况的区域保存到一个列表中,可能这个列表中有几十个或者几百个地点,使用者只可以从这个地点中进行选择。与此同时,我们可能还需要为其配备一套查询系统,以便于匹配用户提供的地点信息,这种方式的缺点在于能够保存的地点通常不是很多,而用户使用起来呢也有困难,他需要不断去我们的列表中进行选择

第二种情况呢,就比较特别了,我们不保存任何的地点信息,我们也不知道用户提供的是否是一个可行的地点。也就是说,无论使用者输入了什么地点,我们都将这个地点原封不动的写入到爬虫程序中。这样的好处在于,我们不用判断地点信息是否有效,也不需要保存任何的额外信息。如果能够通过这个地点成功的爬取到数据,我们就返回数据,如果没办法通过这个地点获取到数据,那么就显示无数据。但这似乎不是一个好办法,这是在推卸责任

另外的一个困难还在于,我们如何接受用户的地点信息呢?每次在使用这个程序之前,要求用户必须要先输入一段内容,然后再使用程序吗?这样合适吗?会不会给使用者带来很大的负担呢?这些都是需要考虑的问题

因此,在面对这种困难的情况,没有办法作出一个有效的抉择,因此遭遇到了困难,现在我仍然没有一个好的方案

页面分析

俗话说得好,在自己不能解决问题的情况下,就应该多听取别人的意见,这样我们可能就有思路了。我也是向小伙伴征求了一下意见,看看怎么样解决这个问题才好

一个小伙伴和我说,”这有什么困难的呢?我们就像提供天气的网站一样,使用提供的默认的地点不就解决了吗?“

我一听,对啊,这样既不用使用者额外输入信息了,还能大概率得到一个正确的,使用者希望的内容,这是好事情啊,为什么不这样做呢?

除了地点以外,我们还需要获得天气的更新时间,这样有助于帮助我们了解这个天气状况是在何时更新的。因为,众所周知,天气预报不是一件容易的事情,天气随时都会发生很大的变化,可能前一小时的天气预报中说要下雨,下一个小时的天气预报中就改为了晴天。因此,获取到更新时间是很重要的

然后就是一些常规的天气信息了,比如说当前温度,最近几日的最高温,最低温等等,这是天气预报中最常见的情况,自然不必多说

实现分析

有了昨天经验以后,今天自然也是容易了很多,也不用纠结使用什么发起请求了,就直接用上selenium解决问题吧,当然,除了速度慢一些以外,selenium在使用上的困难程度和requests也相差无几

from selenium import webdriver

driver = webdriver.Chrome()
driver.get(url)

那么,在成功发送完了请求之后,应该怎么办呢?很多人可能又会想,是不是应该通过find_element_by_xxx获取数据了呢?其实没有必要,我们不需要使用selenium的find_element_by_xxx的功能来获取数据,我们只需要通过driver.page_source得到页面的源代码,然后直接拿去解析就行了,这是一个很好的方法,没有必要说既然selenium已经提供了获取方法了,那就用它呗

因此,我们还是通过lxml中的xpath获取数据

html = etree.HTML(driver.page_source)

# 以下就开始正常的从页面中提取数据

到了这一步,正常来说就已经很简单了,当然,由于我们使用的是selenium打开了浏览器,因此在最后也不要忘记了关闭浏览器,也就是调用driver.quit(),至此我们的功能就已经全部实现了

完整代码展示

from base64 import b64decode
from selenium import webdriver
from lxml import etree

driver = webdriver.Chrome()

driver.get(b64decode("aHR0cDovL3d3dy53ZWF0aGVyLmNvbS5jbg==").decode())

html = etree.HTML(driver.page_source)

# 这一步很重要,打开了浏览器就要记得关掉,保持这样一个好习惯
driver.quit()

# 获取所在地区
c = html.xpath("//span[@id='cityName']/text()")[0]
print("当前所在地:", c)

# 获取更新时间
t = html.xpath("//div[@class='updataTimeDiv']/span/text()")
print("天气的更新时间:", " ".join(t))

# 获取风力和湿度
f = html.xpath("//div[@class='weatherRow']/span/text()")
print("状况:", " ".join(f))

# 获取未来几天的天气状况
d = html.xpath("//div[@class='dataRow']/div[@class='dataLi']/text()")
d.insert(0, "今天")

# 获取天气中的最高温度
h = html.xpath("//div[@id='topTemp']//tspan/text()")

# 获得天气中的最低温度
l = html.xpath("//div[@id='lowTemp']//tspan/text()")

for i in range(len(d)):
	print(d[i], h[i], "-", l[i])

以下是程序运行的结果展示

 感觉还可以,虽然不算美观,但至少简洁明了,我们需要的天气预报功能就实现了


多数爬虫程序很快就会由于对方地址和服务变化导致失效,因此无法保证当你看到这篇文章时,文中的程序仍然可以使用。如果文中的程序已失效,需要自行或者求助他人进行重写

另外,切勿将爬虫程序用于非法用途,或者错误的滥用造成对方网站的负担,谢谢!

来源:仙草哥哥

物联沃分享整理
物联沃-IOTWORD物联网 » 通过python爬虫程序爬取未来几日的天气状况

发表评论