结果
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. 思路:
折线图.png折线图参数需求,data字段需要一个list
- 我们的需求是获取一段时间内,不同的区域的发帖量,那么简化的伪代码应该是这样的:
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')
网友评论