wget -P ... -r -l ...
並列処理を使用して Python で再帰的にサイトを取得します (要旨はこちら):
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
また、コマンド ラインまたはシェル スクリプトを使用する場合は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
、URL が にあるようにします$2
。
print
の呼び出しを作成する AWK コマンドを追加しwget
ます。
- パイプ演算子を追加して
|
、出力を次のコマンドに送信します
次にwget
呼び出しを行います。
while read line ; do `$line` ; done
- 前のコマンド出力を 1 行ずつループして
$line
変数に格納し、バックティック演算子を使用して実行し、テキストを解釈してコマンドとして実行します。