我有一个简单的Python网络爬虫.它使用SQLite来存储其输出并保留队列.我想让爬虫程序多线程,以便它可以一次抓取几个页面.我想我会创建一个线程并立即运行该类的几个实例,因此它们都同时运行.但问题是,我应该一次运行多少人?我应该坚持两个吗?我可以走高吗?什么线程的合理限制是什么?请记住,每个线程都会转到网页,下载html,运行一些正则表达式搜索,将它找到的信息存储在SQLite数据库中,然后从队列中弹出下一个URL.
您可能会发现您的应用程序带宽有限,而不是CPU或I/O限制.
因此,添加任意多个,直到性能开始降低.
您可能会遇到其他限制,具体取决于您的网络设置.就像你在ADSL路由器后面一样,并发NAT会话的数量会受到限制,这可能会影响一次发出太多的HTTP请求.制作太多,您的提供商可能会将您视为感染病毒等.
还有一个问题是,您正在抓取的服务器可以处理多少请求,以及您想要加载多少负载.
我只用了一个线程就写了一个爬虫.我花了大约一天的时间来处理我想要的所有信息,大约每两秒一页.我可以更快地完成它,但我认为这对服务器来说不那么重要了.
所以真的没有硬性和快速的答案.假设一个1-5兆位的连接我会说你可以很容易地拥有多达20-30个线程而没有任何问题.
如果您已经有一种简单的方法来提供任意长的URL列表,我会使用一个线程并使用延迟信号量或任务合作者进行扭曲.
您几乎不可能制作比基于扭曲的爬虫更快或更小的多线程爬虫.