• python爬虫的一个常见简单js反爬


    python爬虫的一个常见简单js反爬

    我们在写爬虫是遇到最多的应该就是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.locations*=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.locations*=s*"(.*?)"").findall(r2.text)[0]
    r3 = s.get(url3)
    r3.encoding = "gbk"
    print r3.text
    

    到这里我们就完美得到最后想要的内容了。

    欢迎大家交流分享欧!感兴趣可以关注下我,公众号python爬虫笔记。

  • 相关阅读:
    IDEA 如何恢复默认布局 和显示项目目录导航
    jdbcTemplate 和 Thymeleaf模板引擎 查询 到模板赋值例子
    <meta charset="UTF-8"> 出错
    spring boot Thymeleaf模板引擎 最简单输出例子
    spring boot jpa 无法自动生成表
    IDea 运行程序就说ClassNotFind:com.jdbc.mysql.Driver
    pom.xml 里面dependency 添加spring-boot-starter-data-jpa 后运行出错
    IDEA 同时启动两个环境
    cannot resolve symbol
    Shell之expect的测试
  • 原文地址:https://www.cnblogs.com/jlc92blog/p/11042355.html
Copyright © 2020-2023  润新知