美文网首页Python四期爬虫作业python爬虫日记本
python爬虫爬取中国天气网上海2017年天气

python爬虫爬取中国天气网上海2017年天气

作者: chengcxy | 来源:发表于2017-05-30 23:25 被阅读252次

    一、构造url

    这个作业本来端午节之前代码已经写完,当时观察页面请求的url'http://d1.weather.com.cn/calendar_new/2017/101020100_201701.html?_=1496154608683,这个url中数字101020100是城市在网站的城市id,201701是想查询的年月,1496154608683是一个时间戳,一开始构造url时候是将城市id固定,年月通过对12以内的数字遍历,时间戳通过time.time()转换为字符串,构造出12个月的url请求列表会遍历解析,后来发现城市id和时间戳写死,只需要变换年月就可以解析数据

    二、解析数据

    页面返回数据

    返回里面看着是json格式,但又不是,而是一个var fc40 =开头,后面是一个列表存储着各月份每天天气数据的字典元素,我采取的是下面的处理办法,对字符串进行处理,转换为字典存储。

    三、代码

    #coding:utf-8
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    import requests
    from lxml import etree
    import  json
    import time
    #测试将下面类注释掉
    from class_mysql import Mysql
    
    def get_data(url):
        try:
            html=requests.get(url,headers=headers).content
            html.decode()
            print html
            #将源码处理成字典形式字符串 json解析 将var fc40 = [ 和 ]去掉 
            #这样源码就是多个字典的字符串,这时候需要分割字符串时候以“},”为标识#符分割
    #判断结尾是否是},不是的话将字典闭合符补全 再用json解析
            html_str=html.lstrip('var fc40 = [').rstrip(']'.strip())
            dict_str=html_str.split('},')
            for i in dict_str:
                item={}
                if not i.endswith('}'):
                    json_str=i+'}'
                else :
                    json_str=i
                print json_str
                #转化为字典
                weather_data=json.loads(json_str)
                #和数据库字段保持一致 插入数据库
                for k in dict_index2.keys():
                    item[dict_index2[k]]=weather_data[k]
                print item
                project.insert(item)
        except Exception as e:
            print ("get_data函数解析错误 错误为 %s" % e)
    if __name__ == '__main__':
        dict_index={'nlyf':'农历月份',"nl":'农历日期','date':'阳历','time':'时间点','wk':'周几','hmax':'最高温度','hmin':'最低温度','hgl':'降水概率','alins':'财运','als':'婚姻'}
        dict_index2={'nlyf':1,"nl":2,'date':3,'time':4,'wk':5,'hmax':6,'hmin':7,'hgl':8,'alins':9,'als':10}
        field_list=['农历月份','农历日期','阳历','时间点','周几','最高温度','最低温度','降水概率','财运','婚姻']
        project=Mysql('shanghai',field_list,len(field_list))
        project.create_table() 
        sh_url='http://d1.weather.com.cn/calendar_new/2017/101020100_2017%s.html?_=1496154608683'
        headers={'Accept':'*/*',
        'Accept-Encoding':'gzip, deflate, sdch',
        'Accept-Language':'zh-CN,zh;q=0.8',
        'Connection':'keep-alive',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
        'Host':'d1.weather.com.cn',
        'Referer':'http://www.weather.com.cn/weather40d/101230808.shtml',
        'Cookie':'vjuids=-35cf735ec.15c3a674e60.0.ea0c2b4b0db22; f_city=%E5%8C%97%E4%BA%AC%7C101010100%7C; BIGipServerd1src_pool=1874396221.20480.0000; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1495628468,1495628495,1495642584; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1495642621; vjlast=1495628468.1495642583.13'
        }
        month_list=range(1,13)
        for month in month_list:
            if month<10:
                page=str(0)+str(month)
            else:
                page=str(month)
            url=sh_url%page
            get_data(url)
    

    四、解析存入数据库数据

    如果数据有重复的 sql根据日期聚合去重一下处理
    ![数据]](https://img.haomeiwen.com/i3888998/3e98c3925f8ba30d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    五、关于另外解析方法

    二组同学用了 json 反序化,具体见这篇文章
    Python作业 -- 天气预报爬虫

    相关文章

      网友评论

      本文标题:python爬虫爬取中国天气网上海2017年天气

      本文链接:https://www.haomeiwen.com/subject/sfhdfxtx.html