在国内可以使用proxybroker
包,但可能会受到一些限制,除了某些 Python 版本不兼容(如 Python3.5 可能存在编码问题,Python3.10 中已移除了proxybroker
使用的loop
等),还有以下限制:
-
网络环境限制:国内的网络环境可能会对访问一些代理源进行限制,导致无法获取到代理 IP 或者获取速度很慢。部分国外的代理 IP 地址可能在国内无法正常使用,或者使用起来不稳定。
-
代理可用性:即使获取到了代理 IP,其可用性也不能完全保证。有些代理可能已经失效、速度很慢,或者存在其他问题,需要进行验证和筛选。
-
法律法规限制:使用代理 IP 时需要遵守国内的法律法规。如果将代理 IP 用于非法或违规的目的,可能会面临法律风险。
-
网站限制:目标网站可能有自己的反爬虫机制和限制策略,会对使用代理 IP 的访问进行检测和限制。例如,一些网站可能会对频繁更换 IP 的访问行为进行限制或封禁。
总的来讲,这段代码运行容易出错,上面 天傲到了原因。不要花费太大力气在上面,不要太纠结!!!
以下是图形界面查询代理服务器代码(可以试下):
- 首先安装proxybroker库:
pip install proxybroker -i https://pypi.tuna.tsinghua.edu.cn/simple
- 运行下列代码,注意请使用python3.7 or 3.8版本:
import asyncio
import tkinter as tk
from proxybroker import Broker
import requests
def display_proxies(proxies):
for proxy in proxies:
proxy_info = f'{proxy.type}://{proxy.host}:{proxy.port}'
proxy_text.insert(tk.END, proxy_info + '\n')
async def find_proxies():
proxies = []
broker = Broker()
found_proxies = await broker.find(types=['HTTP', 'HTTPS'], limit=10)
for proxy in found_proxies:
try:
response = requests.get('https://www.example.com', proxies={'http': f'{proxy.type}://{proxy.host}:{proxy.port}',
'https': f'{proxy.type}://{proxy.host}:{proxy.port}'}, timeout=5)
if response.status_code == 200:
proxies.append(proxy)
except (requests.exceptions.ConnectTimeout, requests.exceptions.ConnectionError):
pass
display_proxies(proxies)
def on_find_clicked():
asyncio.run(find_proxies())
root = tk.Tk()
root.title("Proxy Finder")
proxy_text = tk.Text(root)
proxy_text.pack()
find_button = tk.Button(root, text="Find Proxies", command=on_find_clicked)
find_button.pack()
root.mainloop()
以下是对这段代码的解释:
import asyncio
import tkinter as tk
from proxybroker import Broker
import requests
- 导入了必要的模块。
asyncio
用于异步编程;tkinter
是 Python 的标准 GUI 工具包,这里使用别名tk
来方便引用;from proxybroker import Broker
导入了proxybroker
库中的Broker
类,用于查找代理;requests
模块用于发送 HTTP 请求来验证代理的可用性。
def display_proxies(proxies):
for proxy in proxies:
proxy_info = f'{proxy.type}://{proxy.host}:{proxy.port}'
proxy_text.insert(tk.END, proxy_info + '\n')
- 定义了一个函数
display_proxies
,接受一个代理列表作为参数。函数遍历代理列表,将每个代理的信息格式化为字符串(如http://127.0.0.1:8080
),并插入到一个tkinter.Text
组件(后面定义的proxy_text
)中,每个代理信息占一行。
async def find_proxies():
proxies = []
broker = Broker()
found_proxies = await broker.find(types=['HTTP', 'HTTPS'], limit=10)
for proxy in found_proxies:
try:
response = requests.get('https://www.example.com', proxies={'http': f'{proxy.type}://{proxy.host}:{proxy.port}',
'https': f'{proxy.type}://{proxy.host}:{proxy.port}'}, timeout=5)
if response.status_code == 200:
proxies.append(proxy)
except (requests.exceptions.ConnectTimeout, requests.exceptions.ConnectionError):
pass
display_proxies(proxies)
- 定义了一个异步函数
find_proxies
。首先创建一个空的代理列表proxies
。然后创建一个Broker
对象,使用await broker.find(types=['HTTP', 'HTTPS'], limit=10)
异步查找最多 10 个 HTTP 和 HTTPS 类型的代理。对于找到的每个代理,尝试使用该代理向https://www.example.com
发送请求,如果请求成功且响应状态码为 200,则将该代理添加到proxies
列表中。如果出现连接超时或连接错误,则忽略该代理。最后调用display_proxies
函数显示可用的代理。
def on_find_clicked():
asyncio.run(find_proxies())
- 定义了一个函数
on_find_clicked
,当按钮被点击时调用。它使用asyncio.run
运行异步函数find_proxies
。
root = tk.Tk()
root.title("Proxy Finder")
- 创建一个
tkinter.Tk
对象,代表应用的主窗口,并设置窗口标题为 “Proxy Finder”。
proxy_text = tk.Text(root)
proxy_text.pack()
- 创建一个
tkinter.Text
组件,用于显示找到的代理信息,并使用pack
方法将其放置在主窗口中。
find_button = tk.Button(root, text="Find Proxies", command=on_find_clicked)
find_button.pack()
- 创建一个
tkinter.Button
按钮,文本为 “Find Proxies”,当按钮被点击时执行on_find_clicked
函数。然后将按钮放置在主窗口中。
root.mainloop()
- 启动
tkinter
的主事件循环,使应用程序持续运行,等待用户交互。