python爬虫的一个常见简单js反爬详解


Posted in Python onJuly 09, 2019

前言

我们在写爬虫是遇到最多的应该就是js反爬了,今天分享一个比较常见的js反爬,这个我已经在多个网站上见到过了。

我把js反爬分为参数由js加密生成和js生成cookie等来操作浏览器这两部分,今天说的是第二种情况。

目标网站

列表页url:  http://www.hnrexian.com/archives/category/jk。

正常网站我们请求url会返回给我们网页数据内容等,看看这个网站返回给我们的是什么呢?

我们把相应中返回的js代码格式化一下,方便查看。

< script type = "text/javascript" >
function stringToHex(str) {
  var val = "";
  for (var i = 0; i < str.length; i++) {
    if (val == "") val = str.charCodeAt(i).toString(16);
    else val += str.charCodeAt(i).toString(16);
  }
  return val;
}
function YunSuoAutoJump() {
  var width = screen.width;
  var height = screen.height;
  var screendate = width + "," + height;
  var curlocation = window.location.href;
  if ( - 1 == curlocation.indexOf("security_verify_")) {
    document.cookie = "srcurl=" + stringToHex(window.location.href) + ";path=/;";
  }
  self.location = "/archives/category/jk?security_verify_data=" + stringToHex(screendate);
} < /script>
 <script>setTimeout("YunSuoAutoJump()", 50);</script >

说好的返回网页数据源码呢,这是什么东西!

js破解思路

js破解提供两种思路,一种是直接用Python来重写js内容,实现模拟js的操作,这种一般用于比较简单的js;还有一种是用Python第三方库来解析js,比如pyv8,execjs这些(个人觉得execjs比较好用),这种一般用于比较复杂的js解析。

分析返回的js分成两个部分。第一部分,定义了stringToHex和YunSuoAutoJump两个函数。第二部分,50毫秒后执行YunSuoAutoJump这个函数。

YunSuoAutoJump这个函数功能是添加一个cookie并去请求一个构造的url,可以从document.cookie 和 self.location这里看出。stringToHex这个函数的共能其实就是字符串的转换,具体js内容可以参考这个网址https://www.runoob.com/js/js-tutorial.html自行查找。

python重写代码

那么接下来就是用python来重写js啦,重写后代码如下。

def stringToHex(string):
  length = len(string)
  hex_string = str()
  for i in xrange(length):
    hex_string += hex(ord(string[i]))[2:]
  return hex_string

def get_cookie(url):
  hex_string = stringToHex(url)
  cookie = {"srcurl": hex_string, "path": "/"}
  return cookie

这是那两个函数,一个用于字符串转换,一个用于获取cookie。

最后拿到结果

接下来模拟浏览器操作,其中是分为三部分。第一次,我们请求目标url,然后返回给我们js内容;第二次,js添加1个cookie并请求了1个构造出的url;第三次请求原目标url,得到最终的数据。

这里我们用requests.Session来保持连接,模拟上面三部的内容。

url = "http://www.hnrexian.com/archives/category/jk"
s = requests.Session()
r = s.get(url)
url_2 = re.compile("self\.location\s*=\s*\"(.*?)\"").findall(r.text)[0]
screen_date = "1920,1080"
url_2 = url_2 + stringToHex(screen_date)
url_2 = urljoin(url, url_2)
cookie = get_cookie(url)
s.cookies.update(cookie)
r2 = s.get(url_2)
url3 = re.compile("self\.location\s*=\s*\"(.*?)\"").findall(r2.text)[0]
r3 = s.get(url3)
r3.encoding = "gbk"
print r3.text

到这里我们就完美得到最后想要的内容了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写的一个文本编辑器
Jan 23 Python
python下MySQLdb用法实例分析
Jun 08 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
selenium+python环境配置教程详解
May 28 Python
python os.fork() 循环输出方法
Aug 08 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
Python新手如何理解循环加载模块
May 29 Python
python 自动识别并连接串口的实现
Jan 19 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 Python
详解PANDAS 数据合并与重塑(join/merge篇)
Jul 09 #Python
python 返回一个列表中第二大的数方法
Jul 09 #Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 #Python
Python3中的最大整数和最大浮点数实例
Jul 09 #Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 #Python
python自定义函数实现最大值的输出方法
Jul 09 #Python
mac系统下Redis安装和使用步骤详解
Jul 09 #Python
You might like
如何使用脚本模仿登陆过程
2006/11/22 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
PHP5函数小全(分享)
2013/06/06 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
记录Django开发心得
2014/07/16 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
采购部岗位职责
2013/11/24 职场文书
签约仪式主持词
2014/03/19 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
初中学生期末评语
2014/04/24 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
文案策划岗位职责
2015/02/11 职场文书
暖春观后感
2015/06/08 职场文书
React如何创建组件
2021/06/27 Javascript
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技