中国采购招标网
URL ,通过爬虫去请求该网站会返回521状态码,需要带着特定cookie去访问,此cookie又是动态变化,如果想要持续采集就得破解此cookie生成规则。
站点反爬分析
通过Fiddler抓包分析,可以看出它的请求顺序。
1. 首次发起请求,返回状态码为521,返回第一段加密cookie,携带第一段加密的cookie去请求会返回第二个521状态码,会返回第二段加密cookie,然后携带第一段和第二段cookie去请求页面,才返回正常状态码,通过观察第二段加密cookie有时效性,一会就过期,破解步骤见下面。
![原始请求](https://i-blog.csdnimg.cn/blog_migrate/aba96473cfdeab0e30db3d7dda2b51da.png)
2. 第一段加密cookie具体内容:整个script中包含两部分内容,(1):通过js生成的第一段加密cookie;(2):第二个加密cookie页面的跳转,这部分破解比较简单,借助python的execjs包去模拟执行js,然后返回加密cookie即可。
获取请求的set_cookie,返回内容为:__jsluid_h=7cad7d7e20bf090ce259b49c85542372(此参数在后续请求均需携带);执行js返回的document.cookie内容:__jsl_clearance=1603345157.389|-1|HI%2B0JxwfexVK0OVf0WEG4FxNW3A%3D,一开始以为这就是破解成功的cookie,谁知道注意观察后返回200状态码的请求cookie格式为:XXX|0|XXXX 而此次请求返回中间部分为-1,只有请求第二个加密js后才能获取正确cookie。
![第一段加密cookie](https://i-blog.csdnimg.cn/blog_migrate/863c5003bbfabcbe9426541a9b9cfa90.png)
代码片段:
def first_cookie_decode(base_url):
"""
破解首次加密
:param base_url: 原始请求URL
:return: 浏览器请求头,首次破解加密字段一
"""
response = requests.get(base_url, headers=HEADERS, timeout=(8, 8))
if response.status_code == 521:
cookies = response.cookies
str_js_cookie = response.text.replace("<script>document.", "").replace(
";location.href=location.pathname+location.search</script>", "")
print("0. 待破解字段==>", str_js_cookie) # 替换掉页面跳转部分JS
# 获取加密字段内容
js_result = execjs.eval(str_js_cookie).split(";")[0] # 执行加密JS
print("1. 待破解加密字段一==>", js_result)
cookies_text = ';'.join(['='.join(item) for item in cookies.items()])
print("2. 加密字段一==>", cookies_text) # 此字段可连续使用
HEADERS['cookie'] = cookies_text + "; "