pymongodb的用法

作者: 王小鱼鱻 | 来源:发表于2017-07-09 16:34 被阅读231次

    今天主要是介绍一下mongodb的使用,通过爬取中国天气网的你所在城市一年的天气历史数据,可以简单掌握mongodb的使用;

    windows下MongoDB的安装及配置这个介绍的挺详细的,基本一看就懂;
    mongodb启动后,下面来分析一下要爬的网址
    主要是这个3个点吧:
    1、首先分析一下这个天气的网页数据,

    Paste_Image.png

    从这里可以看出主要是json数据,这个就方便多了;
    2、下面分析一下如何每个月的数据,


    这里可以得到每个月天气的url
    3、还有这个请求的时候,记得要用postman请求一下,确认下请求的headers需要带哪些头部数据;
    下面是存到本地csv的代码:

    import requests
    import json
    import csv
    
    
    class Weather():
    
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36',
            'Referer': 'http://www.weather.com.cn/weather40d/101010100.shtml'
        }
        #新建列表,用来存储获取的数据
        a = []
    
        #获取一年的天气数据
        def get_data(self):
            global year
            year = input('请输入年份:')
            month = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
            for i in month:
                url = 'http://d1.weather.com.cn/calendar_new/' + str(year) + '/101280601_' + str(year) + str(
                    i) + '.html?_=1496558858156'
                html = requests.get(url, headers=self.headers).content
                global datas
                #天气信息的json数据
                datas = json.loads(html[11:])
                self.get_info()
    
        #获取天气的具体数据
        def get_info(self):
            for data in datas:
                date = data['date']
                date2 = data['nlyf'] + data['nl']
                hgl = data['hgl']
                hmax = data['hmax']
                hmin = data['hmin']
                alins = data['alins']
                als = data['als']
                info = {
                    '日期': date,
                    '农历日期': date2,
                    '降水概率': hgl,
                    '最高温度': hmax,
                    '最低温度': hmin,
                    '宜': alins,
                    '不宜': als,
                    }
                #去重,获取一年的数据
                if info not in self.a:
                    if info['日期'][:4] == year:
                        self.a.append(info)
    
    
    if __name__ == '__main__':
        sz = Weather()
        sz.get_data()
        #存储到本地的csv文件
        csv_name = ['日期', '降水概率', '最高温度', '最低温度', '农历日期', '宜', '不宜']
        with open('weather_sz.csv', 'w',  newline = '',encoding='utf-8')as csvfile:
            write = csv.DictWriter(csvfile, fieldnames=csv_name)
            writer = csv.writer(csvfile)
            write.writeheader()
            write.writerows(sz.a)
            csvfile.close()
    
    

    运行结果:

    2017深圳一年的天气数据.png

    下面在这个基础上存储到mongodb,

    import requests
    from lxml import etree
    import json
    import pymongo
    
    
    # 连接到Mongo
    conn = pymongo.MongoClient(host = 'localhost', port = 27017)
    # 选择或创建数据库
    weather = conn['weather']
    # 选择或创建数据集合
    newsdata = weather['weather_infos']
    
    class Weather():
    
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
                        'Referer': 'http://www.weather.com.cn/weather40d/101280601.shtml'
            }
        # 新建列表,用来存储获取的数据
        all_info = []
    
        def __init__(self):
            pass
    
        # 获取一年的天气数据
        def get_data(self):
            global year
            month = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
            for i in month:
                url = 'http://d1.weather.com.cn/calendar_new/' + str(year) + '/101280601_' + str(year) + str(
                    i) + '.html?_=1496558858156'
                html = requests.get(url, headers=self.headers).content
                global datas
                datas = json.loads(html[11:])
                self.get_info()
    
        # 获取天气的具体数据
        def get_info(self):
            for data in datas:
                date = data['date']
                date2 = data['nlyf'] + data['nl']
                history_rain = data['hgl']
                history_max = data['hmax']
                history_min = data['hmin']
                tmax = data['max']
                tmin = data['min']
                time = data['time']
                w1 = data['w1']
                wd1 = data['wd1']
                alins = data['alins']
                als = data['als']
                info = {
                        '日期': date,
                        '农历日期': date2,
                        '降雨概率': history_rain,
                        '历史最高': history_max,
                        '历史最低': history_min,
                        '最高温度': tmax,
                        '最低温度': tmin,
                        'time': time,
                        'w1': w1,
                        'wd1': wd1,
                        '宜': alins,
                        '忌': als,
                    }
                #先把去重的数据存储到列表all_info
                if info not in self.all_info:
                    if info['日期'][:4] == year:
                        self.all_info.append(info)
    
        #再把列表的数据存到mongodb
        def store_mongodb(self):
            self.get_data()
            for one_info in self.all_info:
                newsdata.insert_one(one_info)
    
    
    if __name__ == '__main__':
            year = '2017'
            tianqi = Weather()
            tianqi.store_mongodb()
    
    
    

    运行的结果:

    2017深圳一年的天气数据.png

    小结:
    1、存到本地和mongodb对比后,发现差别不是很大,只是多了连接到mongodb和存储到mongodb的语句;主要这里没有涉及数据库的其他操作,所以看起来差别不大;
    2、MongoDB 教程
    3、pymongdb的使用——数据去重
    4、MongoDB的学习
    5、mongodb的可视化工具:
    MongoVUE 、Mongo Management Studio,工具有很多,其他的可自己查找;

    相关文章

      网友评论

        本文标题:pymongodb的用法

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