美文网首页
3-3homework

3-3homework

作者: OldSix1987 | 来源:发表于2016-08-20 10:54 被阅读17次

    结果


    Result

    代码


    # coding: utf-8
    
    
    import pymongo
    import charts
    from string import punctuation
    from datetime import timedelta, date
    
    client = pymongo.MongoClient('localhost', 27017)
    ganji = client['ganji']
    item_info = ganji['item_info']
    
    pub_dates = []
    for i in item_info.find():
        if ('pub_date' in i and i['pub_date'] != '') and i['pub_date'].find('发布') == -1:
             pub_dates.append(i['pub_date'])
             print(i['pub_date'])
             frags = i['pub_date'].split('-')
             date = '2016.{}.{}'.format(frags[0],frags[1])
             item_info.update_one({'_id':i['_id']},{'$set':{'pub_date':date}})
         else:
            date = '2016.01.01'
            item_info.update_one({'_id':i['_id']},{'$set':{'pub_date':date}})
     print(pub_dates)
    
    
    def get_all_dates(date1, date2):
        the_date = date(int(date1.split('.')[0]),int(date1.split('.')[1]),int(date1.split('.')[2]))
        end_date = date(int(date2.split('.')[0]),int(date2.split('.')[1]),int(date2.split('.')[2]))
        days = timedelta(days=1)
        
        while the_date <= end_date:
            yield (the_date.strftime('%Y.%m.%d'))
            the_date = the_date + days
    
    
    def get_data_within(date1, date2, areas):
        for area in areas:
            area_times = []
            for date in get_all_dates(date1,date2):
                a = list(item_info.find({'pub_date':date, 'area':area}))
                each_day_area = len(a)
                area_times.append(each_day_area)
            data = {
                 'name': area,
                 'data': area_times,
                 'type': 'line'
             }
            yield data
    
    
    for i in get_data_within('2016.08.18','2016.08.19',['朝阳','海淀']):
        print(i)
    
    
    areas_ori = []
    for i in item_info.find({}, {'area': 1, '_id': 0}):
        if len(i['area']) > 1 and i['area'][1] != '':
            areas_ori.append(i['area'][1])
        else:
            areas_ori.append('不明')
    
    area_indexs = list(set(areas_ori))
    
    options = {
          'chart': {'zoomType': 'xy'},
          'title': {'text': 'Monthly Average Temprature'},
          'subtitle': {'text': 'Source:WorldClimate.com'},
          'xAxis': {'categories': [data for data in get_all_dates('2016.08.18', '2016.08.19')]},
          'yAxis': {'title': {'text': '数量'}}
    }
    
    series = [data for data in get_data_within('2016.08.18', '2016.08.19', area_indexs)]
    charts.plot(series, show='inline', options=options)
    

    总结


    1. 思路:

    折线图参数需求,data字段需要一个list

    折线图.png
    • 我们的需求是获取一段时间内,不同的区域的发帖量,那么简化的伪代码应该是这样的:
     for date in dates:
          一个区域的发帖量
    
    多个区域,一段时间的发帖量就是:
    
    for area in areas:
           for date in dates:
                一个区域的发帖量
    

    下面需要解决的就是,怎么获得一段时间,以及怎么获得多个地区的发帖量

    • 一段时间的获取
    // 设置起始日期 和 结束日期, 然后把这一段时间分别yield即可,
    // 并且这个的日期格式要和数据库中的'pub_date'对齐,这里还需要做的一步就是将数据库中的pub_date格式统一更新。
    
    def get_all_dates(date1, date2):
        the_date = date(int(date1.split('.')[0]),int(date1.split('.')[1]),int(date1.split('.')[2]))
        end_date = date(int(date2.split('.')[0]),int(date2.split('.')[1]),int(date2.split('.')[2]))
        days = timedelta(days=1)
        
        while the_date <= end_date:
            yield (the_date.strftime('%Y.%m.%d'))
            the_date = the_date + days
    
    // 更新pub_date的格式
    pub_dates = []
    for i in item_info.find():
        if ('pub_date' in i and i['pub_date'] != '') and i['pub_date'].find('发布') == -1:
             pub_dates.append(i['pub_date'])
             print(i['pub_date'])
             frags = i['pub_date'].split('-')
             date = '2016.{}.{}'.format(frags[0],frags[1])
             item_info.update_one({'_id':i['_id']},{'$set':{'pub_date':date}})
         else:
            date = '2016.01.01'
            item_info.update_one({'_id':i['_id']},{'$set':{'pub_date':date}})
     print(pub_dates)
    
    

    由于赶集网的详情页面的更新,现在的发布日期抓取跟之前格式不太一样,且根据我的爬取数据(大概5w条左右),几乎日期比分散,主要是8月18号一天的数据,看之前的数据,每天的发帖不过几百条,但目前光朝阳区一天(8月18日)发帖就超过8000条,网站的不断变化给爬取分析数据也造成了一定的难度。

    • 获取最终的数据
    // 这里的思路就是,根据pub_date和area找到该区域在该日期下的发帖数量,进而得出在一段时间内的该区域的发帖数量,
    // 再最后得出,全部区域在一段时间内的发帖数量
    
    def get_data_within(date1, date2, areas):
        for area in areas:
            area_times = []
            for date in get_all_dates(date1,date2):
                a = list(item_info.find({'pub_date':date, 'area':area}))
                each_day_area = len(a)
                area_times.append(each_day_area)
            data = {
                 'name': area,
                 'data': area_times,
                 'type': 'line'
             }
            yield data
    

    2. date函数

    a = date(2016, 8, 20)
    print(a)
     // 2016-08-20
    
    b = a.strftime('%Y.%m.%d')
    print(b)
    // 2016.08.20
    
    d = timedelta(days=1)
    print(d) 
    // 1 day, 0:00:00
    

    3. and / or

    python中没有&& 和 ||,取而代之的是 and 和 or,而且处理在2个以上的条件时,记得要括号

    if ('pub_date' in i and i['pub_date'] != '') and i['pub_date'].find('发布') == -1:
          pass
    
    if 'key13' in a or 'key2' in a:
        print('true')
    

    4. key in dict

    python3中取消has_key方法,取而代之的是key in dict的方法,也是字典中最常用的方法之一。

    if 'key1' in a:
        print('true')
    

    相关文章

      网友评论

          本文标题:3-3homework

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