新浪24小时财经爬虫源码
环境 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_urli = 1 #本代码运行后得到的数据量标号
n = 1 #等待时间标号一个为5s#从js数据包中获得json数据
def get_json_str(base_url):json_str =''try:response = requests.get(base_url,timeout=5)html = response.texthtml_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_dicexcept ValueError:print('json_str_analysis json数据格式不对无法解析')except Exception as errorname2: # 将报错存储在errorname2中print('json_str_analysis未知问题',errorname2)finally:return date_dicdef 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_strif __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+1n=0lastdateid=dataidtime.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)
结果如下:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
