Python 实现模拟登录和爬取网页时的多线程和多进程技巧

2023-04-19 00:00:00 多线程 进程 网页时

Python实现模拟登录和爬取网页时的多线程和多进程技巧:

  1. 模拟登录:

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("登录失败!")

  1. 多线程爬取:

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

  1. 多进程爬取:

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

相关文章