zoukankan      html  css  js  c++  java
  • python爬虫

    前言

    这次这个网站很巧,也是一个代理网站,不过这次不是我那老朋友给的了,是我自己偶然找到的,而且也是端口加密的,跟之前某篇文章差不多。

    想源网址的,为了避免一些不必要的麻烦,私我给地址吧(直接在博客园私信,不用去其他地方,免得误会我是为了推广拉新啥的)

    这个网站虽然是国外的(需要挂dl访问),安全等级虽然也很低,对js逆向感兴趣的可以拿来练练手,但拿到到网址的朋友也请不要毫不留情的去一直请求别人网站。

    开始分析

    打开网站

    发现端口加密了(其实这里严格意义上都不叫加密),查看源码确认:

     确实如此

    现在怎么办呢,不用说,端口肯定是这几个参数,控制台里看能直接访问不:

     能直接访问,而且结果能对上,说明这几个参数是全局定义的变量,到处都可以调用,说到这,你知道我上面为什么要说都不算加密了吧,这都没涉及到js逆向的,直接就拿到了

    接下来就找这几个变量是在哪定义的了,既然是全局定义的,那么先找源码里的script标签的js代码,看有没有,没有再去引入的js文件里找,不过,说实话,它这个都是小写的字母,直接搜索确实不好搜,因为匹配到的太多了。

    先找源码里的script吧,从头开始找

    找到关键点

    从头一找就找到了,这运气就是好:

    而且这几个参数的值我对应了下,确实能跟源码展示的端口对上

    接下来就是用python改写这段代码了

    用python实现

    在实现之前,先用xpath把值拿到

    说下这里我为什么要拼接成字符串,因为这样,才能更源码里对上,因为源码是用的字符串拼接,而不是数字加减:

    那么这段代码怎么执行呢,用exec,如下,我其实并没有定义l,用exec后就可以直接调用

    然后再把ip拿到,然后拼接起来就可以了,注意拼接端口时用的eval,而不是exec

    用这个结果跟源码对比:

    发现能对上,ok了

    完整代码

    import requests
    from lxml import etree
    from lxml.html import tostring
    from bs4 import BeautifulSoup, Comment
    
    HEADERS = {
        'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-site': 'cross-site',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'Connection': 'close',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
    }
    
    url = '' # 保密
    
    req = requests.get(url, headers=HEADERS)
    res = req.content.decode('utf-8')
    html = etree.HTML(res)
    key = html.xpath('//script[contains(@src,"js1")]/following-sibling::script[1]/text()')
    key = ''.join(key) if key else ''
    key = key.strip().replace(' ', '').replace('=', '=str(').replace(';', ');')
    print(23123, key)
    end = []
    if key:
        exec(key)
        data = html.xpath('//table[@id="proxylist"]/tr')
        for item in data:
            ip = item.xpath('./td[2]/text()')
            ip = ''.join(ip) if ip else ''
            port_temp = item.xpath('./td[2]/script/text()')
            port_temp = ''.join(port_temp) if port_temp else ''
            port_temp = port_temp.replace('document.write(":"+', '').replace(')', '')
            port = eval(port_temp)
            if ip and port:
                proxy = ip + ":" + port
                end.append(proxy)
        print(12312, len(end), end)

    结语

    是不是不算加密嘛?我反正是觉得真的不叫加密,只是看起来就点不好操作,但是你只要稍微的懂点javascript代码都可以搞定的。

    另外,请注意exec和eval的用法,这个是属于python的基础了,这个在我的从零学python的系列篇的文章里有的

  • 相关阅读:
    JPA条件查询时间区间用LocalDateTime的问题
    Java常用的异常类型
    Android 通用流行框架
    html图标插件
    炫酷科技
    使用zxing生成二维码
    八款常见的Android游戏引擎
    opengl es中不同的绘制方式
    Xml序列化去掉命名空间,去掉申明
    win8 app GridView点击子项布局变更
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/15293227.html
Copyright © 2011-2022 走看看