开发者社区> 问答> 正文

python 爬取过程中如何保持多个会话?

python 爬取过程中如何保持多个会话?

展开
收起
OSC开源社区 2024-06-15 23:10:29 14 0
1 条回答
写回答
取消 提交回答
  • 这里我们可以通过 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, }

    设置IP切换头

    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}次")

    2024-06-16 08:28:57
    赞同 1 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载