在.txt文件中,我有500行包含身份证号码和网站主页网址,方式如下
id_345 http://www.example1.com
id_367 http://www.example2.org
...
id_10452 http://www.example3.net
使用wget和-i选项,我试图以递归方式下载这些网站的一部分,但我希望以与id号链接的方式存储文件(将文件存储在名为的目录中) id号,或 - 最好的选择,但我认为最难实现 - 将html内容存储在一个名为id号的txt文件中。 Unfortunataly,选项-i无法读取我正在使用的文件。 如何将网站内容与其连接的ID相关联?
谢谢
P.s。:我想这样做我必须从wget'走出',并通过脚本调用它。如果是这样,请考虑到我是这个领域的新手(只是一些python经验),特别是我还不能理解bash脚本中的逻辑和代码:因此逐步解释假人是因此非常欢迎。
答案 0 :(得分:1)
使用Python中的wget -P ... -r -l ...
递归获取网站,并行处理(gist is here):
import multiprocessing, subprocess, re
def getSiteRecursive(id, url, depth=2):
cmd = "wget -P " + id + " -r -l " + str(depth) + " " + url
subprocess.call(cmd, shell=True)
input_file = "site_list.txt"
jobs = []
max_jobs = multiprocessing.cpu_count() * 2 + 1
with open(input_file) as f:
for line in f:
id_url = re.compile("\s+").split(line)
if len(id_url) >= 2:
try:
print "Grabbing " + id_url[1] + " into " + id_url[0] + " recursively..."
if len(jobs) >= max_jobs:
jobs[0].join()
del jobs[0]
p = multiprocessing.Process(target=getSiteRecursive,args=(id_url[0],id_url[1],2,))
jobs.append(p)
p.start()
except Exception, e:
print "Error for " + id_url[1] + ": " + str(e)
pass
for j in jobs:
j.join()
使用Python将单页导入命名文件:
import urllib2, re
input_file = "site_list.txt"
#open the site list file
with open(input_file) as f:
# loop through lines
for line in f:
# split out the id and url
id_url = re.compile("\s+").split(line)
print "Grabbing " + id_url[1] + " into " + id_url[0] + ".html..."
try:
# try to get the web page
u = urllib2.urlopen(id_url[1])
# save the GET response data to the id file (appended with "html")
localFile = open(id_url[0]+".html", 'wb+')
localFile.write(u.read())
localFile.close()
print "got " + id_url[0] + "!"
except:
print "Could not get " + id_url[0] + "!"
pass
示例site_list.txt:
id_345 http://www.stackoverflow.com
id_367 http://stats.stackexchange.com
输出:
Grabbing http://www.stackoverflow.com into id_345.html...
got id_345!
Grabbing http://stats.stackexchange.com into id_367.html...
got id_367!
目录列表:
get_urls.py
id_345.html
id_367.html
site_list.txt
如果您更喜欢命令行或shell脚本,,您可以使用awk
读取每行,并在空格处使用默认拆分,将其传递给循环并使用反引号执行:
awk '{print "wget -O " $1 ".html " $2}' site_list.txt | while read line ; do `$line` ; done
awk '{print "wget -O " $1 ".html " $2}' site_list.txt |
awk
工具读取site_list.txt文件的每一行
将空格(默认)中的每一行拆分为变量($1
,$2
,$3
,
等),以便您的ID位于$1
,您的网址位于$2
。print
AWK命令以构建对wget
的调用。|
以将输出发送到下一个命令接下来我们进行wget
调用:
while read line ; do `$line` ; done
$line
变量中,并使用反引号运算符执行它以解释文本并将其作为命令运行