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

在第一篇文章中,我总结了我最近学到的东西。利用requests和bs4第三方库的共同作用,我基本可以处理python获取静态web数据的相关问题。但如果现实中的网页往往比想象中复杂,那么

本文最后更新时间:  2023-04-18 08:30:40

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

比如在第一篇文章爬取的网易云课堂计算机专业大学课程中,如果我们进一步爬取计算机专业的职位信息,通过开发者工具,我们发现我们需要的数据位于id = & # 8221j-smart spec ”在div中,

但是,使用前面的方法,我们会发现最终的列表是空,于是我们检查源代码,最终找到了预期的标签id,却惊讶地发现里面什么都没有:

我太生气了!~但是当然,我们要有耐心,要有获得想要的数据的决心~经过很多途径,我们一定会知道这就是AJAX,一种用来创建快速动态网页的技术。这项技术使我们能够在后台与服务器交换少量数据,从而实现网页的异步更新。这意味着浏览器可以更新网页的某些部分,而无需重新加载整个网页。

这个时候,你要想得到数据,就要考虑它是通过什么向我们传递新的信息。

其实就是python对动态网页的抓取和异步加载。

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

以上引出了本文的主题。

主体

1.方法分析

事实上,任何动态生成的内容要么是本地计算的,要么是从服务器获得的。前者看js,后者需要抢包。后者往往用各种参数加密,但既然浏览器能正确发送参数,就证明一定有办法模拟出来(当然不容易)。如果你有能力,模拟合同的签发。如果太麻烦,就用现成的包来模拟浏览器的操作。

一般来说,获取动态数据有两种思路或方法:

1.分析页面请求。2.使用selenium模拟浏览器行为或其他数据包捕获工具直接获取(比较有无暴力)

效率最高的是分析请求数据的URL,一般可以接受,然后在selenium实在无奈的时候再用。

本文只介绍第一种方法(当然是实物,不做也没用)。如果接下来几天还闲着,继续介绍下一个方法。

二。开战(标的:股票|上交所)

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

我们至少要先确定一个方向,看看目标页面:

有用的是公司代码,公司简称,a股代码,a股简称,a股总资本,流通a股资本。

所以我们的目标是爬上30页,我们需要所有这些信息。

第三,找到数据位置

还是之前的基本思路。首先,检查页面上的数据位置,并找到标签的位置。在前言中,我们大概有了一些体会。这个时候我们试探性的开放了源代码,这次看到什么好像都没那么生气了~

接下来是没有介绍的东西!!也就是说,分析AJAX加载的是哪个文件:

如图,如果是在开发者工具网JS中分析的文件太多很难分析,那么我们发现有一种现象,就是上市的a股点击一下就会小范围刷新,最后完全可以明确目标。

这样我们就可以说完成了一半(熟悉的话基本没什么其他的了)。

下一步是打开目标并验证是否有我们需要的数据。

什么????这是什么情况?

呵呵,这真的是我心中的又一个惊喜。403代码是什么意思,就是我们没有权限浏览目标地址。这是网站的自我保护行为。

那我该怎么办?我们没有权限,但我们可以在我们的原始页面上获得这些!

所以,这里我们用我们的蠕虫来模拟人类的操作。上一篇文章提到,其实通过修改请求头中的Cookie、User-Agent、Referer等信息,我们的访问请求就像是真人的访问。可以在标题中查看需要修改的内容:

您可以按如下方式保存它:

headers = { & # 8216饼干’:’yfx _ c _ g _ u _ id _ 10000042 = _ CK 18012900250116338392357618947;已访问菜单= % 5B % 228528% 22% 5D;yfx _ f _ l _ v _ t _ 10000042 = f _ t _ 1517156701630 _ _ r _ t _ 1517314287296 _ _ v _ t _ 1517320502571 _ _ r _ c _ 2 ′,

‘用户代理’:’Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/64 . 0 . 3282 . 119 Safari/537.36 ′,

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

}

通常包含这三个要素就足以证明‘人’了。所以我们已经可以找到数据了。

第四,数据处理和分析(格式化数据JSON和解析JSON)

好了,数据已经找到了,在开发者工具预览中我们可以看到数据是以JSON格式存储的(JSON格式数据本质上是一个格式化的字符串,遵循一定的语法规则)。现在,让我们首先根据原始方法使用请求来获取数据:

导入请求

url = & # 8217http://query . SSE . com . cn/security/stock/getstocklistdata 2 . do?& ampjsonCallBack = jsonCallBack 99887 &isPagination = true & amp股票代码= & ampcsrcCode = & ampareaName = & ampstockType = 1 & amppageHelp.cacheSize = 1 & amppage help . begin page = 1 &pagesize = 25 &pageHelp.pageNo = 1 & amp_=1517320503161′

Response = requests.get (URL,headers = headers) #注意,这一步是将我们的“人”的信息传输到请求中。

然后,下一步是获取目标中的json数据。此时我们在开发者工具中复制响应,粘贴到JSON在线解析和格式验证中,验证是否是格式化的标准JSON数据。

检查后发现错误。

然后需要分析语法哪里有问题,这里就不赘述了,只贴上删除和增加的部分:

删除部分:开头和结尾。

添加部分:在开头添加,在结尾添加' } '以查看解析后的JSON结构:

好了,数据的JSON格式化在这里基本完成了。解析的时候需要用到python自带的json库和jsonpath第三方库(如果windows系统直接在cmd中进入pip install jsonpath就可以安装了):

导入json

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

json _ str = ' { & # 8220内容”:’+response . text[19:-1]+’}’#也就是把我们刚才分析的结果格式化。

unicode = json . loads(json _ str)# JSON的loads()方法用于将JSON字符串转换为python的默认Unicode字符串,dumps()方法用于将python对象转换为JSON字符串。转换的关系这里就不赘述了,有兴趣自己去查阅相关资料。

下一步是通过jsonpath找到我们需要的数据(类似于前面的soup.select()搜索思想,但是这里是一个基于jsonpath的查询)

通过分析两者,我们很容易发现它们的规律性,jsonpath的使用可以参考jsonpath的简单介绍,或者自己查阅官方文档。

由于a股中的a股名称代码与公司名称代码一致,所以:

COMPANY_CODE=jsonpath(a,’$..页面帮助..公司代码’)#公司/A股代码

COMPANY_ABBR=jsonpath(a,’$..页面帮助..公司_ ABBR ’)#公司/A股简称

totalShares=jsonpath(a,”$..页面帮助..totalShares & # 8221)#a股总资本

totalFlowShares=jsonpath(a,’$
..页面帮助..totalFlowShares & # 8217)#A股营运资金

至此,数据分析完成。

第五,整理打印数据。

打印(‘公司/A股代码’,’\ t & # 8217,’公司/A股简称’,’\ t & # 8217,’a股总资本’,’\ t & # 8217,’a股流通资本’)

L1 =列表()

L2 =列表()

L3 =列表()

L4 =列表()

对于公司代码中的x:

L1 .追加(x)

对于ABBR公司的x:

L2 .附加(x)

对于总股份中的x:

L3 .追加(x)

对于totalFlowShares中的x:

L4 .附加(x)

#因为同时解决四个包太复杂,python不会做,所以拆分。

x=0

while(x <伦(L1)):

打印(L1[x],’\ t & # 8217,’\ t & # 8217,L2[x],’\ t & # 8217,’\ t & # 8217,L3[x],’\ t & # 8217,’\ t & # 8217,L4[x])

x+=1

所以我们爬到下一页:核实无误。

第六,扩大成果(小时候吹的牛皮还是要补的)

前面夸了30页,怎么可能没了?其实基本上什么都没留下。有兴趣的朋友可以和我一起补课。

感觉内容很多。我在这里简单描述一下思路,就是我们要分析目标数据地址的URL在第一页、第二页、第三页等之间的相似性。,或规则,如:

第2页:
http://query . SSE . com . cn/security/stock/getstocklistdata 2 . do?& ampjsonCallBack = jsonCallBack 46762 &isPagination = true & amp股票代码= & ampcsrcCode = & ampareaName = & ampstockType = 1 & amppageHelp.cacheSize = 1 & amppage help . begin page = 2 &pagesize = 25 &pageHelp.pageNo = 2 & amppage help . end page = 21 &_=1517320503162

第3页:
http://query . SSE . com . cn/security/stock/getstocklistdata 2 . do?& ampjsonCallBack = jsonCallBack 61233 &isPagination = true & amp股票代码= & ampcsrcCode = & ampareaName = & ampstockType = 1 & amppageHelp.cacheSize = 1 & amppage help . begin page = 3 &pagesize = 25 &pageHelp.pageNo = 3 & amppage help . end page = 31 &_=1517320503163

很容易比较两者的异同。可以说只是修改了个别关键词。

因此,在提取了三十页的代码和前面的步骤后,我们可以将其封装成一个函数来使用:

DEF _ PAGEA (C): #根据传递的参数C(提取的页数)选择目的url地址

return & # 8216http://query . SSE . com . cn/security/stock/getstocklistdata 2 . do?& ampjsonCallBack = jsonCallBack 13897 &isPagination = true & amp股票代码= & ampcsrcCode = & ampareaName = & ampstockType = 1 & amppageHelp.cacheSize = 1 & amppage help . begin page = ’+str(c)+’& amppagesize = 25 &pageHelp.pageNo = & # 8217+str(c)+’& amppage help . end page = ’+str(c)+’1 & amp_=151731428806’+字符串(c)

DEF CREENA (A): #封装了解析输出的一部分

COMPANY_CODE=jsonpath(a,’$..页面帮助..公司代码’)

COMPANY_ABBR=jsonpath(a,’$..页面帮助..公司_ ABBR ’)

totalShares=jsonpath(a,”$..页面帮助..totalShares & # 8221)

totalFlowShares=jsonpath(a,’$..页面帮助..totalFlowShares & # 8217)

打印(‘公司/A股代码’,’\ t & # 8217,’公司/A股简称’,’\ t & # 8217,’a股总资本’,’\ t & # 8217,’a股流通资本’)

L1 =列表()

L2 =列表()

L3 =列表()

L4 =列表()

对于公司代码中的x:

L1 .追加(x)

对于ABBR公司的x:

L2 .附加(x)

对于总股份中的x:

L3 .追加(x)

对于totalFlowShares中的x:

L4 .附加(x)

x=0

while(x <伦(L1)):

打印(L1[x],’\ t & # 8217,’\ t & # 8217,L2[x],’\ t & # 8217,’\ t & # 8217,L3[x],’\ t & # 8217,’\ t & # 8217,L4[x])

x+=1

Def collect_30_pagesA():#调用30页,相当于main函数

c=1

while(c <31):

时间.睡眠(2)

打印(‘’,c,‘页面:’)

response = requests . get(find _ pageA(c),headers=headers)

a = ' { & # 8220内容”:’+response . text[19:-1]+’}’

b=json.loads(a)

数据屏幕A(b)

c+=1

目标

不知不觉就写了这么多。闲下来真的是慌。其实b股也有,a股也有。有兴趣的话可以继续爬,虽然不知道值多少。现在...此外,您可以尝试抓取前言,您可能会发现该文件中的数据是从其他地方获得的...我怕自己能力有限,原理也不是特别清楚,所以没有深入讲解那个。希望大家指教。当然,暴力破解是可行的,但是...能做的不急,就不要用了,_

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

版权声明:本文为CSDN博主“梦如茶”原创文章,遵循CC 4.0 BY-SA版权协议。转载请附上原始来源和本声明的链接。

温馨提示:内容均由网友自行发布提供,仅用于学习交流,如有版权问题,请联系我们。