中国采购招标网

URL ,通过爬虫去请求该网站会返回521状态码,需要带着特定cookie去访问,此cookie又是动态变化,如果想要持续采集就得破解此cookie生成规则。

站点反爬分析

通过Fiddler抓包分析,可以看出它的请求顺序。

1. 首次发起请求,返回状态码为521,返回第一段加密cookie,携带第一段加密的cookie去请求会返回第二个521状态码,会返回第二段加密cookie,然后携带第一段和第二段cookie去请求页面,才返回正常状态码,通过观察第二段加密cookie有时效性,一会就过期,破解步骤见下面。

原始请求

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

代码片段:

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.cookiesstr_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]  # 执行加密JSprint("1. 待破解加密字段一==>", js_result)cookies_text = ';'.join(['='.join(item) for item in cookies.items()])print("2. 加密字段一==>", cookies_text)  # 此字段可连续使用HEADERS['cookie'] = cookies_text + "; " + js_resultelse:print("状态不为521,可直接使用-first_cookie_decode")return HEADERS, cookies_text

3. 第二段加密cookie具体内容:

首先整个页面的JS是通过不同编码搞成了乱码,无法直接查看JS具体内容,但是通过第三方js执行工具执行发现执行后总是会跳转页面,因此考虑会和第一段浏览器跳转一样,最后发现了go()方法,而且看到go()方法调用的参数bts为我们需要的破解参数,破解与未破解区别如下:

未破解:                                     1603071828.236|0|nuN    4FZAvCZ1Ba7ZTI%2B%2FKxzFJY%3D
执行第二段JS破解后的cookie:1603071828.236|0|nuN vi 4FZAvCZ1Ba7ZTI%2B%2FKxzFJY%3D

发现原来的bts参数后面部分多了两位字母,长达300多行的js就干了一件事,通过入参与浏览器的请求头(很重要)生成了加密的两位字母并拼接到了第二段加密cookie中。第二段js本想通过本地execjs执行,但是发现js代码片段中包含对浏览器配置的获取,因此本地无法执行,则考虑selenium去尝试,结果本机的chrome86.0版本死活无法加载该js,目前有什么配置暂不清楚,一直降级发现chrome73.0版本支持该js执行并加载。关于此部分js内容破解,通过阅读该js源码发现有部分:“document[_0x197c('0x35', 'g%4U') + 'ie']”和:“location[_0x197c('0x49', '5@s1')]”,很明显location控制跳转,我们只要对document部分内容做破解即可,document内容(这是它执行自己内部函数的关键):

_0x1d288[_0x197c('0x61', '(zd#') + 'J'](_0x1d288[_0x197c('0x93', 'AM^7') + 'J'](_0x1d288[_0x197c('0x86', '&91$') + 'V'](_0x54977a['tn'], '='), _0x1c6092[0x0]) + (_0x197c('0x5a', 'kUvB') + _0x197c('0x2b', 'T@q(') + '=') + _0x54977a['vt'], _0x197c('0x77', '3Z!!') + _0x197c('0x2a', 'Qi@k') + '\x20/');

第二段加密cookie的JS内容

第二段加密cookie具体细节

4. 破解流程:

  • 发起首次请求返回521状态,获取本次请求的set_cookie,并获取加密js内容:__jsluid_h=7cad7d7e20bf090ce259b49c85542372;
  • 携带__jsluid_h和set_cookie发起第二次请求:__jsl_clearance=1603345157.389|-1|HI%2B0JxwfexVK0OVf0WEG4FxNW3A%3D:获取正确的第二部分加密JS内容;
  • 通过第二部分加密js内容__jsl_clearance,使用selenium执行返回正确的__jsl_clearance=1603345157.389|0|HI%BV2B0JxwfexVK0OVf0WEG4FxNW3A%3D;
  • 携带__jsluid_h、__jsl_clearance去再次请求,返回正确状态码:200及真实页面内容。(整个过程必须使用同一浏览器,否则加密参数不一致)

5. 详细代码

#!/usr/bin/python3
# encoding: utf-8
"""
@version: v1.0
@author: W_H_J
@license: Apache Licence
@contact: 415900617@qq.com
@software: PyCharm
@file: cookieDecodeJs.py
@time: 2020/10/19 21:32
@describe: 中国采购招标网COOKIE解密JS破解
http://shanxi.chinabidding.cc/
"""
import sys
import os
import timefrom requests.adapters import HTTPAdapter
from selenium import webdriver
from selenium.webdriver import ChromeOptions
from pyquery import PyQuery as pq
import execjs
import requests_html
sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..'))
sys.path.append("..")SESSION = requests_html.HTMLSession()
SESSION.mount('http://', HTTPAdapter(max_retries=6))
SESSION.mount('https://', HTTPAdapter(max_retries=6))HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36','Host': 'shanxi.chinabidding.cc'
}def first_cookie_decode(base_url):"""破解首次加密:param base_url: 原始请求URL:return: 浏览器请求头,首次破解加密字段一"""response = SESSION.get(base_url, headers=HEADERS, timeout=(8, 8))if response.status_code == 521:cookies = response.cookiesstr_js_cookie = response.text.replace("<script>document.", "").replace(";location.href=location.pathname+location.search</script>", "")print("0. 待破解字段==>", str_js_cookie)# 获取加密字段内容js_result = execjs.eval(str_js_cookie).split(";")[0]print("1. 待破解加密字段一==>", js_result)cookies_text = ';'.join(['='.join(item) for item in cookies.items()])print("2. 加密字段一==>", cookies_text)  # 此字段可连续使用HEADERS['cookie'] = cookies_text + "; " + js_resultelse:print("状态不为521,可直接使用-first_cookie_decode")return HEADERS, cookies_textdef second_cookie_decode(base_url):"""破解第二段加密cookie:param base_url: 原始请求URL:return: 破解完的加密js代码片段,通过内部api请求模拟获取最终加密结果,此结果可多次使用"""HEADERS_F, cookies_first_decode = first_cookie_decode(base_url)  # 浏览器请求头,第一个加密字段response = SESSION.get(base_url, headers=HEADERS_F, timeout=(8, 8))if response.status_code == 521:text_second_521 = response.textjs_cookie = text_second_521[text_second_521.find('go({"bts":[') + 12:text_second_521.find('"],"chars')].split('","')print("3. 待破解加密字段二==>", js_cookie[0] + js_cookie[1])# 二次破解cookie加密字段str_base = text_second_521print("4. 待破解字段三==>", str_base)str_ie_cookie = str_base.replace(" ", "")[str_base.replace(" ", "").find("'ie']=") + 6:str_base.replace(" ", "").find("location[")]print("5. 破解的加密JS内容==>", str_ie_cookie)str_cookie_temp = '''var cookies={}\nreturn cookies;'''.format(str_ie_cookie)str_base_temp = str_base[str_base.rfind(")]);if(") + 4:str_base.rfind("}};go({") + 1]str_back_fun = '''var str_back = back();console.log(str_back); setTimeout(function() {document.getElementById('cookieId').innerHTML=str_back;}, 500);'''str_js_cookie = str_base.replace(str_base_temp, str_cookie_temp).replace("go({","var back_cookie = go({").replace("})</script>", "}); return back_cookie;}" + str_back_fun).replace("<script>", "function back(){")with open("./statisticalDataSpider/spider/business/cookieDecode/static/cookie_js.js", 'w', encoding="utf-8") as f:f.write(str_js_cookie)  # 保存二次加密的js到本地然后通过本地起一个服务,使用selenium执行,获取正确的加密cookieelse:print("状态不为521,可直接使用")return cookies_first_decode, response.status_codedef third_cookie_decode(status_code):"""进行第二次解密参数破解:return: __jsl_clearance=1603095437|0|IIfaCCOxqoEKlTN7dqVU%2Blb2ypw%3D"""# 需要chrome及chromdriver均需使用版本73.0if status_code == 521:options = ChromeOptions()options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})  # 不加载图片,加快访问速度options.add_argument('--disable-gpu')options.add_argument('--no-sandbox')# 手动指定使用的浏览器位置# options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"options.add_argument('user-agent="{}"'.format(HEADERS['User-Agent']))options.add_experimental_option('excludeSwitches', ['enable-automation'])  # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Seleniumchrome_path = r"./statisticalDataSpider/spider/business/cookieDecode/static/chromedriver.exe"browser = webdriver.Chrome(executable_path=chrome_path,options=options)browser.get('http://127.0.0.1:9093/cookie')  #自己起了一个本地服务,让selenium执行jstime.sleep(5)page = browser.page_sourcedoc = pq(page)js_cookie = doc("#cookieId").text()browser.close()if js_cookie != "undefined" and js_cookie != "默认":third_cookie = js_cookie.split(";")[0]return third_cookieelse:return Nonedef get_decode_cookie(base_url):"""最终破解成功的cookie:param base_url: 原始URL:return:"""cookie_first_decode, status_code = second_cookie_decode(base_url)cookie_second_decode = third_cookie_decode(status_code)if cookie_second_decode is not None:print("6. 破解加密字段一成功==>", cookie_first_decode)print("7. 破解加密字段二成功==>", cookie_second_decode)HEADERS['cookie'] = cookie_first_decode + "; " + cookie_second_decodeprint("8. 解密后的Headers==>", HEADERS)return HEADERSelse:return Nonedef get_html(base_url):headers = get_decode_cookie(base_url)html = SESSION.get(base_url, headers=headers, verify=False, timeout=(5, 5))print("9. 最终返回状态码==>", html.status_code)print("BODY", html.text)return html.status_code, html.textif __name__ == '__main__':url = 'http://shanxi.chinabidding.cc/lists.html?page=4&zz=city_119&keyword=%E8%A5%BF%E5%AE%89%20%E8%A5%BF%E5%AE%89&pid=9&city=120&time=1'get_html(url)

中国采购招标网爬虫采集破解相关推荐

  1. 中国采购招标网爬虫采集破解!你学会了吗?

    中国采购招标网 URL ,通过爬虫去请求该网站会返回521状态码,需要带着特定cookie去访问,此cookie又是动态变化,如果想要持续采集就得破解此cookie生成规则. 站点反爬分析 通过Fid ...

  2. 中国建设招标网,可以查询企业资质

    http://www.zhaobiao.gov.cn/corp.html?corpkind=&corpname= 中国建设招标网,可以查询企业资质,留着以后用

  3. python 中国裁决文书网 爬虫,完整版!!!

    代码: import execjs import requests headers={"Accept":"*/*", "Accept-Encoding ...

  4. python爬虫爬取中国天气网_【实战】中国天气网爬虫之华北城市数据爬取

    概述: 在人工智能来临的今天,数据显得格外重要.在互联网的浩瀚大海洋中,隐藏着无穷的数据和信息.因此学习网络爬虫是在今天立足的一项必备技能.本路线专门针对想要从事Python网络爬虫的同学而准备的,并 ...

  5. 爬虫之爬取中国移动采购与招标网

    文章目录 一.确认爬取目标 二.尝试爬取 三.使用`pyppeteer`库 四.完整代码 一.确认爬取目标 爬取中国移动采购与招标网 https://b2b.10086.cn/b2b/main/lis ...

  6. 采集招标网所有招标数据

    l 采集网站 [场景描述]采集招标网上的所有的招标数据. [源网站介绍] 招标网是招标采购领域的招投标资讯和招投标服务平台,为各级政府采购.招标代理机构.招标企业.供应商.采购业主提供强大的专业招标采 ...

  7. bs4爬取的时候有两个标签相同_python爬虫初体验,爬取中国最好大学网大学名次...

    程序员天天只顾写生活琐事的文章可就太对不起其他的程序员们了,某大佬给我在线寄了一张刀片的图片,催更技术分享,不得不动手了.从今年刚开始学习python,美妙的语法令人陶醉,好用的第三方库令人爱不释手. ...

  8. 中国天气网爬虫数据可视化

    目录 中国天气网爬虫数据可视化 爬虫功能 网页分析 以华北地区为例分析网页源代码 1.以谷歌浏览器为例分析 2. 提取特征标签 3.分析源代码 利用requests库获取目标网页源代码 利用Beaut ...

  9. 中国土地市场网爬虫——字体woff加密还原

    通过我上篇博客:中国土地市场网爬虫--浏览器Cookie验证(简单) 和中国土地市场爬虫--浏览器cookie验证(图片验证码)讲述了中国土地市场网(www.landchina.com)的两种访问限制 ...

最新文章

  1. 机器学习如何做好分布外异常检测?谷歌这篇 NeurIPS 2019 论文提出了方法
  2. [Android学习笔记]查看源代码
  3. 基于ArcSDE的影像数据管理-疑惑篇 (转载)
  4. 描述一下普适计算时代中的计算机,《课程总结报告-普适计算及其应用》.doc
  5. BAPI:BAPI_CONTRACT_CREATE(内部合同创建)
  6. 图片不能置于底层怎么办_PPT中常遇到的图片问题和解决方案
  7. 实验1 最小生成树问题【Kruskal+Prim】
  8. AUTOSAR从入门到精通100讲(八十二)-AutoSAR之基础篇CanNM
  9. How to setup linked servers for SQL Server and Oracle 64 bit client
  10. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)
  11. linux设置最大打开文件数
  12. win11鼠标指针如何设置 Windows11鼠标指针的设置方法
  13. 如何在C#窗体中定义全局变量
  14. fl_studio-声卡设置、1
  15. centos7系统时间校对(和北京时间同步)
  16. php-gtk2怎么用,PHP+GTK2 初体验,简单计算器客户端
  17. 网易互娱C++岗一面面经(凉面)
  18. js区分单击双击,双击不会触发单击事件
  19. 1024程序员节来了,
  20. 检查你的python代码是否符合PEP8规范

热门文章

  1. 嵌入式linux文件系统缺少flash_eraseall工具
  2. 程序猿长时间面对电脑,眼睛着不住呀。给大家介绍一种软件,护眼的。
  3. HTML表单制作以及相关知识点总结
  4. 1,clouderaManager 介绍 : 免费版介绍
  5. 银行数字化转型导师坚鹏:金融科技如何赋能银行数字化营销
  6. css预处理Less
  7. 【GNN存在的问题和未来研究方向】
  8. mysqldump: Got error: 1049: Unknown database ‘itcast>‘ when selecting the database 解决步骤
  9. easyconnect xp登录_easyconnect
  10. 李嘉诚的经典演讲:打工才是最愚蠢的投资