wget:从包含id号和URL的列表中读取

时间:2013-09-14 22:15:08

标签: text wget directory

在.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脚本中的逻辑和代码:因此逐步解释假人是因此非常欢迎。

1 个答案:

答案 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变量中,并使用反引号运算符执行它以解释文本并将其作为命令运行