Python如何爬取有excel随机数数参数的Ajax地址

404 Not Found
The requested URL /q/7035/ was not found on this server.拒绝访问 | www.th7.cn | 百度云加速
请打开cookies.
此网站 (www.th7.cn) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(e2437c-ua98).
重新安装浏览器,或使用别的浏览器好吃懒做的人能干什么。。。
【2】Python爬虫:分析AJAX传递的JSON获取数据-初步分析动态网页(1)
这是本人写的第二篇文章。希望能够帮助到一些和我一样的python爬虫初学者。
在第一篇文章中,我总结了最近学到的利用requests和bs4第三方库共同作用,基本可以应对python获取静态网页数据的相关问题。但是如果现实中的网页往往比想象中复杂的多,网页也早已不再是纯静态网页。
就比如在第一篇文章中爬取的中,如果我们进一步爬取计算机专业可以就业的岗位信息时,通过开发者工具,我们发现,我们所需要的数据位于id="j-smartSpec"
然而,我们利用之前的方法进行会发现最后得到的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_=_ck18947; VISITED_MENU=%5B%%5D; yfx_f_l_v_t_=f_t_0__r_t_6__v_t_1__r_c_2',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0. 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&_=1'
response=requests.get(url,headers=headers) #注意,这一步即将我们‘人’的信息传入请求中那么,下一步就要获取目标中的JSON数据,此时我们将开发者工具中Response复制后,粘贴到验证是否是格式化的标准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的使用可以参照,或者自行查阅官方文档。
由于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股流动资本')
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不干,故拆分开来
while(x&len(L1)):
print(L1[x],'\t','\t',L2[x],'\t','\t',L3[x],'\t','\t',L4[x])
这样我们就爬下一页了:经验证无误。
六、扩大战果(儿时吹的牛皮还是要补的)
前面夸下海口要抓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&_=2
第三页: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&_=3
很轻松就可以对比出不同和相似之处,可以说仅仅在个别关键字部分进行了修改。
故提取三十页的代码,以及之前的各种步骤,我们可以封装到函数以便调取使用:
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&_='+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股流动资本')
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)
while(x&len(L1)):
print(L1[x],'\t','\t',L2[x],'\t','\t',L3[x],'\t','\t',L4[x])
def collect_30_pagesA():#调取30页,相当于主函数
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)
不知不觉写了这么多,真的是闲的太慌了。其实除了A股还有B股,有兴趣也可以继续爬下去,虽然我不知道有什么价值目前……另外就是前言部分的爬取也可以尝试一下,可能会发现那个文件中的数据又是从其他地方获取的……恕我能力有限,原理不是特别清晰,故而没有深入讲解那个,望各位指教。当然暴力破解是可行的,但是……又不着急干啥能不用就不用呗,^_^。
主要还是多动手多实战吧,光看是没有用的,之后有用到需要保存的东西,可能还需要接触一些关联文件的库以及数据库等等,包括如何通过图片链接下载图片……
总之,有兴趣又闲的朋友可以交流,不足之处望及时指出共同进步。
python爬虫之爬取ajax数据方法
Python登录抓取JSON数据
[Python]爬虫,正则表达式解析网页及Json序列化
python网络爬虫抓取ajax动态网页数据:以抓取KFC门店地址为例
Python3爬虫之urllib爬取异步Ajax数据,使用post请求!
python爬虫爬取ajax页面
python爬虫爬取ajax加载的动态内容
爬取Ajax界面
json动态添加属性和删除属性
利用python修改json文件的value
没有更多推荐了,11:13 提问
python request 库POST请求从ajax爬取数据遇到formdata不会处理了
目标爬取网站为
form data为:
以下为我的代码:
import requests
from urllib.parse import urlencode
base_url = 'http://www.ccgp-shaanxi.gov.cn/notice/noticeaframe.do?noticetype='
noticetype = '3'
url = base_url + noticetype
headers = {
'Host': 'www.ccgp-shaanxi.gov.cn',
'Referer': 'http://www.ccgp-shaanxi.gov.cn/notice/list.do?noticetype=3&province=province',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'}
'parameters[purcatalogguid]': '',
'page.pageNum': '',
'parameters[title]': '税',
'parameters[startdate]': '',
'parameters[enddate]': '',
'parameters[regionguid]': '6101',
'parameters[projectcode]': '',
'province': '',
'parameters[purmethod]': ''
data = urlencode(data)
print(data)
request = requests.post(url, data=data, headers=headers)
# print(request.text)
print(request.headers)
但是获取到的信息反应、感觉formdata貌似没有起作用,因本人属于新手小白,各位大神能指点指点吗?
按赞数排序
formdata 里面的数据是body里的,带上就好了,我做爬虫好几年了,有什么不懂的,欢迎追问!如果对你有帮助,请采纳!
你cookie也要设置上去。不然可能提交的数据不会接受
有木有大神帮着执行一下、、、分析一下
我觉得是你的data数据格式有问题,方括号内应该是个字符串
'parameters[\'purcatalogguid\']': '',
'page.pageNum': '',
'parameters[\'title\']': '税',
'parameters[\'startdate\']': '',
'parameters[\'enddate\']': '',
'parameters[\'regionguid\']': '6101',
'parameters[\'projectcode\']': '',
'province': '',
'parameters[\'purmethod\']': ''
遇到这种问题你应该先尝试发送原始请求中body 的raw data的也就是原始数据, 尝试直接修改字符串,而不是用抓包工具提供的解析后的body重新编码, 成功概率会高一点。 这样就可以排除cookie或是其他的认证性错误
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐5添加评论分享收藏感谢收起赞同 24 条评论分享收藏感谢收起

我要回帖

更多关于 excel随机数 的文章

 

随机推荐