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实现通过哈希算法检测图片重复的教程
Apr 02 Python
基于python实现微信模板消息
Dec 21 Python
python 网络编程常用代码段
Aug 28 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 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源代码
2006/10/09 PHP
php 静态化实现代码
2009/03/20 PHP
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
简单谈谈python中的多进程
2016/11/06 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
使用Python封装excel操作指南
2021/01/29 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
adidas美国官网:adidas US
2016/09/21 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
实习会计求职自荐信范文
2014/03/10 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android