通过从文件中读取URL列表来保存网页

时间:2014-10-15 04:00:18

标签: python urllib2

我只能想到解决这个问题的一种方法,但它有一些列出的限制。有人可以提出另一种解决这个问题的方法吗?

我们提供了一个包含999999个网址的文本文件。 我们必须写一个python程序来读取这个文件&将所有网页保存在名为“saved_pa​​ge”的文件夹中。

我试图解决这个问题,

import os
import urllib
save_path='C:/test/home_page/'
Name = os.path.join(save_path, "test.txt")
file = open('soop.txt', 'r')
'''all the urls are in the soop.txt file '''
for line in file:
    data = urllib.urlopen(line)
    for line in data:
        f=open(Name)
        lines=f.readlines()
        f.close()
        lines.append(line)
        f=open(Name,"w")
        f.writelines(lines)
        f.close()
file.close()

以下是此代码的一些限制,

1)。如果网络中断,此代码将重新启动。

2)。如果遇到错误的网址 - 即服务器没有响应 - 此代码将被卡住。

3)。我正在按顺序下载 - 对于大量的URL,这将非常慢。

那么有人可以建议解决这些问题的解决方案吗?

1 个答案:

答案 0 :(得分:1)

一些评论:

点1和2可以通过重启点方法轻松修复。对于 in script 重新启动,只需执行循环,直到包含读取部分的行for line in file下的所有正常或最大尝试次数,并且只写入你可以成功下载文件。您仍然需要决定如何处理以防无法下载文件:记录错误并继续下一个文件或中止整个作业。

如果您希望以后能够重新启动失败的作业,则应该在某处(state.txt文件)保留成功下载的文件列表。在每个文件被写入之后你写(和 flush )。但要真正的boolet证明,你应该在获取文件后写一个元素,并在成功写入后写一个元素。这样,在重新启动时,您可以通过简单地测试状态文件及其内容的存在来知道输出文件可能包含部分写入的文件(停电,中断......)。

第3点会更棘手。要允许并行下载,您必须使用线程或asyncio。但是您还必须同步所有这些以确保文件以正确的顺序写入输出文件中。如果你能负担得起将所有内容保存在内存中,一种简单的方法是首先使用parralelized方法下载所有内容(由J.F.Sebastian提供的链接可以提供帮助),然后按顺序编写。