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()

你可能感兴趣的:(python,开发语言,爬虫)