代码语言:javascript复制Python多线程爬虫可以大大提高爬取速度,下面是一个使用多线程的简单爬虫示例:
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的状态码。
值得注意的是,线程池的大小应该合理地匹配你的处理器核心数量。如果线程池太小,会导致处理器的核心不足,从而无法充分利用系统资源。如果线程池太大,会导致线程切换的开销变得昂贵,从而导致性能下降。