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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
Python类的专用方法实例分析
Jan 09 Python
Python实现在线程里运行scrapy的方法
Apr 07 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
python导入pandas具体步骤方法
Jun 23 Python
python之生产者消费者模型实现详解
Jul 27 Python
python使用matplotlib绘制雷达图
Oct 18 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
详解Python魔法方法之描述符类
May 26 Python
浅谈哪个Python库才最适合做数据可视化
Jun 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版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
分享PHP守护进程类
2015/12/30 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
js中如何完美的解析数据
2018/03/18 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
python logging添加filter教程
2019/12/24 Python
Python代码需要缩进吗
2020/07/01 Python
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
会议邀请函范文
2014/01/09 职场文书
人力资源主管职责范本
2014/03/05 职场文书
大学生创业计划书
2014/08/14 职场文书
2014年保育员工作总结
2014/12/02 职场文书
法人代表资格证明书
2015/06/18 职场文书