我想在一个网站中批量下载网页。我的'urls.txt'文件中有5000000个网址链接。这大约是300M。如何使多线程链接这些网址并下载这些网页?或批量如何下载这些网页?
我的想法:
with open('urls.txt','r') as f:
for el in f:
##fetch these urls
还是扭曲?
它有一个很好的解决方案吗?
答案 0 :(得分:3)
如果这不是更大程序的一部分,那么nonoop使用一些现有工具来实现这一目标的想法是非常好的。如果一个shell循环调用wget解决了你的问题,那将比涉及更多自定义软件开发的任何东西容易得多。
但是,如果您需要将这些资源作为较大程序的一部分来获取,那么使用shell进行此操作可能并不理想。在这种情况下,我强烈建议使用Twisted,这样可以很容易地并行执行多个请求。
几年前,我写了一个如何做到这一点的例子。看看http://jcalderone.livejournal.com/24285.html。
答案 1 :(得分:1)
绝对一次下载5M网页并不是一个好主意,因为你会最大限度地利用很多东西,包括网络带宽和操作系统的文件描述符。我要分批100-1000。您可以使用urllib.urlopen来获取套接字,然后在几个线程上使用read()。您可以使用select.select。如果是这样,那么继续并立即下载所有1000并分配选择返回的每个文件句柄说10个工作线程。如果select不起作用,则将批量限制为100次下载,每次下载使用一个线程。当然,你不应该启动超过100个线程,因为你的操作系统可能会爆炸,或者至少有点慢。
答案 2 :(得分:1)
首先解析您的文件并将URL推入队列,然后生成5-10个工作线程以将URL从队列中拉出并下载。 Queue's是你的朋友。
答案 3 :(得分:0)
wget脚本可能最简单,但是如果你正在寻找一个python-twisted爬行解决方案,请查看scrapy