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的系列篇的文章里有的

原文地址:https://www.cnblogs.com/Eeyhan/p/15293227.html