2

我有一个工作 Python 脚本,它检查 6,300 个左右的站点,我们必须通过向每个站点发送 HTTP 请求并测量响应来确保它们正常运行。目前脚本需要大约 40 分钟才能完全运行,我可能对加速脚本的其他一些方法感兴趣,两个想法是线程或多个运行实例。

这是现在的执行顺序:

  1. MySQL 查询以获取要扫描的所有活动域(6,300 个给予或接受)
  2. 遍历每个域并使用 urllib 向每个域发送 HTTP 请求
  3. 如果该站点未返回“200”,则记录结果
  4. 重复直到完成

这似乎可以通过线程显着加快,但我不太确定该流程的外观,因为我不熟悉线程。

如果有人可以提供示例高级流程和任何其他使用线程的指针或提供有关如何改进脚本的任何其他见解,将不胜感激。

4

4 回答 4

2

你可以看看scrapy框架。它是为网页抓取而设计的。它的异步构建在扭曲且非常快的基础上。

在您的情况下,您可以获取要抓取的域列表,并且只查看它是否会返回 200 而不会实际抓取任何内容。它应该快得多。

这是链接: http ://scrapy.org/

于 2013-01-28T14:47:03.567 回答
2

流程看起来像这样:

  1. 创建域队列
  2. 创建结果队列
  3. MySQL 查询以获取要扫描的所有活动域
  4. 将域放入域队列
  5. 产生一个工作线程池
  6. 运行线程
  7. 每个worker会从域Queue中获取一个域,发送请求并将结果放入result Queue
  8. 等待线程完成
  9. 从结果队列中获取所有内容并记录下来

您可能希望调整线程数,从而调整池,而不仅仅是每个域的 6300 个线程。

于 2013-01-28T14:48:38.043 回答
1

线程绝对是您需要的。它将消除算法的序列化性质,并且由于它主要受 IO 限制,因此您将通过并行发送 HTTP 请求获得很多收益。

您的流程将变为:

  1. MySQL 查询以获取要扫描的所有活动域(6,300 个给予或接受)
  2. 遍历每个域并创建一个线程,用于urllib向每个域发送 HTTP 请求
  3. 在线程中记录结果

您可以通过创建n带有队列的工作线程来改进此算法,并将域添加到队列中,而不是为每个域创建一个线程。由于您不熟悉线程,因此我只是想让您的事情变得更容易一些。

于 2013-01-28T14:45:54.340 回答
-1

我猜你应该使用线程,调查启动的最佳进程数,以避免杀死你的客户。Python手册提供了很好的例子顺便看看这里同时下载多个页面?

urllib ,线程,多处理

于 2013-01-28T14:49:35.760 回答