仅供学习研究***********************************仅供学习研究
一,描述
对某些网站进行爬取分析或者算法分析,打开F12会自动断点,导致不能正常分析。如图:
二,项目分析:
(1).目标url: http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact
注意:此网站反爬措施已经更改,没有之前那么麻烦,这里还是以之前思路来分析。
(2).爬取‘我要咨询’里面的数据。如图:
(3).分析:
1.打开F12调试,点击"我要咨询"发现再次点击其他的无效。如图:
接着再次点击这个按钮(直到取消为止),如图:
2.点击Network,选择interact,查看Headers里面的内容,这里留意一下请求头里面的Cookies;如图:
3.接着看看XHR里面,发现有个getList,单击查看详细内容:
不妨多点击几次下一页看看,发现start在变化;对着每页数据来看一页7个数据,这里就是数据存放的地方了。
4.此时的请求URL是:[http://zwfw.san-he.gov.cn/icity/api-v2/app.icity.guestbook.WriteCmd/getLists=a747491606926198736&t=9969_a27070_1606926426000],请求方法是:POST;需要留意’s’和’t’两个参数的值,发现:
5.试着猜想’s’和’t’参数值会不会从js文件得出来的,接着找js文件,再次点击’我要咨询’,点击图中红色框选部分:
直到sources里面出现一个js文件:
将它格式化:
格式化后,Ctrl+F搜索"var s",大概在第21个,发现:
6.解析js代码:
if (this.isApiV2) {
var sig = "";
var chars = "0123456789abcdef";
// 1,__signature
if (!LEx.isNotNull(__signature)) {
// 随机数+时间戳
var curTime = parseInt(Math.random() * (9999 - 1000 + 1) + 1000) + "" + Date.parse(new Date());
// var __signature 自动生成的
sig = chars.charAt(parseInt(Math.random() * (15 - 15 + 1) + 10)) + chars.charAt(curTime.length) + "" + curTime;
} else {
sig = __signature;
}
// key 形成例如这种字符串:b99999 e01866 c70212
var key = "";
var keyIndex = -1;
for (var i = 0; i < 6; i++) {
// charAt(0)指定位置字符
var c = sig.charAt(keyIndex + 1);
key += c;
// indexOf:索引
keyIndex = chars.indexOf(c);
if (keyIndex < 0 || keyIndex >= sig.length) {
keyIndex = i;
}
}
// 4位0-9随机数+'_' + key + '_' + 时间戳
var timestamp = parseInt(Math.random() * (9999 - 1000 + 1) + 1000) + "_" + key + "_" + Date.parse(new Date());
var t = timestamp;
//LEx.azdg.encrypt(timestamp,key);
t = t.replace(/\+/g, "_");
curUrl += "?s=" + sig;
curUrl += "&t=" + t;
}
(1).__signature:自动生成的:
三,抓取数据
import requests
import time
import random
import re
from fake_useragent import UserAgent
# 目标url
target_url = 'http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact#'
respon = requests.get(target_url)
# 获取cookie
ck = respon.cookies['ICITYSession']
headers = {
'User-Agent': UserAgent().random,
'Cookies': str(ck)
}
# 返回页数数据
html = respon.text
# print(html)
# 使用re模块获取__signature
signa = re.findall(r'var __.* = "(.*)"', html)
sig = signa[1]
# print(sig)
如图:
将上述代码封装一下:
def target_url():
target_url = 'http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact#'
respon = requests.get(target_url)
# 获取cookie
ck = respon.cookies['ICITYSession']
headers = {
'User-Agent': UserAgent().random,
'Cookies': str(ck)
}
html = respon.text
# print(html)
signa = re.findall(r'var __.* = "(.*)"', html)
sig = signa[1]
# print(sig)
return sig, headers
接着来解决debugger:
def target_url():
target_url = 'http://zwfw.san-he.gov.cn/icity/icity/guestbook/interact#'
respon = requests.get(target_url)
# 获取cookie
ck = respon.cookies['ICITYSession']
headers = {
'User-Agent': UserAgent().random,
'Cookies': str(ck)
}
html = respon.text
# print(html)
signa = re.findall(r'var __.* = "(.*)"', html)
sig = signa[1]
# print(sig)
return sig, headers
# 无限debug
def get_url():
sig, headers = target_url()
key = ''
key_index = -1
chars = '0123456789abcdef'
for i in range(0, 6):
c = sig[key_index+1]
key += c
key_index = chars.index(c)
if key_index < 0 or key_index >= len(sig):
key_index = i
print(key)
# 4位随机数_key_时间戳str(int(time.time())*1000)-->1606927383000
t = str(int(random.randint(999, 10000))) + '_' + key + '_' + str(int(time.time())*1000)
# t.replace('+', '_')
# print(t)c
# s: a747491606926198736
# t: 8890_a27070_1606927383000
for i in range(0, 77, 7):
# 获取类容的起始url
start_url = 'http://zwfw.san-he.gov.cn/icity/api-v2/app.icity.guestbook.WriteCmd/getList?s={}&t={}'.format(sig, t)
# 爬取多页
params = {
'start': str(i),
'limit': '7',
'TYPE @=': "2",
'OPEN @=': "1",
}
# {start: 0, limit: 7, TYPE@=: "2", OPEN@=: "1"}
# {start: 7, limit: 7, TYPE@=: "2", OPEN@=: "1"}
# {start: 14, limit: 7, TYPE@=: "2", OPEN@=: "1"}
resp = requests.post(start_url, headers=headers, params=params)
print(resp.text)
if __name__ == '__main__':
target_url()
get_url()
如图(部分):