环境 win10,anaconda3(python3.7)
IDE:spyder
爬取网址:http://finance.sina.com.cn/7x24/
抓取最近的新闻
方法思路,截取js文件,破解url含义,get请求并将数据json解析
此版本留下了获取历史信息的api,并没有对最终数据进行处理。
# -*- coding: utf-8 -*-
"""
Created on Wed May 22 14:27:02 2019
@author:hanginghang
"""
'''
version:2.0
代码重新架构,把脚本封装为函数以方便处理数据
增加了测试模块,以防止网络波动导致的代码运行中断
'''
lastdateid = '0'
import requests
import json
import time
#获取最新消息的地址
base_url_new = 'http://zhibo.sina.com.cn/api/zhibo/feed?\
callback=jQuery0&page=1&page_size=1&zhibo_id=152\
&tag_id=0&dire=f&dpc=1&pagesize=1&_=0%20Request%20Method:GET'
#自定义js提取页
'''
输入请用str格式
oldnum_str:此数字或者是以现在为计时之前的页数
thispagesize:此次取的js数据页的数据数
oldpagesize:原来的js数据页的数据数目
'''
'''
#此url的数据中会存在thispagesize_str条信息,比最新信息早 oldnum_str* oldpagesize_str条
#oldnum_str max 527999
'''
def myurl(oldnum_str,thispagesize_str,oldpagesize_str):
my_url_a = r'http://zhibo.sina.com.cn/api/zhibo/feed?\
callback=jQuery0&page='
my_url_b = r'&page_size='
my_url_c = r'&zhibo_id=152&tag_id=0&dire=f&dpc=1&pagesize='
my_url_d = r'&_=0%20Request%20Method:GET'
my_url = my_url_a+oldnum_str+my_url_b+thispagesize_str+my_url_c+oldpagesize_str+my_url_d#获取往前的第n条消息
return my_url
i = 1 #本代码运行后得到的数据量标号
n = 1 #等待时间标号一个为5s
#从js数据包中获得json数据
def get_json_str(base_url):
json_str =''
try:
response = requests.get(base_url,timeout=5)
html = response.text
html_cl = html[12:-14]
html_json = eval(html_cl)
json_str = json.dumps(html_json)
except ConnectionError:
print('get_json_str得到数据时网络连接有问题,未得到json数据')# 此处数据穿送出去为了后期处理
except UnboundLocalError:
print('get_json_str您的电脑休眠导致连接中断')# 此处数据穿送出去为了后期处理
except Exception as errorname1:
print('get_json_str未收录错误类型,请检查网络通断,错误位置:',errorname1)
#print(errorname1)# 此处数据穿送出去为了后期处理'''
finally:
return json_str
'''
json 数据解析函数
输入:json类型的str数据
数出:以数据id作为key的字典
'''
def json_str_analysis(json_date):
date_dic={}
try:
python_dic = json.loads(json_date) #先拆分为主字典
list_str=python_dic["result"]['data']['feed']['list'] #取数据列表
'''
重新整定字典
date_dic=
{数据在新浪数据库的id:{'id': ,
'rich_text': ,
'create_time': ,
'tag':{} ,
}}
'''
for list_dic in list_str:#对list的多组数据解析
need_option=['id','rich_text','create_time','tag']#定义需求关键词
for listkey in list(list_dic.keys()):#字典在遍历的时候不能修改元素,此处先编程列表在变回字典
if listkey not in need_option:
list_dic.pop(listkey)
date_dic[list_dic['id']]=list_dic
except ValueError:
print('json_str_analysis json数据格式不对无法解析')
except Exception as errorname2: # 将报错存储在errorname2中
print('json_str_analysis未知问题',errorname2)
finally:
return date_dic
def list_dic_display(listdic):
create_timez_str=tag_id_str=type_str=rich_text_str=data_id_str=''
#下面为解析出来的数据
data_id_str = listdic['id']
rich_text_str=listdic['rich_text']
create_timez_str = listdic['create_time']
tag_str = listdic['tag']
#tag对象可能有多个,此处用for解析
tag_id_str = []
type_str = []
for tag_dic in tag_str:
#print(tagpp)
tag_id_str.append(tag_dic['id'])
type_str.append(tag_dic['name'])
#有些段落有图片此处给出解析图片url的api
#multimedia_url=list_dic['multimedia']
#此处将数据打印出来
print('新浪数据库中id为',data_id_str,'的数据')
print('时间:',create_timez_str)
print('id:',tag_id_str,' 类型:',type_str)
print('内容:',rich_text_str)
return rich_text_str
if __name__=='__main__':
while(True):
json_date = get_json_str(base_url_new)
#print('json_date:',json_date)
if json_date:
jsaoutput_dic = json_str_analysis(json_date)
#print('jsaoutput_dic:',jsaoutput_dic)
if jsaoutput_dic:
for dataid in jsaoutput_dic.keys():
if (int(dataid)) <= (int(lastdateid)):
print('此次刷新没有获得数据,等待5s后将继续刷新',n)
time.sleep(5)
n=n+1
else:
try:
richtextstr = list_dic_display(jsaoutput_dic[dataid])
i = i+1
n=0
lastdateid=dataid
time.sleep(5)
except ValueError:
print('main处理数据错误')
except Exception as errorname3: # 将报错存储在 e 中
print(errorname3)
#print(output)
else:
print('jsa_flag为0,json_str_analysis解析数据失败')
print('等待5s后将继续刷新')
time.sleep(5)
else:
print('get_json_flag为0,get_json_str未能得到json数据')
print('等待5s后将继续刷新')
time.sleep(5)
结果如下: