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中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
Python中return语句用法实例分析
Aug 04 Python
python 二分查找和快速排序实例详解
Oct 13 Python
python使用PyCharm进行远程开发和调试
Nov 02 Python
基于python if 判断选择结构的实例详解
May 06 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
python数组循环处理方法
Aug 26 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
浅析python函数式编程
Sep 26 Python
python 5个实用的技巧
Sep 27 Python
pytorch 中nn.Dropout的使用说明
May 20 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 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
神族 PROTOSS 概述
2020/03/14 星际争霸
mysql 性能的检查和优化方法
2009/06/21 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
python回调函数用法实例分析
2015/05/09 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
Python jieba库用法及实例解析
2019/11/04 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
创先争优个人承诺书
2014/08/30 职场文书
2014年班组工作总结
2014/11/20 职场文书
自我推荐信怎么写
2015/03/24 职场文书
pytorch 使用半精度模型部署的操作
2021/05/24 Python
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers