Python 实现模拟登录和爬取网页时的多线程和多进程技巧
Python实现模拟登录和爬取网页时的多线程和多进程技巧:
- 模拟登录:
a. 使用 requests 库发起登录请求。
b. 当网站需要验证码时,可以考虑使用 pytesseract 库自动识别验证码。
c. 将登录时获取的 cookies 保存下来,用于后续的爬取请求。
d. 使用 Session 来管理登录状态,可以避免每次请求都需要重新登录。
范例代码:
import requests
import json
登录地址
login_url = "http://pidancode.com/login"
构造登录请求参数
data = {
"username": "your_username",
"password": "your_password"
}
发送登录请求
session = requests.session()
response = session.post(login_url, data=data)
解析登录结果
result = json.loads(response.text)
if result['code'] == 200:
print("登录成功!")
# 保存 cookies
cookies = session.cookies.get_dict()
print(cookies)
else:
print("登录失败!")
- 多线程爬取:
a. 使用 threading.Thread 创建多个线程进行并发爬取。
b. 将请求任务加入队列,多个线程从队列中获取任务并执行。
c. 如果需要数据共享,可以使用 threading.Lock 进行同步。
范例代码:
import requests
import threading
import random
目标地址
url = "http://pidancode.com/api/posts"
请求头信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
"Cookie": "your_cookies"
}
请求任务队列
task_queue = []
线程数量
thread_num = 4
线程互斥锁
lock = threading.Lock()
创建请求任务队列
def create_task_queue():
for i in range(1, 51):
task_queue.append(i)
线程函数:获取任务并执行请求
def run():
while True:
lock.acquire() # 加锁
if len(task_queue) == 0:
lock.release() # 释放锁
break
else:
task = task_queue.pop()
lock.release() # 释放锁
# 发起请求 response = requests.get(url + "?page={}".format(task), headers=headers) print("线程【{}】请求第 {} 页,状态码:{}".format(threading.current_thread().name, task, response.status_code)) # 线程休眠,模拟请求间隔 time.sleep(random.randint(1, 5))
创建多个线程,开始执行请求任务
def spider():
thread_list = []
for i in range(thread_num):
t = threading.Thread(target=run, name="Thread-{}".format(i+1))
thread_list.append(t)
t.start()
for t in thread_list:
t.join()
启动主流程
if name == 'main':
create_task_queue()
spider()
- 多进程爬取:
a. 使用 multiprocessing.Process 创建多个进程进行并发爬取。
b. 将请求任务加入队列,多个进程从队列中获取任务并执行。
c. 如果需要数据共享,可以使用 multiprocessing.Lock 进行同步。
范例代码:
import requests
import multiprocessing
import random
目标地址
url = "http://pidancode.com/api/posts"
请求头信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
"Cookie": "your_cookies"
}
请求任务队列
task_queue = multiprocessing.Manager().list()
进程数量
process_num = 4
进程互斥锁
lock = multiprocessing.Lock()
创建请求任务队列
def create_task_queue():
for i in range(1, 51):
task_queue.append(i)
进程函数:获取任务并执行请求
def run():
while True:
lock.acquire() # 加锁
if len(task_queue) == 0:
lock.release() # 释放锁
break
else:
task = task_queue.pop()
lock.release() # 释放锁
# 发起请求 response = requests.get(url + "?page={}".format(task), headers=headers) print("进程【{}】请求第 {} 页,状态码:{}".format(multiprocessing.current_process().name, task, response.status_code)) # 进程休眠,模拟请求间隔 time.sleep(random.randint(1, 5))
创建多个进程,开始执行请求任务
def spider():
process_list = []
for i in range(process_num):
p = multiprocessing.Process(target=run, name="Process-{}".format(i+1))
process_list.append(p)
p.start()
for p in process_list:
p.join()
启动主流程
if name == 'main':
create_task_queue()
spider()
相关文章