在Python中,爬虫程序如果不按顺序返回结果,通常是因为多线程环境下线程的执行顺序和网络请求的响应时间不一致所导致的。为了解决这个问题,可以使用队列(Queue)来保存爬取结果,确保结果按照爬取的顺序进行存储。
import threading
import queue
import requests
from urllib.parse import urljoin
def fetch_url(url_queue, result_queue):
while not url_queue.empty():
try:
url = url_queue.get_nowait()
response = requests.get(url)
result_queue.put((url, response.text))
except Exception as e:
print(f"Error fetching {url}: {e}")
def main():
urls = ['http://example.com', 'http://example.org', 'http://example.net'] 待爬取的URL列表
result_queue = queue.Queue() 结果队列
threads = [] 创建并启动线程
for url in urls:
t = threading.Thread(target=fetch_url, args=(url_queue, result_queue))
t.start()
threads.append(t)
等待所有线程执行完毕
for t in threads:
t.join()
处理队列中的结果
while not result_queue.empty():
url, data = result_queue.get() 处理数据...
根据需要处理数据,例如保存到文件或数据库
print(f"Processed {url}: {len(data)} bytes")
if __name__ == "__main__":
main()
在这个示例中,我们使用了`queue.Queue`来在线程之间传递结果,确保结果按照爬取的顺序进行存储。`Queue`是线程安全的,可以避免多线程环境下的竞态条件。