python通过Keep-Alive保持IP不变,向多个页面发出请求,通过多线程实现并发控制
#! -*- 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()
原文地址:https://blog.csdn.net/Z_suger7/article/details/135775465
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!