如何使用gevent和线程对数千个URL进行爬网和处理(cpu密集型)



我一直在玩龙卷风、扭曲、gevent、grequests,以便在获取50k URL的过程中获得最佳性能。

我想要创建的流程:

  • 将所有url解析为一组(避免重复)
  • 对于每个url:检查白名单redisdb中是否存在url(包含数百万个url)
  • 使用gevent/其他异步库下载url
  • 将提取的内容插入队列
  • 并行:使用线程侦听队列
  • 使用线程处理(密集正则表达式)队列项目
  • 将输出保存到MySQL数据库
  • 对于每个url,更新白名单redisdb

我将每天处理数百万个url,我开始实现它,但遇到了一些问题;

首先,用我从异步爬网程序获得的结果填充队列会消耗大量内存——我需要解决这个问题,什么是好的做法?其次,我很难同步线程和gevent爬网程序,如何异步下载和处理,同时用结果填充队列?

或者,我如何将异步爬网程序与处理异步爬网程序响应的线程代码同步?

谢谢!

gevent,twisted,asyncio应该可以处理50k个url。

为了避免消耗太多内存,并同步下载和处理url的进程,您可以在相应的队列上设置最大大小:如果下载发生得太快;当它达到其最大容量时,它将在CCD_。

绿色线程对于并行regex处理是无用的。如果在regex处理过程中没有发布GIL,那么使用真实操作系统线程的普通Python线程在这里将毫无用处。re不释放GIL。regex模块在某些情况下可以释放GIL。

如果您使用re模块;您可能希望创建一个进程池,而不是线程,其中的进程数~主机上的cpu数。

注意如何使用MySQL、Redis(对于某些使用场景,您可能需要一个绿色驱动程序)。

最新更新