#! -*- encoding:utf-8 -*-
import requests
import random
import requests.adapters
import threading # 导入threading模块
import time # 导入time模块
# 要访问的目标页面
targetUrlList = [
"https://httpbin.org/ip",
"https://httpbin.org/headers",
"https://httpbin.org/user-agent",
]
# 代理服务器(产品官网 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理验证信息
proxyUser = "username"
proxyPass = "password"
proxyMeta = f"http://{
proxyUser}:{
proxyPass}@{
proxyHost}:{
proxyPort}"
# 设置 http和https访问都是用HTTP代理
proxies = {
"http": proxyMeta,
"https": proxyMeta,
}
# 定义一个全局变量,用于记录上一次请求的时间
last_request_time = 0
# 定义一个全局变量,用于创建一个线程锁
lock = threading.Lock()
# 定义一个函数,用于访问一个目标网址
def visit_url(url, i):
global last_request_time # 声明全局变量
with requests.session() as s: # 使用with语句管理会话
with lock: # 使用线程锁
# 获取当前时间
current_time = time.time()
# 计算距离上一次请求的时间差
delta_time = current_time - last_request_time
# 如果时间差小于200毫秒,就等待一段时间
if delta_time < 0.2:
time.sleep(0.2 - delta_time)
# 更新上一次请求的时间
last_request_time = time.time()
# 发送请求
r = s.get(url, proxies=proxies)
print(f"第{
i+1}个网址,结果如下:") # 使用f-string格式化输出
print(r.text)
# 创建一个空的线程列表
threads = []
for i, url in enumerate(targetUrlList): # 使用enumerate函数遍历列表
# 创建一个线程,传入目标网址和索引
t = threading.Thread(target=visit_url, args=(url, i))
# 将线程添加到线程列表
threads.append(t)
# 启动线程
t.start()
# 等待所有线程结束
for t in threads:
t.join()
使用Python进行HTTP请求的并发处理:多线程与异步IO的狂欢
2024-01-25 04:00:08 47 阅读