python爬天气网历史数据

#爬取天气网气象数据____聂拉木
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)
日期最高气温最低气温天气风向风力
02011-01-013-7无持续风向~西风微风~7-8级
12011-01-025-6西风7-8级
22011-01-036-5西风~无持续风向7-8级~微风
32011-01-044-6无持续风向微风
42011-01-053-7晴~多云无持续风向微风
52011-01-062-8晴~多云无持续风向微风
62011-01-070-8无持续风向微风
72011-01-080-13无持续风向微风

7 rows × 6 columns

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值