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的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
Python检测生僻字的实现方法
Oct 23 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
Jun 14 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
matplotlib.pyplot画图并导出保存的实例
Dec 07 Python
tensorflow之并行读入数据详解
Feb 05 Python
TensorFlow Autodiff自动微分详解
Jul 06 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
Pytorch中的数据集划分&正则化方法
May 27 Python
OpenCV-Python实现人脸磨皮算法
Jun 07 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制作万年历
2015/01/07 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
php实现的双色球算法示例
2017/06/20 PHP
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
学习python处理python编码问题
2011/03/13 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
Python 复平面绘图实例
2019/11/21 Python
Python字符串的修改方法实例
2019/12/19 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
最好的商品表达自己:Cafepress
2019/09/04 全球购物
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
委托证明的格式
2014/01/10 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
基层党员对照检查材料
2014/09/24 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android