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

xiaotaomi7 发布于 2023/02/23 16:41
阅读 481
收藏 1

武汉源创会回归,4月20聊聊大模型”

这里我们可以通过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}次")

 

加载中
0
Python进阶者
Python进阶者

在 Python 中,我们可以使用 requests.Session 来保持多个会话,这个类可以在一个会话中保持 cookies、headers 等信息,并且可以跨请求地保持这些信息。

使用 requests.Session 的步骤如下:

  1. 创建一个 Session 对象:
 
pythonCopy code
import requests session = requests.Session()
  1. Session 对象上执行 HTTP 请求,而不是直接使用 requests 方法:
 
pythonCopy code
session.get(url) session.post(url, data)
  1. 如果需要在请求之间共享 cookies、headers 等信息,只需要在 Session 对象上设置一次就可以了:
 
pythonCopy code
session.headers.update({'User-Agent': 'Mozilla/5.0'}) session.cookies.update({'name': 'value'})
  1. 使用完毕后,关闭 Session 对象:
 
pythonCopy code
session.close()

使用 requests.Session 可以方便地在一个会话中保持登录状态、跨页面共享 cookies 等信息,提高爬虫的效率和可靠性。

0
osc_25329102
osc_25329102

永安在线,急招远程渗透工程师(可兼职),基本底薪5-10w(有能力的月入30万+)详细联系我Tg电报YCST88

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部