3-3homework

2016-08-20  本文已影响17人  OldSix1987

结果


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')
上一篇 下一篇

猜你喜欢

热点阅读