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使用matplotlib绘制动画的方法
May 20 Python
带你了解python装饰器
Jun 15 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
Tensorflow 同时载入多个模型的实例讲解
Jul 27 Python
python使用response.read()接收json数据的实例
Dec 19 Python
jupyter notebook 中输出pyecharts图实例
Apr 23 Python
python elasticsearch环境搭建详解
Sep 02 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
Python调用C语言程序方法解析
Jul 07 Python
java关于string最常出现的面试题整理
Jan 18 Python
Python图片处理之图片裁剪教程
May 27 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中的字符串函数
2006/10/09 PHP
PHP 递归效率分析
2009/11/24 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP使用递归生成文章树
2015/04/21 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
jQuery中的常用事件总结
2009/12/27 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python中random模块用法实例分析
2015/05/19 Python
python中import与from方法总结(推荐)
2019/03/21 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
Python 实现一个计时器
2020/07/28 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
奥运会口号
2014/06/13 职场文书
员工培训协议书
2014/09/15 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
小学毕业教师寄语
2019/06/21 职场文书
Oracle 多表查询基本语法实例
2022/04/18 Oracle