当前位置:首页 > 生活百科

ajax发送json数据实例(ajax传输json数据格式)

栏目:生活百科日期:2025-02-27浏览:0

在第一篇文章中,我总结了最近学到的利用requests和bs4第三方库共同作用,基本可以应对python获取静态网页数据的相关问题。但是如果现实中的网页往往比想象中复杂的多,网页也早已不再是纯静态网页。

就比如在第一篇文章中爬取的网易云课堂计算机专业大学课程中,如果我们进一步爬取计算机专业可以就业的岗位信息时,通过开发者工具,我们发现,我们所需要的数据位于id=&”j-smartSpec&” 的p中,

然而,我们利用之前的方法进行会发现最后得到的list为空,那么我们检查一下源代码,好不容易找到了意料之中的标签id,但是我们惊奇的发现,里面什么都没有呀:

好气呀!~可是对于渴望获取想要的数据的决心,我们当然要有一探究竟的耐心的啦~经过多种方式,我们肯定会了解到这是AJAX在捣鬼,AJAX 是一种用于创建快速动态网页的技术。 这种技术使我们可以通过在后台与服务器进行少量数据交换,从而使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,浏览器可以对网页的某部分进行更新。

此时想要获取数据,就要考虑它是通过什么传递新的信息给我们。

实际就是python对动态网页、异步加载的爬取。

————————————————————————————————真^分界线

以上引出本文的主题。

正文

一、方法分析

其实任何动态产生的内容,要么是本地计算,要么是从服务器获取的。前者看js,后者需要抓包。而后者经常配上各种参数加密,不过既然浏览器能正确发送参数,那么就证明肯定有办法模拟(当然不容易)。如果有能力,模拟发包。如果嫌麻烦,用现成的包来模拟操作浏览器。

那么通常来讲,获取动态数据有两种思路或者说是方法:

1. 分析页面请求 2. 利用selenium模拟浏览器行为或其他抓包工具直接获取(比较暴力有没有)

效率最高的就是分析出请求数据的URL 一般都可以 而selenium 实在没辙的时候再用。

本篇文章也仅对第一种方法进行介绍(当然是要实货,不动手是没有用滴),若之后几天仍然很闲,会继续介绍下一种方法

二、开始战斗(目标:股票|上海证券交易所)

说了半天,总算要开始了。一年之计在于春,一天之计在于晨。

我们起码要先确定一个方向,看了一下目标页面:

有用的就是公司代码,公司简称,A股代码,A股简称以及A股总资本和A股流通资本这几项。

所以我们的目标就是爬它30页,这些信息全部都要。

三、寻找数据位置

还是以前的基本思路,首先在页面找准数据位置检查,找到标签所在位置,在前言中我们大概也有了些许经验,这时我们试探地打开源代码,这次看到什么都没有似乎也不那么生气了~

接下来是没有介绍过的东西!!即分析出AJAX加载出的文件是哪一个:

如图,在开发者工具Network中的JS中分析,如果感觉实在太多文件不好分析,那么我们发现上面有上市A股点击会小范围刷新的现象,最终可以完全明确目标

这样一来,我们可以说是完成了一半了(其他如果轻车熟路就基本没有什么了)

下一步就是打开目标验证一下有没有我们需要的数据

What????这又是啥情况

嘿嘿,这真的心里又是一惊,403码表示什么呢,就是我们没有权限浏览目标地址。这是网站的自我保护行为。

那咋办呢?我们没有权限啊,可是我们在自己原来的页面不是可以获取这些的嘛!

所以,这里就用到了让我们的虫去模拟人的操作。在前篇一笔带过,其实就是通过修改Request-Headers中Cookie,User-Agent,Referer等信息来使我们的访问请求就像是真人访问一般。而需要修改的内容可以在Headers中查看:

则可保存如下:

headers={&‘Cookie&’:&’yfx_c_g_u_id_10000042=_ck18012900250116338392357618947; VISITED_MENU=%5B%228528%22%5D; yfx_f_l_v_t_10000042=f_t_1517156701630__r_t_1517314287296__v_t_1517320502571__r_c_2&′,

&‘User-Agent&’:&’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36&′,

&‘Referer&’:&’http://www.sse.com.cn/assortment/stock/list/share/&’

}

通常包含这三个元素即足以证明是‘人’。这样我们已经可以找的到数据了。

四、处理分析数据(将数据JSON格式化并解析JSON)

好了,数据找到了,并且我们可以在开发者工具preview中看到,数据储存为JSON格式(JSON格式的数据本质上是一种被格式化了的字符串,遵循一定的语法规则),现在我们先按照原来的方法先利用requests先获取到数据:

import requests

url=&’http://query.sse.com.cn/security/stock/getStockListData2.do?&&jsonCallBack=jsonpCallback99887&&isPagination=true&&stockCode=&&csrcCode=&&areaName=&&stockType=1&&pageHelp.cacheSize=1&&pageHelp.beginPage=1&&pageHelp.pageSize=25&&pageHelp.pageNo=1&&_=1517320503161&′

response=requests.get(url,headers=headers) #注意,这一步即将我们‘人’的信息传入请求中

那么,下一步就要获取目标中的JSON数据,此时我们将开发者工具中Response复制后,粘贴到json在线解析及格式化验证验证是否是格式化的标准JSON数据。

检验后发现结果出错

那么我们就需要分析哪里语法有问题,此处不过多赘述,直接贴出删除和添加的部分:

删除部分:开头的以及结尾的

添加部分:添加至开头,并在结尾添加‘}’即可看到解析出的JSON结构:

好了,到这里数据JSON格式化也基本完成。而在解析时,我们需要用到python自带的json库以及jsonpath第三方库(若是windows系统直接在cmd输入pip install jsonpath 即可安装):

import json

from jsonpath import jsonpath #从jsonpath库中导入jsonpath方法

json_str='{&“content&”:&’+response.text[19:-1]+&’}&’ #即将我们刚才分析出的结果进行格式化

unicodestr=json.loads(json_str) #json的loads()方法用于将json的字符串转换成python默认的unicode字符串,还有一个dumps()方法是将python对象转换成json字符串,其中的转换之间的关系不再赘述,有兴趣自行查阅相关资料

接下来就是通过jsonpath寻找我们需要的数据(类似于之前的soup.select()寻找的思想,但是这里是基于jsonpath的查询)

通过分析两个,我们可以轻易地发现其规律性,而jsonpath的使用可以参照jsonpath的简单入门,或者自行查阅官方文档。

由于A股中A股名称代码与公司名称代码均一致,故:

COMPANY_CODE=jsonpath(a,&’$..pageHelp..COMPANY_CODE&’)#公司/A股代码

COMPANY_ABBR=jsonpath(a,&’$..pageHelp..COMPANY_ABBR&’)#公司/A股简称

totalShares=jsonpath(a,&”$..pageHelp..totalShares&”) #A股总资本

totalFlowShares=jsonpath(a,&’$
..pageHelp..totalFlowShares&’) #A股流动资本

至此,解析数据也完成了。

五、整理打印数据

print(&‘公司/A股代码&’,&’\t&’,&’公司/A股简称&’,&’\t&’,&’A股总资本&’,&’\t&’,&’A股流动资本&’)

L1=list()

L2=list()

L3=list()

L4=list()

for x in COMPANY_CODE:

L1.append(x)

for x in COMPANY_ABBR:

L2.append(x)

for x in totalShares:

L3.append(x)

for x in totalFlowShares:

L4.append(x)

#由于同时解四个包太过复杂,python不干,故拆分开来

x=0

while(x&<len(L1)):

print(L1[x],&’\t&’,&’\t&’,L2[x],&’\t&’,&’\t&’,L3[x],&’\t&’,&’\t&’,L4[x])

x+=1

这样我们就爬下一页了:经验证无误。

六、扩大战果(儿时吹的牛皮还是要补的)

前面夸下海口要抓30页,怎么就能没有了呢?其实后面已经基本没有什么了,有兴趣的朋友可以和我一起补补课。

感觉内容有些多,我在这里简单描述思路,就是我们要分析第一页第二页第三页等之间的目标数据地址的url的相似之处,或者说其中的规律,比如:

第二页:
http://query.sse.com.cn/security/stock/getStockListData2.do?&&jsonCallBack=jsonpCallback46762&&isPagination=true&&stockCode=&&csrcCode=&&areaName=&&stockType=1&&pageHelp.cacheSize=1&&pageHelp.beginPage=2&&pageHelp.pageSize=25&&pageHelp.pageNo=2&&pageHelp.endPage=21&&_=1517320503162

第三页:
http://query.sse.com.cn/security/stock/getStockListData2.do?&&jsonCallBack=jsonpCallback61233&&isPagination=true&&stockCode=&&csrcCode=&&areaName=&&stockType=1&&pageHelp.cacheSize=1&&pageHelp.beginPage=3&&pageHelp.pageSize=25&&pageHelp.pageNo=3&&pageHelp.endPage=31&&_=1517320503163

很轻松就可以对比出不同和相似之处,可以说仅仅在个别关键字部分进行了修改。

故提取三十页的代码,以及之前的各种步骤,我们可以封装到函数以便调取使用:

def find_pageA(c): #根据传递参数c(提取的页数)来选择目标url地址

return &‘http://query.sse.com.cn/security/stock/getStockListData2.do?&&jsonCallBack=jsonpCallback13897&&isPagination=true&&stockCode=&&csrcCode=&&areaName=&&stockType=1&&pageHelp.cacheSize=1&&pageHelp.beginPage=&’+str(c)+&’&&pageHelp.pageSize=25&&pageHelp.pageNo=&’+str(c)+&’&&pageHelp.endPage=&’+str(c)+&’1&&_=151731428806&’+str(c)

def datascreenA(a):#封装解析输出的部分

COMPANY_CODE=jsonpath(a,&’$..pageHelp..COMPANY_CODE&’)

COMPANY_ABBR=jsonpath(a,&’$..pageHelp..COMPANY_ABBR&’)

totalShares=jsonpath(a,&”$..pageHelp..totalShares&”)

totalFlowShares=jsonpath(a,&’$..pageHelp..totalFlowShares&’)

print(&‘公司/A股代码&’,&’\t&’,&’公司/A股简称&’,&’\t&’,&’A股总资本&’,&’\t&’,&’A股流动资本&’)

L1=list()

L2=list()

L3=list()

L4=list()

for x in COMPANY_CODE:

L1.append(x)

for x in COMPANY_ABBR:

L2.append(x)

for x in totalShares:

L3.append(x)

for x in totalFlowShares:

L4.append(x)

x=0

while(x&<len(L1)):

print(L1[x],&’\t&’,&’\t&’,L2[x],&’\t&’,&’\t&’,L3[x],&’\t&’,&’\t&’,L4[x])

x+=1

def collect_30_pagesA():#调取30页,相当于主函数

c=1

while(c&<31):

time.sleep(2)

print(&‘第&’, c, &‘页:&’)

response=requests.get(find_pageA(c),headers=headers)

a='{&“content&”:&’+response.text[19:-1]+&’}&’

b=json.loads(a)

datascreenA(b)

c+=1

终结

不知不觉写了这么多,真的是闲的太慌了。其实除了A股还有B股,有兴趣也可以继续爬下去,虽然我不知道有什么价值目前……另外就是前言部分的爬取也可以尝试一下,可能会发现那个文件中的数据又是从其他地方获取的……恕我能力有限,原理不是特别清晰,故而没有深入讲解那个,望各位指教。当然暴力破解是可行的,但是……又不着急干啥能不用就不用呗,^_^。

————————————————

版权声明:本文为CSDN博主「如梦如幻似清茶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

“ajax发送json数据实例(ajax传输json数据格式)” 的相关文章

基金每日收益怎么算出来的(基金收益来源及计算公式)

今天给大家讲基金的收益问题,这涉及到两个方面,一是基金的收益来自于哪里,另一个是它的收益是怎么计算的。先说第一部分:基金收益的主要来源有人说不就是资金投到市场中...

u盘不读盘怎么办,7步操作就能挽救简单又实用

很多小伙伴的电脑会有U盘无法识别的情况发生,其实这种情况我们自己就可以解决,下面“小白维修”来和大家分享一个解决方法,非常简单,话不多说,大家往下看。1、因为别...

创建个人网站有什么用,建立个人网站的步骤

互联网+的今天是一个全民发展的时代,这是时代发展的大趋势。现在的很多中小企业普遍面临的难题是:企业知名度不高,产品特点不明确,宣传不到位,从而导致市场占有率低,...

c定义数组并赋值(c语言给数组赋值并输出)

今天我们把数组复习一下,数组是怎么用的,怎么对它进行定义,怎么对它进行赋值,然后把字符型数组大概说一下。1维数组,1维数组就是1串数,怎么定义这1串数呢?数组虽...

2020年御泥坊好吗(御泥坊清洁泥膜体验效果)

众所周知,清洁是护肤第一步,特别是我们的脸长时间暴露在空气中。像紫外线带来的光老化、高温导致油脂分泌旺盛,又或者是现在带着口罩导致面部肌肤无法呼吸形成毛孔问题。...

2019小成本创业项目,投资2000元年收入3000万!

胡星华的公司正在装修700m2办公场地,很快他和员工将要入驻。胡星华的淘亿科技在国内公共文化云平台领域有着重要地位,他的公司以打造“公共文化智容云”平台,依据大...

五万元如何理财(普通人最安全的理财方式)

俗话说得好,“手有余粮,心中不慌”,尤其是在今年的疫情冲击下,让人更好地体会到了这句话里蕴含的道理。在三四个月没有收入来源的情况下,如果没有钱财傍身的话,估计连...

ai动画制作步骤(ai零基础入门教程)

你能想象3天一集3D动画片,1个月一部3D动画片吗?这将给动画行业带来巨大冲击,影响整个动画行业的发展格局。第80届教育装备展上,一个AI智能3D动画制作产品引...

win10没有兼容性选项怎么办,找回兼容性的操作方法

Win10软件右键属性中,没有兼容性选项怎么办?有些软件更新不及时,无法兼容Win10系统,但是我们可以通过软件的属性来设定兼容性选项,让系统兼容软件,但是最近...

什么手游能快速赚钱,2020赚钱最快的几款游戏推荐

目前的游戏市场,玩家已经慢慢从端游流到了手游,毕竟现在手机是离不开每个人的手,而端游有的就需要高配置的电脑,这点并不是能满足到每个月,特别是电脑是固定在家,而手...