在第一篇文章中,我总结了我最近学到的东西。利用requests和bs4第三方库的共同作用,我基本可以处理python获取静态web数据的相关问题。但如果现实中的网页往往比想象中复杂,那么
在第一篇文章中,我总结了我最近学到的东西。利用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版权协议。转载请附上原始来源和本声明的链接。