python2.7通过模块获取好奇心日报的文章信息
困住我的点:不理解各个json数据url链接之间的相互关系,后面发现是这个last_key在这其中惹的祸,原来的时间戳,因此之后在处理过程中,就会大致明白,其实10位数字参与构成url地址的,我们就要考虑是不是时间戳了。
通过time模块获取当前时间的时间戳对应值
>>> import time
>>> time.time()
1536743737.845
>>> int(time.time())
1536743747
>>>
将我们的本地指定时间转换为时间戳:
>>> time1 = '1996-10-21 10:23:00'
>>> timeArr = time.strptime(time1, '%Y-%m-%d %H:%M:%S')
>>> timeArr
time.struct_time(tm_year=1996, tm_mon=10, tm_mday=21, tm_hour=10, tm_min=23, tm_sec=0, tm_wday=0, tm_yday=295, tm_isdst=-1)
>>> timeStamp = time.mktime(timeArr)
>>> timeStamp
845864580.0
>>> timeStamp = int(time.mktime(timeArr))
>>> timeStamp
845864580
将时间戳转换为'%Y-%m-%d %H:%M:%S'时间格式:
>>> timeStamp = 1533160253
>>> timeArr = time.localtime(timeStamp)
>>> time = time.strftime('%Y-%m-%d %H:%M:%S', timeArr)
>>> time
'2018-08-02 05:50:53'
>>>
#encoding=utf-8
import requests
import json
import re
from lxml import etree
# 遇到8位数字组成的数字可以考虑是否是时间戳参与构成了url地址
# 赋予初始的url地址
last_key = '1533160253'
# 设置一个循环的次数,获取指定时间段之间的qdaily中的文章信息,,获取从0-4共5个json数据,100条
for i in range(5):
url = 'http://www.qdaily.com/tags/tagmore/1068/%s.json' %last_key
# 用try包含我们请求的语句,从而可以在访问出错时,帮助我们确定位置
try:
r = requests.get(url)
r.encoding = r.apparent_encoding
except Exception as e:
print '获取信息失败'
# 将获取的json数据转换为python可以处理的格式,dict
content = json.loads(r.text)
info = {}
# 获取数据主体,即文章列表
data = content['data']['feeds']
# 对我们设置的每篇文章的数据信息进行提取
for item in data:
info['title'] = item['post']['title']
info['artical_id'] = item['post']['id']
# info['author_name'] = item['post']['author']['name']
info['super_tag'] = item['post']['super_tag']
info['comment_count'] = item['post']['comment_count']
info['praise_count'] = item['post']['praise_count']
info['category'] = item['post']['category']['title']
info['artical_url'] = 'http://www.qdaily.com/articles/%s.html' %info['artical_id']
# 拼接url地址 由于在json数据中无法得知文章作者信息,所以我们到文章源网页去寻找数据
artical_url = 'http://www.qdaily.com/articles/%s.html' %info['artical_id']
r = requests.get(artical_url)
# 通过lxml中的etree帮助我们将html文件转换为可以进行xpath查找的对象
html = etree.HTML(r.text)
# info['author_name'] = re.findall(r'<span class="name">(.+?)</span>', html, re.S)[0]
info['author_name'] = html.xpath('/html/body/div[3]/div/div[1]/div[2]/div[1]/div[1]/span[1]/text()')
# 在文件的同一级目录下打开一个文件用于写入我们获取到的数据信息
with open('test.json', 'a') as f:
data = data = json.dumps(dict(info), ensure_ascii=False) + '\n'
f.write(data)
f.close()
# 更新我们的last_keys进行下一个json数据的获取
last_key = content['data']['last_key']
# 输出一个json数据中第一个文章的标题,便于识别获取文章的位置
print info['title'] + '\n' + '%s文件写入完成' %last_key