新浪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_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)

结果如下:
在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值