You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup抓取spys.one免费HTTPS代理无法获取端口号求助

问题原因

端口号由页面内嵌JavaScript动态计算生成,BeautifulSoup仅能解析静态HTML源码,无法执行JS逻辑,因此无法直接提取到端口。


方案1:使用支持JS渲染的requests-html库直接获取渲染后的完整内容

无需手动破解JS加密逻辑,直接模拟浏览器执行JS后提取内容,实现成本最低。
首先安装依赖:

pip install requests-html

完整可运行代码:

from requests_html import HTMLSession

HEADER = {"ACCEPT-LANGUAGE": "en-US,en;q=0.9",
          "USER-AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                        "Chrome/92.0.4515.159 Safari/537.36"}

session = HTMLSession()
response = session.get(url="https://spys.one/en/https-ssl-proxy", headers=HEADER)
# 等待页面JS渲染完成,首次运行会自动下载Chromium内核
response.html.render(timeout=20)

proxy_list = []
all_spy14 = response.html.find("font.spy14")
for tag in all_spy14:
    text = tag.text.strip()
    if "." in text and ":" in text and "(" not in text:
        proxy_list.append(text)

print(proxy_list)
session.close()

方案2:手动解析JS逻辑计算端口(无需渲染,性能更高)

如果不想引入渲染依赖,可以手动提取页面加密变量,计算端口值。
依赖安装:

pip install PyExecJS

核心代码:

import re
import execjs
import requests
from bs4 import BeautifulSoup

HEADER = {"ACCEPT-LANGUAGE": "en-US,en;q=0.9",
          "USER-AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                        "Chrome/92.0.4515.159 Safari/537.36"}

response = requests.get(url="https://spys.one/en/https-ssl-proxy", headers=HEADER)
response.raise_for_status()
soup = BeautifulSoup(response.text, "lxml")

# 提取页面所有加密变量
js_vars = re.findall(r'[a-zA-Z0-9]+=[0-9]+;', response.text)
js_context = execjs.compile("""
    %s
    function calc(expr) {
        return eval(expr);
    }
""" % ("\n".join(js_vars)))

proxy_list = []
all_ips = soup.find_all("font", attrs={"class": "spy14"})
for ip_tag in all_ips:
    ip = ip_tag.contents[0].strip()
    if "." not in ip or "(" in ip:
        continue
    # 提取端口计算表达式
    script = ip_tag.find("script")
    if not script:
        continue
    exprs = re.search(r'\+ \((.*?)\)\+ \((.*?)\)\+ \((.*?)\)\+ \((.*?)\)', script.string).groups()
    port = "".join([str(js_context.call("calc", e)) for e in exprs])
    proxy_list.append(f"{ip}:{port}")

print(proxy_list)

注意:该站点存在反爬限制,请求频率不要过高,IP被封禁后将无法正常获取数据。

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:00:00