Python 多线程爬虫开发


爬虫项目中,网络请求通常是耗时操作,使用多线程可以提升抓取效率。Python 标准库提供了 threading 模块,配合队列等工具,可以简单实现多线程爬虫。

一、多线程基础

  • threading.Thread 创建线程对象。
  • 使用 threading.Lock 保护共享资源。
  • queue.Queue 用于线程间安全的任务调度。

二、示例代码框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import threading
import queue
import requests

# 任务队列
url_queue = queue.Queue()

# 线程工作函数
def worker():
while True:
url = url_queue.get()
if url is None: # 退出信号
break
try:
response = requests.get(url)
print(f"抓取 {url} 状态码: {response.status_code}")
# 处理数据...
except Exception as e:
print(f"请求错误: {e}")
finally:
url_queue.task_done()

# 添加任务
urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3']
for u in urls:
url_queue.put(u)

# 启动线程
threads = []
num_threads = 5
for _ in range(num_threads):
t = threading.Thread(target=worker)
t.start()
threads.append(t)

# 等待所有任务完成
url_queue.join()

# 发送退出信号
for _ in range(num_threads):
url_queue.put(None)
for t in threads:
t.join()

三、要点说明

  • 任务调度:使用 queue.Queue 保证线程安全,避免资源竞争。
  • 线程数选择:根据目标网站和本地资源合理设置线程数,避免过度请求导致被封。
  • 异常处理:网络请求易失败,要捕获异常保证线程持续工作。
  • 数据存储:抓取的数据可以写入数据库或文件,建议用线程安全方式操作。

四、进一步优化

  • 使用 concurrent.futures.ThreadPoolExecutor 简化线程管理。
  • 使用异步库(如 aiohttp)实现异步爬虫。
  • 代理池、请求头伪装、限速等策略提高爬虫稳定性和隐蔽性。

以上就是我的小小分享啦,欢迎各路大佬来指点迷津,顺便带我飞!咱们一起修仙升级打怪,交流交流,轻松搞起来!