如何在Python爬虫等程序中设置和调用http代理

在Python爬虫中为了更好地绕过反爬机制,获取网页信息,有时可能需要在Python中应用代理服务,这样做的目的就是防止自己的ip被服务器封禁,造成程序运行时中断连接,那么如何在python中设置代理呢? 我们通过几个实例来看一下,其实也不麻烦。

一、在requests中设置代理

在爬虫中我最常用的是reqeusts这个模块,除了设置user-agent, cookie之外,我们还可以加上代理ip。 下面我们给出一个利用http或https代理来访问XXX网站。 其中http或https代理可以通过在服务器上安装x-ui,设置http代理用户名和密码来实现。 有时,为了避免ip被封禁,可以绑定域名,用极光面板来设置中转代理,然后采用中转的域名来访问服务器,可以加快访问速度和安全性。

python 复制代码
import requests

# 设置代理,包括用户名和密码
proxy_username = 'user' #设置代理的用户名
proxy_password = 'password' #设置代理的密码
proxy_host = 'ip:port' #这里设置服务器的域名或ip并助加上端口

proxies = {
    'http': f'http://{proxy_username}:{proxy_password}@{proxy_host}',
    'https': f'http://{proxy_username}:{proxy_password}@{proxy_host}',
}

# 发起请求
try:
    response = requests.get('https://www. XXX.com', proxies=proxies) #XXX替换为你要爬取的网站
    print(response.text)  # 打印响应内容
except requests.exceptions.RequestException as e:
    print(f'请求出错: {e}')

二、在edge-tts中设置代理

最近edge-tts文本转音频的调用受到了限制,访问起来十分不便,我们可以在python实现代理服务,从而避开模块的限制。

python 复制代码
import edge_tts
import asyncio

# 设置代理,包括用户名、密码、服务器ip和端口
proxy_username = 'user'
proxy_password = 'password'
proxy_host = 'ip:port'
proxy = f'http://{proxy_username}:{proxy_password}@{proxy_host}'

async def main():
    # 创建一个 TTS 客户端
    communicate = edge_tts. Communicate(
        text="Hello, this is a text to speech conversion.",
        voice="en-US-AriaNeural",
        proxy= proxy
    )

    # 生成音频
    await communicate.save("output.mp3")

# 运行主函数
asyncio.run(main())

三、设置代理池proxy-pool

单个代理可能会出现失效的情况,我们可以设置一个代理池,把代理信息放到txt文件里,每次通过Python程序读取txt中的代理,随机调用代理池中的一个代理,即对代理池进行轮训,这样可以最大限度减少IP封禁的可能。这个代理也可以设置单个代理,通过get_proxy来获得。

python 复制代码
import random
class Proxy:
    def __init__(self, username, password, host):
        self.username = username
        self.password = password
        self.host = host

    def get_proxy(self):
        return f'http://{self.username}:{self.password}@{self.host}'

class ProxyPool:
    def __init__(self):
        self.proxies = []

    def add_proxy(self, username, password, host):
        proxy = Proxy(username, password, host)
        self.proxies.append(proxy)

    def load_proxies_from_file(self, file_path):
        with open(file_path, 'r') as file:
            for line in file:
                username, password, host = line.strip().split(',')
                self.add_proxy(username, password, host)

    def get_random_proxy(self):
        if not self.proxies:
            raise ValueError("Proxy pool is empty.")
        return random.choice(self.proxies).get_proxy()

# 示例用法
if __name__ == '__main__':
    proxy_pool = ProxyPool()
    
    # 从文件加载代理
    proxy_pool.load_proxies_from_file('proxy.txt')

    # 随机获取一个代理
    random_proxy = proxy_pool.get_random_proxy()
    print(random_proxy) 

使用以上程序,需要我们可以把代理信息放到proxy.txt文件中,用户名、密码和服务器信息用逗号隔开,这样运行程序后,我们可以随机调用一个代理,从而模拟多人使用此项服务的目的。

四、如何随机调用代理池中的代理

我们把设置好的代理信息放到proxy.txt中格式如下图所示:

代理格式

然后,我们通过以下代码随机调用代理池中的内容,并打印出来。这样每次向服务器发请求就是随机代理,减少了程序中断的可能性。

python 复制代码
from proxypool import ProxyPool #导入模块
proxy_pool = ProxyPool() #实例化

# 从文件加载代理
proxy_pool.load_proxies_from_file('proxy.txt')

# 随机获取一个代理
random_proxy = proxy_pool.get_random_proxy()

# 打印出来获取的代理
print(random_proxy)

五、学后总结

一直以来,我以为Python中的代理设置非常麻烦,事实上,经常测试,其实也不难。

问题的关键是找到一个有效的http代理,并在Python程序中设置好。

这是一个Python的进阶技巧,学会这个方法,可以解决很多程序运行受限的问题。

相关推荐
默_笙1 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003961 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技1 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时1 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊1 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1232 天前
2026年第38周GitHub趋势周报
python·科技·github