Python多线程爬虫

2023-03-04 17:33:05 浏览数 (1)

Python多线程爬虫可以大大提高爬取速度,下面是一个使用多线程的简单爬虫示例:

代码语言:javascript复制
import threading
import requests
from queue import Queue

# 线程数量
THREAD_NUM = 5

# 请求超时时间
TIMEOUT = 5

# 要爬取的URL列表
URLS = [
    "https://www.example.com/page1",
    "https://www.example.com/page2",
    "https://www.example.com/page3",
    "https://www.example.com/page4",
    "https://www.example.com/page5"
]

# 存放结果的队列
result_queue = Queue()


def fetch_url(url):
    """爬取指定的URL"""
    try:
        response = requests.get(url, timeout=TIMEOUT)
        result_queue.put((url, response.status_code))
    except Exception as e:
        print("Failed to fetch %s: %s" % (url, str(e)))


def worker():
    """线程执行的任务"""
    while True:
        url = url_queue.get()
        fetch_url(url)
        url_queue.task_done()


# 创建线程
threads = []
for i in range(THREAD_NUM):
    t = threading.Thread(target=worker)
    t.daemon = True
    t.start()
    threads.append(t)

# 创建URL队列
url_queue = Queue()
for url in URLS:
    url_queue.put(url)

# 等待所有URL被处理
url_queue.join()

# 输出结果
while not result_queue.empty():
    url, status_code = result_queue.get()
    print("%s: %s" % (url, status_code))

在这个例子中,我们创建了5个线程,并使用一个URL队列来存储要爬取的URL。每个线程从队列中获取一个URL,并使用requests模块来爬取该URL。如果爬取成功,结果将被添加到结果队列中。最后,我们等待所有URL被处理,并输出每个URL的状态码。

值得注意的是,线程池的大小应该合理地匹配你的处理器核心数量。如果线程池太小,会导致处理器的核心不足,从而无法充分利用系统资源。如果线程池太大,会导致线程切换的开销变得昂贵,从而导致性能下降。

0 人点赞