这里我们可以通过 python+urllib2+Proxy-Tunnel 保持 IP 不变,同时通过多线程处理。
! -- encoding:utf-8 -- import requests # 导入requests库 import random import threading # 导入threading库,用于多线程
要访问的目标页面
targetUrlList = [ “https://httpbin.org/ip”, “https://httpbin.org/headers”, “https://httpbin.org/user-agent”, ]
代理服务器(产品官网 www.16yun.cn)
proxyHost = “t.16yun.cn” proxyPort = “31111”
代理验证信息
proxyUser = “16yun” proxyPass = “16ip”
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}" # 使用f-string格式化字符串
设置 http和https访问都是用HTTP代理
proxies = { “http”: proxyMeta, “https”: proxyMeta, }
tunnel = random.randint(1, 10000) headers = {“Proxy-Tunnel”: str(tunnel)}
定义一个变量,用于统计请求次数
request_count = 0
定义一个锁对象,用于保护请求次数的变量
lock = threading.Lock()
定义一个函数,用于发起请求和打印响应
def get_url(url): global request_count # 声明全局变量 r = requests.get(url, proxies=proxies, headers=headers) 使用requests库发起请求,传入代理和头信息 判断状态码是否为200,如果不是,打印错误信息 if r.status_code == 200: print(r.text) 打印响应内容 else: print(f"请求失败,状态码为{r.status_code}") 打印错误信息 获取锁,如果锁被占用,就等待,直到锁释放 lock.acquire() request_count += 1 请求次数加一 释放锁,让其他线程可以获取锁 lock.release()
定义一个列表,用于存放线程对象
threads = []
访问三次网站,使用相同的tunnel标志,均能够保持相同的外网IP
for i in range(3): for url in targetUrlList: t = threading.Thread(target=get_url, args=(url,)) # 创建线程对象,传入url参数 threads.append(t) # 将线程对象添加到列表中
启动所有线程
for t in threads: t.start()
等待所有线程结束
for t in threads: t.join()
打印请求次数
print(f"总共请求了{request_count}次")
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。