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实现处理管道的方法
Jun 04 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
浅谈Python中的zip()与*zip()函数详解
Feb 24 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
详解python多线程之间的同步(一)
Apr 03 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 24 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获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
微信小程序签到功能
2018/10/31 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
python字符串排序方法
2014/08/29 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Python实现时间序列可视化的方法
2019/08/06 Python
python多进程间通信代码实例
2019/09/30 Python
Python 日期与时间转换的方法
2020/08/01 Python
描述内存分配方式以及它们的区别
2016/10/15 面试题
家具促销活动方案
2014/02/16 职场文书
美术指导求职信
2014/03/17 职场文书
英文请假条
2014/04/11 职场文书
李开复演讲稿
2014/05/24 职场文书
诚信承诺书模板
2014/05/26 职场文书
教师节活动总结
2014/08/29 职场文书
毕业证委托书范文
2014/09/26 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
2015年春节标语口号
2014/12/09 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
python开发制作好看的时钟效果
2022/05/02 Python