Python构建爬虫模型爬取天气数据

闲着没事做一个利用ANN模型对天气变化做一个预测模型,预测模型的代码见下一篇Python构建ANN模型预测气温变化,因为没有现成的数据集,所以想到了去天气预报网站上天气预报网爬取某个城市气温,作为数据集来源,并利用tensorflow中现成的人工神经网络的模块构建一个简易的预测模型。这里以上海的天气为对象爬取。

先贴一个上海天气的页面,可以看到每天的最高气温和最低气温,这里以上海10月份的天气为例。
在这里插入图片描述

写好我们的爬虫代码,把当前页面的网址粘贴到代码中,如下。

import requests
url="http://www.tianqihoubao.com/lishi/shanghai/month/202010.html"
re=requests.get(url)
print(re.text)

当然这个代码返回的是当前的整个页面内容包括了页面显示的内容和网页代码框架,所以我们需要一个专门的网页代码解析工具,叫BeautifulSoup,如下:

import requests
from bs4 import BeautifulSoup
url="http://www.tianqihoubao.com/lishi/shanghai/month/202010.html"
re=requests.get(url)
html = re.content.decode('gbk')#规范编码,避免乱码
soup = BeautifulSoup(html,'html.parser')

这样的功能是相当于soup拥有了网页解析功能,直接输出soup内容还是网页代码内容,但是不同于re.text的是拥有了网页解析能力,我们现在解析网页内容。
直接输出print(soup)查看网页内容,并且找到和气温相关的部分,如下:
在这里插入图片描述

可以看到从网页代码结构来看,我们对应的天气部分是被形如:< tr >XXXXX< /tr >的结构包围起来了,那么我们就需要获取其中的内容,用到了

data=soup.find_all('tr')

这行代码的功能是利用BeautifulSoup的解析功能,将形如< tr >XXXX< /tr >的内容提取出来,如果有多个内容,比如:< tr >X1< /tr > < tr >X2< /tr >,那么返回的结果就是data=[’< tr >X1< /tr >’ ,’< tr >X2< /tr >’],希望方便你理解。

于是我们输出data的内容如下:
在这里插入图片描述

然后我们只需要本文内容,不需要网页代码内容,也就是< X >这样的内容不需要,直接输出data[i].text,注意这里是数组,所以每个部分单独.text

print(data[0].text)

结果为
在这里插入图片描述

中间有一些空格或者分隔符,其实data[0].text返回的就是一个字符串,所以直接data[0].text.split()就可。

print(data[0].text.split())

在这里插入图片描述

是否这样就变得有趣多了,因为这样很方便了我们提取具体内容。
因为这个部分data[0]没有气温数据,我们需要从data[1]开始,显示data[1].text.split()内容如下:
在这里插入图片描述我们看到两个气温对应的位置分别是3和5(下标从0开始),并且提取的气温后面有个温度符号是不需要的,不显示

temp=data[1].text.split()
temp1=temp[3]
temp2=temp[5]
print(temp1[:-1],temp2[:-1])

显示结果如下:
在这里插入图片描述
到这里我们的气温数据就彻底提取成功辣。
那么针对当前这个页面所有的气温数据呢,就直接循环处理,完整代码如下:

import requests
from bs4 import BeautifulSoup
url="http://www.tianqihoubao.com/lishi/shanghai/month/202010.html"
re=requests.get(url)
html = re.content.decode('gbk')#规范编码,避免乱码
soup = BeautifulSoup(html,'html.parser')
data=soup.find_all('tr')
for i in range(1,len(data)):#因为data[0]没有气温数据
    temp=data[i].text.split()
    temp1=temp[3]
    temp2=temp[5]
    print(temp1[:-1],temp2[:-1])
    

运行如下:
在这里插入图片描述
那么如何方便的提取其他界面的气温数据呢?我们来观察网址,其实很多网址的设计都是这样的,就是网址都是用数字进行页面编排,观察网址

http://www.tianqihoubao.com/lishi/shanghai/month/202010.html

其中202010.html,202010是不是类似于2020年10月份呢?好像是的,你点击其他界面,显示的网址也是这样的规律,说明网站的网址查询就设计成了这样,那么对于我们爬取数据就会很方便,其次,可以看到其中有"shanghai"的汉字拼音,对于查询其他城市也非常方便。

我们直接把爬虫定义成一个完整函数:

import requests
from bs4 import BeautifulSoup
def get_data(city_name,tim):
    url="http://www.tianqihoubao.com/lishi/"+city_name+"/month/"+tim+".html"
    re=requests.get(url)
    html = re.content.decode('gbk')#规范编码,避免乱码
    soup = BeautifulSoup(html,'html.parser')
    data=soup.find_all('tr')
    for i in range(1,len(data)):#因为data[0]没有气温数据
        temp=data[i].text.split()
        temp1=temp[3]
        temp2=temp[5]
        print(temp1[:-1],temp2[:-1])#后来爬数据发现某天的某个气温不存在,这里需特判下是否为空
city_name="shanghai"
for year in range(2015,2020):#时间从2015年到2019年
    for month in range(1,13):#时间从1月到12月
        tim=str(year)
        if month<10:
            tim+=("0"+str(month))
        else:
            tim+=str(month)
        get_data(city_name,tim)#获取数据


至此代码全部完成了,希望对你的学习有所帮助,如果有错误请及时指出,谢谢~

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值