环境 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 Request Method: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 Request Method: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)结果如下: