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中使用插入排序算法的简单分析与代码示例
May 04 Python
python异常和文件处理机制详解
Jul 19 Python
解决Python一行输出不显示的问题
Dec 03 Python
python处理两种分隔符的数据集方法
Dec 12 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
python flask框架实现重定向功能示例
Jul 02 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
Aug 12 Python
Django框架 信号调度原理解析
Sep 04 Python
Python解析多帧dicom数据详解
Jan 13 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
Python代码需要缩进吗
Jul 01 Python
利用django创建一个简易的博客网站的示例
Sep 29 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 进程锁定问题分析研究
2009/11/24 PHP
linux iconv方法的使用
2011/10/01 PHP
Laravel5中contracts详解
2015/03/02 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
python中星号变量的几种特殊用法
2016/09/07 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
应届生船舶驾驶求职信
2013/10/19 职场文书
借款担保书范文
2014/05/13 职场文书
历史学专业求职信
2014/06/19 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
家长对孩子的寄语
2015/02/26 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
入党介绍人考察意见
2015/06/01 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技