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实现Windows上气泡提醒效果的方法
Jun 03 Python
Python实现GUI学生信息管理系统
Apr 05 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
Python PO设计模式的具体使用
Aug 16 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
基于python实现生成指定大小txt文档
Jul 20 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 Python
Python切片列表字符串如何实现切换
Aug 06 Python
记一次django内存异常排查及解决方法
Aug 07 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
运行Python编写的程序方法实例
Oct 21 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
德生1994机评
2021/03/02 无线电
培养自己的php编码规范
2015/09/28 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
Node.js简单入门前传
2017/08/21 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
python写的一个squid访问日志分析的小程序
2014/09/17 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
电台实习生求职信
2014/02/25 职场文书
大学军训感言400字
2014/03/11 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
画展观后感
2015/06/17 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL