今天爬取网站返回状态码521,经过分析发现是JS混淆加密,以下是具体破解代码:

import execjs
import re
import requests
import timeurl = 'http://www.mps.gov.cn/n2254536/n2254544/n2254552/n6636622/n6636639/c6641737/content.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
req = requests.get(url, headers=headers, timeout=5)
print(req.status_code,req.text)

直接请求返回的状态码是521,内容是一串看不懂的js字符串

用python 执行js代码,获取到我们需要的__jsl_clearance

func_return = js_con.replace('eval(', 'return(')  #js代码里eval替换return
content = execjs.compile(func_return)
fn = js_con.split('=')[0].split(' ')[1]  #获取js函数名
evaled_func = content.call(fn)
fn = evaled_func.split('=')[0].split(' ')[1]  # 获取动态函数名
aa = evaled_func.split("<a href=\\'/\\'>")  # 获取<a>标签的内容
aa = aa[1].split("</a>")[0] if len(aa) >= 2 else  ''#替换js字符串
mode_func = evaled_func. \replace("setTimeout('location.href=location.pathname+location.search.replace(/[\\?|&]captcha-challenge/,\\'\\')',1500);document.cookie=",'return'). \replace(';if((function(){try{return !!window.addEventListener;}', ''). \replace("}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded'," + fn + ",false)}else{document.attachEvent('onreadystatechange'," + fn + ")",''). \replace("if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded'," + fn + ",false)}else{document.attachEvent('onreadystatechange'," + fn + ")",''). \replace("return'__jsl_clearance", "var window={};return '__jsl_clearance"). \replace("var " + fn + "=document.createElement('div');" + fn + ".innerHTML='<a href=\\'/\\'>" + aa + "</a>';" + fn + "=" + fn + ".firstChild.href","var " + fn + "='" + url + "'")
content = execjs.compile(mode_func)
cookies = content.call(fn)
__jsl_clearance = cookies.split(';')[0]
print(__jsl_clearance)  #最终得到__jsl_clearance

获取到cookies 的__jsl_clearance

以下是完整代码

import execjs
import re
import requests
import timeurl = 'http://www.mps.gov.cn/n2254536/n2254544/n2254552/n6636622/n6636639/c6641737/content.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}def get_521_content(url):req = requests.get(url, headers=headers, timeout=5)print(req.status_code,req.text)if req.status_code == 521:cookies = dict(req.cookies.items())print(cookies)js_con = ''.join(re.findall('<script>(.*?)</script>', req.text))if js_con:__jsl_clearance = fixed_fun(js_con, url)if __jsl_clearance:key, value = __jsl_clearance.split('=')cookies[key] = valuereturn cookies# 执行js代码获取cookies 的__jsl_clearance的键值
def fixed_fun(js_con, url):  # js_con 第一次请求获取的js内容func_return = js_con.replace('eval(', 'return(')print('第一次替换eval==》return后:  ', func_return)content = execjs.compile(func_return)fn = js_con.split('=')[0].split(' ')[1]evaled_func = content.call(fn)print('第一次执行js代码后: ', evaled_func)fn = evaled_func.split('=')[0].split(' ')[1]  # 获取动态函数名aa = evaled_func.split("<a href=\\'/\\'>")  # 获取<a>标签的内容aa = aa[1].split("</a>")[0] if len(aa) >= 2 else  ''mode_func = evaled_func. \replace("setTimeout('location.href=location.pathname+location.search.replace(/[\\?|&]captcha-challenge/,\\'\\')',1500);document.cookie=",'return'). \replace(';if((function(){try{return !!window.addEventListener;}', ''). \replace("}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded'," + fn + ",false)}else{document.attachEvent('onreadystatechange'," + fn + ")",''). \replace("if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded'," + fn + ",false)}else{document.attachEvent('onreadystatechange'," + fn + ")",''). \replace("return'__jsl_clearance", "var window={};return '__jsl_clearance"). \replace("var " + fn + "=document.createElement('div');" + fn + ".innerHTML='<a href=\\'/\\'>" + aa + "</a>';" + fn + "=" + fn + ".firstChild.href","var " + fn + "='" + url + "'")print('第二次替换后的js代码:', mode_func)try:content = execjs.compile(mode_func)cookies = content.call(fn)__jsl_clearance = cookies.split(';')[0]print(__jsl_clearance)return __jsl_clearanceexcept:print('js执行错误:', mode_func)return None# 携带解密后的cookies第二次爬取详情页
def con_spider(cookies, url):response = requests.get(url, headers=headers, cookies=cookies, timeout=5)if response.status_code == 200:response.encoding = 'utf-8'print(response.status_code)print(response.text)return responseelse:print('第二次爬取错误状态码:', response.status_code)return Noneif __name__ == "__main__":cookies = get_521_content(url)con_spider(cookies, url)

最终返回200

python 爬虫返回521相关推荐

  1. html状态码521,python爬虫 处理521状态码

    在抓取数据的时候往往可以通过状态码来判断返回结果,今天在抓取数据的时候碰到了以前没有碰到过得状态码521,输出它的爬取内容(text),发现是一些js代码.一起探讨一下如何处理521状态码. 用cha ...

  2. python爬虫返回文本为乱码的解决方法

    1.在网站爬取文章时,返回的结果为乱码,如下 2.出现这种情况是因为访问page_text.text时,Requests会使用其推测的文本编码. 查看网页返回的字符集类型:page_text.appa ...

  3. 关于Python爬取网页返回521状况码的解决方案

    文章目录 问题描述: 原因分析: 解决方案: 方法一: 方法二: 方法三: 代码一 代码二 代码三 代码四 代码五 Test代码 # 项目场景: Python3.8 问题描述: 在使用Python爬虫 ...

  4. 【Python爬虫实例】Python解决521反爬方案

    参考文献:https://github.com/xiantang/Spider/blob/master/Anti_Anti_Spider_521/pass_521.py 写在前面的话:Python在爬 ...

  5. python request返回的响应_Python爬虫库requests获取响应内容、响应状态码、响应头...

    首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...

  6. [爬虫]请求返回521解决方法

    我需要抓取的网站是国家企业信用信息公示系统,但是该网站有反爬虫,一般的url下载方法并不适用,下面是我通过查资料后总结的一个可行的方法. 首先,要通过url和Cookie还有User-Agent去请求 ...

  7. python爬虫处理js混淆加密_Python爬虫—破解JS加密的Cookie

    專 欄 ❈Jerry,Python中文社区专栏作者. blog:https://my.oschina.net/jhao104/blog github:https://github.com/jhao10 ...

  8. 关于Python爬虫原理和数据抓取1.1

    为什么要做爬虫? 首先请问:都说现在是"大数据时代",那数据从何而来? 企业产生的用户数据:百度指数.阿里指数.TBI腾讯浏览指数.新浪微博指数 数据平台购买数据:数据堂.国云数据 ...

  9. python爬虫之Scrapy框架的post请求和核心组件的工作 流程

    python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...

最新文章

  1. 购买《四级网络工程师预测试卷与考点解析》,哪里最便宜?
  2. jquery操作dom
  3. batocera_batocera系统如何把旧电脑改造成影音游戏主机
  4. python画图猪_用Python的turtle画一只小猪乔治【刚学python两天,记念一下】
  5. Hadoop:Hadoop简介及环境配置
  6. CSS学习总结(4)——盒模型/背景属性
  7. jmeter安装配置教程
  8. CCNA学习指南第三章
  9. Sentaurus入门(1):工艺仿真
  10. 处理服务器恶意程序 kthreaddi挖矿
  11. PASCAL VOC数据集训练集、验证集、测试集的划分和提取
  12. 排名前十的天使投资机构
  13. 如何打造一个让人愉快的框架
  14. Excel保存文件不能直接打开,打开之后显示灰屏,从左上角的文件中,再找到要打开的文件才能打开?
  15. 计算机机房线槽,镀锌线槽机房布线的使用方式
  16. 在SAR-Opt数据融合领域针对深度学习的SEN1-2数据集
  17. 病毒木马查杀实战第009篇:QQ盗号木马之手动查杀
  18. 网络渗透试验一实验报告
  19. 先做接口测试还是功能测试
  20. MySQL之SQL基础

热门文章

  1. 2021 VSCode前端插件推荐
  2. VSCode配置调试JavaScript代码
  3. block才会执行 mono_LuaPerfect常见问题
  4. Resource not found: rgbd_launch ROS path [0]=/opt/ros/melodic/share/ros ROS path [1]=/opt/ros/melodi
  5. 三坐标测量基础知识之开机和关机的顺序
  6. 计算机不支持1T的硬盘,现在竟然还有这样的奸商,修电脑还跟客户换硬件,大家要当心啊!...
  7. ubuntu18.4中查看mysql_Ubuntu18.0.4下mysql 8.0.20 安装配置方法图文教程
  8. [SprintBoot]Flyway与Shiro加载冲突解决探讨
  9. 京东准点秒杀脚本,准点自动加入购物车,准点自动秒杀
  10. UnityHub安装Unity+Android模块失败