python爬天气网历史数据
程序员文章站
2022-07-13 15:40:41
...
#爬取天气网气象数据____聂拉木
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import pandas as pd
## 生成爬取网址
由于气象网数据的网站链接地址比较特殊,采用如http://lishi.tianqi.com/nielamu/201102.html 即 http://lishi.tianqi.com/ + 城市 + 时间的形式
所以首先生成爬取的网页的地址
#生成url链接
def year_month():
urllist = []
for i in range(2011,2018):
for j in range(1,13):
if j <10:
url_text = 'http://lishi.tianqi.com/nielamu/'+str(i)+'0'+str(j)+'.html'
else:
url_text = 'http://lishi.tianqi.com/nielamu/'+str(i)+str(j)+'.html'
urllist.append(url_text)
return urllist
url_list = year_month()
#到现今共可取url_list[0:79]
url_list[1:5]
[‘http://lishi.tianqi.com/nielamu/201102.html’,
‘http://lishi.tianqi.com/nielamu/201103.html’,
‘http://lishi.tianqi.com/nielamu/201104.html’,
‘http://lishi.tianqi.com/nielamu/201105.html’]
如下图网站中的数据保存在如下表格中
查看源代码发现 所需的数据在 div的tqtongji2 下
因此使用BeautifulSoup解析网页源代码,并且使用find函数寻找 div class=”tqtongji2” 标签
然后继续使用find_all函数解析ul 标签, ul标签内包含了所需数据
#获取天气网下天气情况部分的数据
def weather_scraping(url):
html = urlopen(url)
bsObj = BeautifulSoup(html.read())
div = bsObj.find("div",'tqtongji2')
ul = div.find_all('ul')
return ul
可以看出weath_scraping函数 返回的是一个list 包含了div 下的每个 ul标签
weul = weather_scraping(url_list[0])
isinstance(weul , list)
True
解析每一个ul标签,用get_text函数取出li标签下的数据,然后保存为datafram 格式
#解析获取的ul标签内数据 , 返回datafram 格式数据
def analysis_ul(url):
ul = weather_scraping(url)
weather_list = []
for ul_text in ul[1:]:
li_text = ul_text.find_all('li')
day_data = []
for text in li_text:
data= text.get_text()
day_data.append(data)
weather_list.append(day_data)
columns = [ i.get_text() for i in ul[0].find_all('li')]
weather_pd = pd.DataFrame(weather_list , columns=columns )
return weather_pd
## 遍历所有的网址 生成一个总的datafram 并保存
#爬取数据
weather_data = analysis_ul(url_list[0])
for i in url_list[1:79]:
data_month = analysis_ul(i)
weather_data = weather_data.append(data_month,ignore_index=1)
#保存数据
weather_data.to_csv('weather_201101_201707.txt' , index = False , sep = ',')
weather_data.head(7)
日期 | 最高气温 | 最低气温 | 天气 | 风向 | 风力 | |
---|---|---|---|---|---|---|
0 | 2011-01-01 | 3 | -7 | 晴 | 无持续风向~西风 | 微风~7-8级 |
1 | 2011-01-02 | 5 | -6 | 晴 | 西风 | 7-8级 |
2 | 2011-01-03 | 6 | -5 | 晴 | 西风~无持续风向 | 7-8级~微风 |
3 | 2011-01-04 | 4 | -6 | 晴 | 无持续风向 | 微风 |
4 | 2011-01-05 | 3 | -7 | 晴~多云 | 无持续风向 | 微风 |
5 | 2011-01-06 | 2 | -8 | 晴~多云 | 无持续风向 | 微风 |
6 | 2011-01-07 | 0 | -8 | 晴 | 无持续风向 | 微风 |
7 | 2011-01-08 | 0 | -13 | 晴 | 无持续风向 | 微风 |
7 rows × 6 columns
上一篇: Unity调试shader
下一篇: 记录两两相比问题