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实现比较两个列表(list)范围
Jun 12 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
解决Django migrate No changes detected 不能创建表的问题
May 27 Python
django缓存配置的几种方法详解
Jul 16 Python
Python3实现腾讯云OCR识别
Nov 27 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
python递归下载文件夹下所有文件
Aug 31 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
Python类及获取对象属性方法解析
Jun 15 Python
python实现自动清理文件夹旧文件
May 10 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
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
php cookie的操作实现代码(登录)
2010/12/29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
js实现超级玛丽小游戏
2020/03/18 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
Python中property函数用法实例分析
2018/06/04 Python
Python 读写文件的操作代码
2018/09/20 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
python矩阵的转置和逆转实例
2018/12/12 Python
python调试神器PySnooper的使用
2019/07/03 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
英文自我鉴定
2013/12/10 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
化验室安全管理制度
2015/08/06 职场文书
大学军训口号大全
2015/12/24 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server