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中实现精确的浮点数运算详解
Nov 02 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
Python模块搜索路径代码详解
Jan 29 Python
python中kmeans聚类实现代码
Feb 23 Python
python图书管理系统
Apr 05 Python
python实现简单五子棋游戏
Jun 18 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
如何使用Python自动控制windows桌面
Jul 11 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
关于Python turtle库使用时坐标的确定方法
Mar 19 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 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
javascript编程起步(第五课)
2007/01/10 Javascript
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
python中的print()输出
2019/04/12 Python
举例讲解Python装饰器
2020/12/24 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
违反校纪校规检讨书
2014/02/15 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
英文请假条
2014/04/11 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
mysql查询结果实现多列拼接查询
2022/04/03 MySQL
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers