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实现监控linux性能及进程消耗性能的方法
Jul 25 Python
python实现斐波那契递归函数的方法
Sep 08 Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 Python
详细介绍Python的鸭子类型
Sep 12 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
Python学习小技巧总结
Jun 10 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
Django展示可视化图表的多种方式
Apr 08 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
通过php添加xml文档内容的方法
2015/01/23 PHP
PHP简单日历实现方法
2016/07/20 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
Pyqt5实现英文学习词典
2019/06/24 Python
Django中FilePathField字段的用法
2020/05/21 Python
Python定义一个函数的方法
2020/06/15 Python
Python如何实现机器人聊天
2020/09/10 Python
python3代码中实现加法重载的实例
2020/12/03 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
电脑租赁公司创业计划书
2014/01/08 职场文书
小学生期末评语
2014/04/21 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
自我工作评价范文
2015/03/06 职场文书
总经理聘用协议书
2015/09/21 职场文书
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js