闲着没事做一个利用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)#获取数据
至此代码全部完成了,希望对你的学习有所帮助,如果有错误请及时指出,谢谢~