beautifulsoup 爬取数字注释,提取不了原数字,原文显示内容是“8080”,但爬取后,每次都显示不同数字。

问题:原文显示内容是“8080”,但爬取后,每次都显示不同数字。

一、网页内容
图片描述

二、程序
import requests
from bs4 import BeautifulSoup

User_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
headers={'User-agent':User_Agent}

proxy = []
url = 'https://proxy.coderbusy.com/'
res = requests.get(url,headers=headers)
soup = BeautifulSoup(res.text,'lxml')
ips = soup.findAll('tr')

for x in range(1,len(ips)):

ip = ips[x]
ip_temp = soup.select('#site-app > div > div > div > div > table > tbody > tr > td.port-box')
aa=ip_temp[0].attrs.get('data-ip')
aaa=ip_temp[0].string

print(ip_temp[0])
print(aa)
print (aaa)

三、运行结果
<td class="port-box" data-i="8450" data-ip="62.33.159.116">17981</td>
62.33.159.116
17981

阅读 5.1k
2 个回答

真正的端口是页面加载完用 js 替换的。审查页面元素有个加密的 mian.js :

eval(function (p, a, c, k, e, d) { e = function (c) { return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; if (!''.replace(/^/, String)) { while (c--) d[e(c)] = k[c] || e(c); k = [function (e) { return d[e] }]; e = function () { return '\\w+' }; c = 1; }; while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]); return p; }('$(e(){$(\'\\f\\3\\g\\8\\1\\r\\p\\g\\k\')["\\4\\2\\q\\o"](e(u,h){5 7=$(h);5 j=7["\\i\\2\\1\\2"](\'\\a\\3\');5 9=l["\\3\\2\\8\\d\\4\\m\\b\\1"](7["\\i\\2\\1\\2"](\'\\a\'));5 c=j["\\d\\3\\n\\a\\1"](\'\\f\');t(5 6=0;6<c["\\n\\4\\b\\s\\1\\o"];6++){9-=l["\\3\\2\\8\\d\\4\\m\\b\\1"](c[6])}7["\\1\\4\\k\\1"](9)})})', 31, 31, '|x74|x61|x70|x65|var|d7|ClpoEy3|x72|TO5|x69|x6e|tVF6|x73|function|x2e|x6f|fnDKXroKU2|x64|jgemfCG4|x78|window|x49|x6c|x68|x62|x63|x2d|x67|for|wssP1'.split('|'), 0, {}))

在线解密一下得到:

$(function()
    {
    $('\x2e\x70\x6f\x72\x74\x2d\x62\x6f\x78')["\x65\x61\x63\x68"](function(wssP1,fnDKXroKU2)
        {
        var ClpoEy3=$(fnDKXroKU2);
        var jgemfCG4=ClpoEy3["\x64\x61\x74\x61"]('\x69\x70');
        var TO5=window["\x70\x61\x72\x73\x65\x49\x6e\x74"](ClpoEy3["\x64\x61\x74\x61"]('\x69'));
        var tVF6=jgemfCG4["\x73\x70\x6c\x69\x74"]('\x2e');
        for(var d7=0;
        d7<tVF6["\x6c\x65\x6e\x67\x74\x68"];
        d7++)
            {
            TO5-=window["\x70\x61\x72\x73\x65\x49\x6e\x74"](tVF6[d7])
        }
        ClpoEy3["\x74\x65\x78\x74"](TO5)
    }
    )
}
)

十六进制转为字符串之后得到:

$(function() {
    $('.port-box')["each"](function(wssP1, fnDKXroKU2) {
        var ClpoEy3 = $(fnDKXroKU2);
        var jgemfCG4 = ClpoEy3["data"]('ip');
        var TO5 = window["parseInt"](ClpoEy3["data"]('i'));
        var tVF6 = jgemfCG4["split"]('.');
        for (var d7 = 0; d7 < tVF6["length"]; d7++) {
            TO5 -= window["parseInt"](tVF6[d7])
        }
        ClpoEy3["text"](TO5)
    })
})

从代码可以看出,真实的端口是 .prot-box 里 data-ip 属性值 减去 ip 的四位数之和

非常感谢1!你说了,我找了一下页面JS,真的有。但从外面看不到任何信息,一般怎么判定是否有JS?

“从代码可以看出,真实的端口是 .prot-box 里 data-ip 属性值 减去 ip 的四位数之和”
这个是固定值,但每次更新数值都变,是不是我理解错了那里?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进