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 相关文章推荐
Python3 入门教程 简单但比较不错
Nov 29 Python
python使用mysql数据库示例代码
May 21 Python
python flask实现分页的示例代码
Aug 02 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
python实现五子棋人机对战游戏
Mar 25 Python
Python 使用type来定义类的实现
Nov 19 Python
python实现画出e指数函数的图像
Nov 21 Python
python默认参数调用方法解析
Feb 09 Python
python怎么提高计算速度
Jun 11 Python
Python容器类型公共方法总结
Aug 19 Python
五种Python转义表示法
Nov 27 Python
python Timer 类使用介绍
Dec 28 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可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python逐行读取文件内容的三种方法
2014/01/20 Python
python实现网页链接提取的方法分享
2014/02/25 Python
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
python计算N天之后日期的方法
2015/03/31 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
Python I/O与进程的详细讲解
2019/03/08 Python
Flask-WTF表单的使用方法
2019/07/12 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
大学生学业生涯规划
2014/01/05 职场文书
打架检讨书100字
2014/01/19 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
服务质量承诺书
2014/03/27 职场文书
协议书范文
2015/01/27 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
校运会通讯稿
2015/07/18 职场文书
Python pandas读取CSV文件的注意事项(适合新手)
2021/06/20 Python