在Python中,爬虫程序如果不按顺序返回结果,通常是因为多线程环境下线程的执行顺序和网络请求的响应时间不一致所导致的。为了解决这个问题,可以使用队列(Queue)来保存爬取结果,确保结果按照爬取的顺序进行存储。
import threadingimport queueimport requestsfrom urllib.parse import urljoindef 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`是线程安全的,可以避免多线程环境下的竞态条件。
