背景:在流量某网站的过程中,发现该网站的图片标识存在一定的规律,想要尝试该网站的保存的所有图片,经过验证理论上可行,使用了shell并发编程的技巧,这里给出实现的相关代码当作一个记录,欢迎参考交流:
#!/bin/bash
RECORD_FILE='id_record.log'
begid=1
max_id=99999
ignore_kb=20
dw_dir="download_dir"
mkdir $dw_dir 2>/dev/null
DEBUG() {
echo $*
return
}
down_file() {
tmp_id=$1
file_name="$dw_dir/$tmp_id.jpg"
wget http://www.example.url?id=$tmp_id -O $file_name -q
wait
# 忽略size太小的图片
file_sz=$(du -k $file_name |awk '{print $1}')
if [ $file_sz -lt $ignore_kb ]
then
#DEBUG "file $file_name lt than 20k, skip"
rm -f $file_name
else
#DEBUG "record $tmp_id"
echo " $tmp_id " >> $RECORD_FILE
fi
exit
}
while [ $begid -le $max_id ]
do
record_ids=$(cat $RECORD_FILE 2>/dev/null)
temp_out=$(echo $record_ids | grep -w $begid)
if [ "$temp_out" != "" ]
then
DEBUG "$begid has download"
begid=$((begid + 1))
continue
fi
if [ -e $dw_dir/$begid.jpg ]
then
DEBUG "$begid exist"
begid=$((begid + 1))
echo " $begid " >> $RECORD_FILE
continue
fi
DEBUG "dw $begid"
# 拉起一个子进程并发下载
(down_file "$begid") &
sleep 0.05
begid=$((begid + 1))
# 控制并发数
worker_count=$(ps aux | grep wget | wc -l)
if [ $worker_count -gt 10 ]
then
sleep 1
fi
done
echo "`date` download done"