Python Bs4 爬取天气数据

2020年09月29日 131点热度 0人点赞 0条评论

现今我生活在大数据时代的社会中,许多数据都是在我们日常生活中产生的,这些数据都非常的珍贵,而今天我来分享之前使用Python来爬取的天气数据,而我为什么会使用Beautiful Soup来爬取天气数据呢?因为这数据是在一个表格当中,而Beautiful Soup专为HTML或XML文件中提取数据而生。

我们经常使用的智能手机,智能音箱,你可能有尝试过对它们说:Hey!Google,今天天气如何?小爱,今天会下雨吗?....而这些数据都是从卫星导航中获取的,那么既然数据有了,那么各大天气数据网中的数据我们便可以自由的爬取。

那么,我就来带大家示范爬取欣欣旅游网中的马来西亚天气预报。

我们先来看看这张表:

在这张表中,我们可以知道这几天内我们所在的城市地区的温度,天气是小雨,大雨还是阴天。那么有这些数据了,我们接下来就是来分析这个网站中天气表的结构是怎样的,我打开抓包工具后,定位了这个表中的元素。

能够发现在这个表中,数据都是在td标签中,并且每一个城市栏都在tr标签下。我大概了解了整个表的结构,那么接下来我便想要获取整个表单,并在表单中寻找标签获取这些数据。如下图所示,我们整个表的数据就在div标签下的class=“side_con"。

好的呢,现在我们大致上已经分析好了,我便可以开始写代码了,首先我们需要先来导入所需要用到的模块:

import requests
from bs4 import BeautifulSoup

以上这两个模块Python是没有自带的噢,我们需要事先进行安装,安装方法可见我之前发的学习笔记。

接下来,先来义函数解析网页:

def parse_page(url):
    pass

def main():
    pass

if __name__ == '__main__':
    main()

在当我们不知道要写什么的时候,我们可以使用pass语句先来略过。

接下来的代码都是我经过测试运行的。

def parse_page(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
    }

    # url = 'https://tianqi.cncn.com/malaixiya.htm'
    response = requests.get(url, headers=headers)
    html = response.content.decode('gbk').replace('<br>', ' ')
    bs4 = BeautifulSoup(html, 'lxml')

    # print(bs4.prettify())
    # 一、网页接卸
    side_con = bs4.find('div', class_='side_con')
    # 二、取Tr
    trs = side_con.find_all('tr')[2:]
    # print(trs)

    for tr in trs:
        # print(tr)
        city = tr.a.string
        wd = tr.find('td', class_='wd').string
        tq = tr.find('td', class_='tq').string

        print('地区:', city, '温度:', wd, '天气:', tq)

如果在一个爬虫我们多次进行请求,那么可能就会被对方服务器认定你是爬虫,可能就会对付你,封锁你的IP之类的,那么我们可以事先把整个网页的源代码拷贝一份在自己的本地文档中,那么就能进行多次的测试也不会被对方服务器发现噢!

当然我们也不能忘了设置请求头信息(Header),用来仿拟一个浏览器进行访问。

使用Beautiful Soup来查找到我们要的元素后,可以循环获取所有城市的温度与天气的值。在这里我就遇到了一个坑,这个坑呢就是在天气数据里多了一个br标签,因此没有办法直接取到String值。

我就被折腾了一番,测试了许多次,终于找到破解之法,那就是在请求HTML代码时,直接把所有的br标签都替换为空。

接着来看看main函数:

def main():

    url = ['https://tianqi.cncn.com/malaixiya.htm']

    for urls in url:
        parse_page(urls)

在这里我把URL地址封装在了列表里,这样我们就能通过不同的URL地址来访问网站,获取数据,可能是马来西亚的天气数据,也能是中国等其它城市地区的数据。

通过循环便能一一实现的一次性爬取所有数据啦!嘻嘻~

效果图:

YenYoong☕

当你能梦的时候就不要放弃梦~😎

文章评论