目标网址:http://webapi.cninfo.com.cn/#/marketDataZhishu
这篇文章是用来对该网站进行js解析用的,解析完后爬取数据操作可看这篇文章:Scrapy实战案例--将股票数据存入SQL数据库
解析重点:
目标网址在爬取时必须携带mcode参数,否则会 出现无授权访问报错,而mcode刷新频率较高,因此在爬取该网站前必须要先通过js逆向来获取mcode参数。
正文开始:
1、先右键点击审查元素,搜索网页中需要爬取的数据(找出数据放在哪个包中)
很明显在第二个包中,点击进入,很明显这个就是我们需要的数据
2、找到mcode参数所在的位置
此时有三个包,我们不知道是哪一个,我们再精准点搜索给他加个英文字符冒号 即“mcode:”
此时只有一个包了,我们点击进入,进入后继续搜索mcode发现,符合条件的太多了
这里我们将路径作为关键词搜索试试
此时只剩下一个了,而且发现了mcode是通过indexcode.getResCode()函数所获取的
3、断点调试
鼠标左键单机46505这个数字,用来新建一个断点,建完后刷新一下页面,此时会出现调试页面。
此时刚好就出现了mcode所调用的indexcode.getCode函数,因此我们可以判断此处是用来产生mcode的一个函数。上面所调用的missjson方法我们不知道是什么,也不需要知道是用来干什么的,将鼠标停留在该函数处进入其对应的位置将其复制下来放在自己电脑的js文件里面。
4、写入js文件
将这部分全部复制,写入到自己电脑的js文件中,注意:此处需要修改为下面这种格式,function必须要放在missjson前面(这与JavaScript的语法有关)
5、用python读取js并调试
先观察发现调用missjson需要先获得time,获得这个后我们可以通过execjs的call函数来传入参数。
'''
通过这个函数获取mcode
var indexcode={
getResCode:function(){
var time=Math.floor(new Date().getTime()/1000);
return window.JSonToCSV.missjson(""+time);
}
}
'''
获取mcode代码:
def get_mcode():
# '123.js'是用来放前面的js的
with open('123.js','r',encoding='utf-8')as f:
read_js=f.read()
return_js=execjs.compile(read_js) #
# 用来获取time参数
time1 = js2py.eval_js('Math.floor(new Date().getTime()/1000)')
mcode = return_js.call('missjson','{}'.format(time1))
print(mcode)
if __name__ == '__main__':
get_mcode()
6、开始爬取
总结:先复制保存js相对应函数,再获取mcode,再开始爬取数据
js代码:
/* 通过这个函数获取
var indexcode={
getResCode:function(){
var time=Math.floor(new Date().getTime()/1000);
return window.JSonToCSV.missjson(""+time);
}
}
从这可以知道最终调用了.missjson(""+time)
*/
// 这里要将函数改一下格式
function missjson(input) {
var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "wxyz0123456789+/" + "=";
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2)
+ keyStr.charAt(enc3) + keyStr.charAt(enc4);
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = "";
} while (i < input.length);
return output;
}
python代码:
# http://webapi.cninfo.com.cn/#/marketDataDate
import requests
import execjs
import js2py
def get_mcode():
with open('123.js','r',encoding='utf-8')as f:
read_js=f.read()
return_js=execjs.compile(read_js) #
# 用来获取time参数
time1 = js2py.eval_js('Math.floor(new Date().getTime()/1000)')
mcode = return_js.call('missjson','{}'.format(time1))
return mcode
def get_data(mcode):
url = 'http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1007'
headers = {
'mcode': mcode,
'Referer': 'http://webapi.cninfo.com.cn/',
}
params = {
'tdate': '2022-04-12',
'market': 'SZE',
}
response = requests.get(url=url, headers=headers, params=params).text
print(response)
if __name__ == '__main__':
mcode = get_mcode()
get_data(mcode)
到这一步就对该网站解析完成了,后续用Scrapy爬取数据,文章如下:Scrapy实战案例--将股票数据存入SQL数据库