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实现115网盘自动下载的方法
Sep 30 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
用Python进行基础的函数式编程的教程
Mar 31 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
Python 获取div标签中的文字实例
Dec 20 Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 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
YB217、YB235、YB400浅听
2021/03/02 无线电
我的论坛源代码(七)
2006/10/09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
php实现文章评论系统
2019/02/18 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
js Math 对象的方法
2013/09/01 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
Python端口扫描简单程序
2016/11/10 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
flask中的wtforms使用方法
2018/07/21 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
六月份红领巾广播稿
2014/02/03 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript