#!/bin/
-- ::<span style="color: #0000ff;">if [ <span style="color: #0000ff;">echo</span> $UID
!= <span style="color: #800080;">0 ];<span style="color: #0000ff;">then
<span style="color: #0000ff;">echo <span style="color: #800000;">'<span style="color: #800000;">Please use the root to execute the script!<span style="color: #800000;">'
<span style="color: #0000ff;">fi
<span style="color: #0000ff;">if [ ! -f /dataimg/years ];<span style="color: #0000ff;">then
<span style="color: #0000ff;">echo <span style="color: #800000;">'<span style="color: #800000;">Please give date file,the file path for/dataimg/years .<span style="color: #800000;">'
<span style="color: #0000ff;">fi
<span style="color: #0000ff;">if [ ! -d $TMP_DIR ];<span style="color: #0000ff;">then
<span style="color: #0000ff;">mkdir -<span style="color: #000000;">p $TMP_DIR
<span style="color: #0000ff;">fi
<span style="color: #0000ff;">if [ ! -d $URL_MD5_DIR ];<span style="color: #0000ff;">then
<span style="color: #0000ff;">mkdir -<span style="color: #000000;">p $URL_MD5_DIR
<span style="color: #0000ff;">fi
<span style="color: #0000ff;">if [ ! -d $HTML_DIR ];<span style="color: #0000ff;">then
<span style="color: #0000ff;">mkdir -<span style="color: #000000;">p $HTML_DIR
<span style="color: #0000ff;">fi<span style="color: #000000;">
ROOT_DIR=<span style="color: #800000;">"<span style="color: #800000;">/dataimg<span style="color: #800000;">"<span style="color: #000000;"> # 指定脚本运行根目录
TMP_DIR=<span style="color: #800000;">"<span style="color: #800000;">$ROOT_DIR/tmp<span style="color: #800000;">"<span style="color: #000000;"> # 生成商品详细页url之前的临时数据存放目录
URL_MD5_DIR=<span style="color: #800000;">"<span style="color: #800000;">$ROOT_DIR/url_md5<span style="color: #800000;">"<span style="color: #000000;"> # 记录商品详细页url的MD5值的目录
HTML_DIR=<span style="color: #800000;">"<span style="color: #800000;">$ROOT_DIR/html<span style="color: #800000;">"<span style="color: #000000;"> # 存放下载下来的商品详细页目录
URL_MD5=<span style="color: #800000;">"<span style="color: #800000;">$URL_MD5_DIR/md5.$year<span style="color: #800000;">"<span style="color: #000000;"> # 负责记录商品详细页url的md5值
WEB_URL=<span style="color: #800000;">"<span style="color: #800000;">https://www.redhat.sx/<span style="color: #800000;">"<span style="color: #000000;"> # 所爬网站的主页url
REPORT=<span style="color: #800000;">"<span style="color: #800000;">$ROOT_DIR/report<span style="color: #800000;">"<span style="color: #000000;"> # 负责记录采集的url综合信息
CURL=<span style="color: #800000;">"<span style="color: #800000;">curl -A 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/37.0.2062.102 Safari/537.36' --referer http://www.redhat.sx<span style="color: #800000;">"<span style="color: #000000;">
OPT0=<span style="color: #800000;">"<span style="color: #800000;">/dataimg/years<span style="color: #800000;">"<span style="color: #000000;"> # 年份信息
OPT1=<span style="color: #800000;">"<span style="color: #800000;">$TMP_DIR/${X1_MD5}<span style="color: #800000;">"<span style="color: #000000;"> # 品牌信息
OPT2=<span style="color: #800000;">"<span style="color: #800000;">$TMP_DIR/${X1MD5}${X2_MD5}<span style="color: #800000;">"<span style="color: #000000;"> # 车型信息
OPT3=<span style="color: #800000;">"<span style="color: #800000;">$TMP_DIR/${X1MD5}${X2MD5}${X3_MD5}<span style="color: #800000;">"<span style="color: #000000;"> # 装饰信息
OPT4=<span style="color: #800000;">"<span style="color: #800000;">$TMP_DIR/${X1MD5}${X2MD5}${X3MD5}${X4_MD5}<span style="color: #800000;">"<span style="color: #000000;"> # 部位分类信息
OPT5=<span style="color: #800000;">"<span style="color: #800000;">$TMP_DIR/${X1MD5}${X2MD5}${X3MD5}${X4MD5}${URL_LIST_MD5}<span style="color: #800000;">"<span style="color: #000000;"> # 商品详情页url信息
FIFO_FILE=<span style="color: #800000;">"<span style="color: #800000;">/tmp/$$.fifo<span style="color: #800000;">"
<span style="color: #0000ff;">mkfifo<span style="color: #000000;"> $FIFO_FILE
exec <span style="color: #800080;">9<><span style="color: #000000;">$FIFO_FILE
<span style="color: #0000ff;">rm -<span style="color: #000000;">f $FIFO_FILE
num=<span style="color: #800080;">10
<span style="color: #0000ff;">for ((i=<span style="color: #800080;">0;i<$num;i++));<span style="color: #0000ff;">do
<span style="color: #0000ff;">echo
<span style="color: #0000ff;">done >&<span style="color: #800080;">9
<span style="color: #0000ff;">while read X1;<span style="color: #0000ff;">do<span style="color: #000000;">
{
URL1=<span style="color: #800000;">"<span style="color: #800000;">${WEB_URL}/model/YMMTSelects.cfc?method=getMakes&PassYear=$X1<span style="color: #800000;">"<span style="color: #000000;">
X1_MD5=<span style="color: #0000ff;">echo</span> $URL1|cksum|<span style="color: #0000ff;">cut</span> -d<span style="color: #800000;">'</span> <span style="color: #800000;">'</span> -<span style="color: #000000;">f1
<span style="color: #0000ff;">if ! <span style="color: #0000ff;">ls $OPT1 >&/dev/<span style="color: #0000ff;">null;<span style="color: #0000ff;">then<span style="color: #000000;">
$CURL -s $URL1|<span style="color: #0000ff;">awk <span style="color: #800000;">'<span style="color: #800000;">BEGIN{RS="<"}{print $0}<span style="color: #800000;">'|<span style="color: #0000ff;">awk -F<span style="color: #800000;">'<span style="color: #800000;">><span style="color: #800000;">' <span style="color: #800000;">'<span style="color: #800000;">{print $2}<span style="color: #800000;">'|<span style="color: #0000ff;">sed <span style="color: #800000;">'<span style="color: #800000;">1,9d<span style="color: #800000;">'|<span style="color: #0000ff;">sed <span style="color: #800000;">'<span style="color: #800000;">$d<span style="color: #800000;">'|<span style="color: #0000ff;">grep -v <span style="color: #800000;">'<span style="color: #800000;">^$<span style="color: #800000;">' ><span style="color: #000000;"> $OPT1
<span style="color: #0000ff;">fi
<span style="color: #0000ff;">while read X2;<span style="color: #0000ff;">do<span style="color: #000000;">
X2=<span style="color: #0000ff;">echo</span> $X2|<span style="color: #0000ff;">sed</span> <span style="color: #800000;">'</span><span style="color: #800000;">s# #%20#g</span><span style="color: #800000;">'</span><span style="color: #000000;">
URL2=<span style="color: #800000;">"<span style="color: #800000;">${URL1}&PassMakeName=$X2<span style="color: #800000;">"<span style="color: #000000;">
X2_MD5=<span style="color: #0000ff;">echo</span> $URL|cksum|<span style="color: #0000ff;">cut</span> -d<span style="color: #800000;">'</span> <span style="color: #800000;">'</span> -<span style="color: #000000;">f1
</span><span style="color: #0000ff;">if</span> ! <span style="color: #0000ff;">ls</span> $OPT2 >&/dev/<span style="color: #0000ff;">null</span>;<span style="color: #0000ff;">then</span><span style="color: #000000;">
$CURL </span>-s $URL2|<span style="color: #0000ff;">awk</span> <span style="color: #800000;">'</span><span style="color: #800000;">BEGIN{RS="<"}{print $0}</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">awk</span> -F<span style="color: #800000;">'</span><span style="color: #800000;">></span><span style="color: #800000;">'</span> <span style="color: #800000;">'</span><span style="color: #800000;">{print $2}</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">sed</span> <span style="color: #800000;">'</span><span style="color: #800000;">1,6d</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">sed</span> <span style="color: #800000;">'</span><span style="color: #800000;">$d</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">grep</span> -v <span style="color: #800000;">'</span><span style="color: #800000;">^$</span><span style="color: #800000;">'</span> ><span style="color: #000000;"> $OPT2
</span><span style="color: #0000ff;">fi</span>
<span style="color: #0000ff;">while</span> read X3;<span style="color: #0000ff;">do</span><span style="color: #000000;">
X3</span>=`<span style="color: #0000ff;">echo</span> $X3|<span style="color: #0000ff;">sed</span> <span style="color: #800000;">'</span><span style="color: #800000;">s#[[:space:]]#%20#g</span><span style="color: #800000;">'</span><span style="color: #000000;">`
URL3</span>=<span style="color: #800000;">"</span><span style="color: #800000;">${URL2}&PassModel=$X3</span><span style="color: #800000;">"</span><span style="color: #000000;">
X3_MD5</span>=`<span style="color: #0000ff;">echo</span> $URL3|cksum|<span style="color: #0000ff;">cut</span> -d<span style="color: #800000;">'</span> <span style="color: #800000;">'</span> -<span style="color: #000000;">f1`
</span><span style="color: #0000ff;">if</span> ! <span style="color: #0000ff;">ls</span> $OPT3 >&/dev/<span style="color: #0000ff;">null</span>;<span style="color: #0000ff;">then</span><span style="color: #000000;">
$CURL </span>-s $URL3|<span style="color: #0000ff;">sed</span> <span style="color: #800000;">'</span><span style="color: #800000;">s#[[:space:]]##g</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">awk</span> <span style="color: #800000;">'</span><span style="color: #800000;">BEGIN{RS="<|=|>"}{print $0}</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">egrep</span> <span style="color: #800000;">'</span><span style="color: #800000;">^[0-9]+$</span><span style="color: #800000;">'</span> ><span style="color: #000000;"> $OPT3
</span><span style="color: #0000ff;">fi</span>
<span style="color: #0000ff;">while</span> read X4;<span style="color: #0000ff;">do</span><span style="color: #000000;">
X4</span>=`<span style="color: #0000ff;">echo</span> $X4|<span style="color: #0000ff;">sed</span> <span style="color: #800000;">'</span><span style="color: #800000;">s# #%20#g</span><span style="color: #800000;">'</span><span style="color: #000000;">`
URL4</span>=<span style="color: #800000;">"</span><span style="color: #800000;">${URL3}&PassVehicleID=$X4</span><span style="color: #800000;">"</span><span style="color: #000000;">
X4_MD5</span>=`<span style="color: #0000ff;">echo</span> $URL4|cksum|<span style="color: #0000ff;">cut</span> -d<span style="color: #800000;">'</span> <span style="color: #800000;">'</span> -<span style="color: #000000;">f1`
</span><span style="color: #0000ff;">if</span> ! <span style="color: #0000ff;">ls</span> <span style="color: #800000;">"</span><span style="color: #800000;">${OPT4}</span><span style="color: #800000;">"</span> >&/dev/<span style="color: #0000ff;">null</span>;<span style="color: #0000ff;">then</span><span style="color: #000000;">
$CURL </span>-s $URL4|<span style="color: #0000ff;">awk</span> <span style="color: #800000;">'</span><span style="color: #800000;">BEGIN{RS="<"}{print $0}</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">awk</span> -F<span style="color: #800000;">'</span><span style="color: #800000;">[>;]</span><span style="color: #800000;">'</span> <span style="color: #800000;">'</span><span style="color: #800000;">{print $2}</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">sed</span> -e <span style="color: #800000;">'</span><span style="color: #800000;">1,3d</span><span style="color: #800000;">'</span> -e <span style="color: #800000;">'</span><span style="color: #800000;">$d</span><span style="color: #800000;">'</span> -e <span style="color: #800000;">'</span><span style="color: #800000;">/^$/d</span><span style="color: #800000;">'</span> ><span style="color: #000000;"> $OPT4
</span><span style="color: #0000ff;">fi</span>
<span style="color: #0000ff;">while</span> read X5;<span style="color: #0000ff;">do</span><span style="color: #000000;">
X5</span>=`<span style="color: #0000ff;">echo</span> $X5|<span style="color: #0000ff;">sed</span> <span style="color: #800000;">'</span><span style="color: #800000;">s# #%20#g</span><span style="color: #800000;">'</span><span style="color: #000000;">`
URL_LIST</span>=<span style="color: #800000;">"</span><span style="color: #800000;">${WEB_URL}index.cfm?fuseaction=store.sectionSearch&YMMTyears=$X1&YMMTmakenames=$X2&YMMTmodelnames=$X3&YMMTtrimnames=$X4&YMMTsectionnames=$X5</span><span style="color: #800000;">"</span><span style="color: #000000;">
URL_LIST_MD5</span>=`<span style="color: #0000ff;">echo</span> <span style="color: #800000;">"</span><span style="color: #800000;">$URL_LIST</span><span style="color: #800000;">"</span>|md5sum|<span style="color: #0000ff;">awk</span> <span style="color: #800000;">'</span><span style="color: #800000;">{print $1}</span><span style="color: #800000;">'</span><span style="color: #000000;">`
</span><span style="color: #0000ff;">if</span> ! <span style="color: #0000ff;">grep</span> -q $URL_LIST_MD5 <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5</span><span style="color: #800000;">"</span> ;<span style="color: #0000ff;">then</span><span style="color: #000000;">
$CURL </span>-s <span style="color: #800000;">"</span><span style="color: #800000;">$URL_LIST</span><span style="color: #800000;">"</span> > <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;">"</span><span style="color: #000000;">
NUM</span>=`<span style="color: #0000ff;">grep</span> <span style="color: #800000;">'</span><span style="color: #800000;">View page</span><span style="color: #800000;">'</span> <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">wc</span> -<span style="color: #000000;">l`
NUM2</span>=$(($NUM/<span style="color: #800080;">2</span><span style="color: #000000;">))
</span><span style="color: #0000ff;">echo</span> ><span style="color: #000000;"> $OPT5
</span><span style="color: #0000ff;">grep</span> <span style="color: #800000;">'</span><span style="color: #800000;">a href="index.cfm?fuseaction=store.PartInfo&PartNumbe</span><span style="color: #800000;">'</span> <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">cut</span> -d<span style="color: #800000;">'</span><span style="color: #800000;">"</span><span style="color: #800000;">'</span> -f2 ><span style="color: #000000;"> $OPT5
</span><span style="color: #0000ff;">while</span> [ $NUM2 -ge <span style="color: #800080;">2</span> ];<span style="color: #0000ff;">do</span><span style="color: #000000;">
URL_LIST</span>=`<span style="color: #0000ff;">grep</span> <span style="color: #800000;">"</span><span style="color: #800000;">View page $NUM2</span><span style="color: #800000;">"</span> <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">awk</span> -F<span style="color: #800000;">'</span><span style="color: #800000;">[" ]</span><span style="color: #800000;">'</span> <span style="color: #800000;">'</span><span style="color: #800000;">{a[$9]=$9}END{for(i in a)print a[i]}</span><span style="color: #800000;">'</span><span style="color: #000000;">`
$CURL </span>-s <span style="color: #800000;">"</span><span style="color: #800000;">$URL_LIST</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">grep</span> <span style="color: #800000;">'</span><span style="color: #800000;">a href="index.cfm?fuseaction=store.PartInfo&PartNumbe</span><span style="color: #800000;">'</span>|<span style="color: #0000ff;">cut</span> -d<span style="color: #800000;">'</span><span style="color: #800000;">"</span><span style="color: #800000;">'</span> -f2 >><span style="color: #000000;"> $OPT5
NUM2</span>=$(($NUM2-<span style="color: #800080;">1</span><span style="color: #000000;">))
</span><span style="color: #0000ff;">done</span>
<span style="color: #0000ff;">echo</span> $URL_LIST_MD5 >> <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">fi</span>
<span style="color: #0000ff;">while</span> read X6;<span style="color: #0000ff;">do</span><span style="color: #000000;">
URL_DETAIL</span>=<span style="color: #800000;">"</span><span style="color: #800000;">${WEB_URL}${X6}</span><span style="color: #800000;">"</span><span style="color: #000000;">
URL_DETAIL_MD</span>=`<span style="color: #0000ff;">echo</span> $URL_DETAIL|md5sum|<span style="color: #0000ff;">awk</span> <span style="color: #800000;">'</span><span style="color: #800000;">{print $1}</span><span style="color: #800000;">'</span><span style="color: #000000;">`
</span><span style="color: #0000ff;">if</span> ! <span style="color: #0000ff;">grep</span> -q $URL_DETAIL_MD <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5</span><span style="color: #800000;">"</span> >&/dev/<span style="color: #0000ff;">null</span>;<span style="color: #0000ff;">then</span><span style="color: #000000;"> # 该判断以商品列表详细页URL的md5值为基准,负责URL的重复项判定
$CURL </span>-s <span style="color: #800000;">"</span><span style="color: #800000;">$URL_DETAIL</span><span style="color: #800000;">"</span> > <span style="color: #800000;">"</span><span style="color: #800000;">$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;">"</span><span style="color: #000000;">
LABEL</span>=`<span style="color: #0000ff;">grep</span> <span style="color: #800000;">'</span><span style="color: #800000;">diagram-label</span><span style="color: #800000;">'</span> <span style="color: #800000;">"</span><span style="color: #800000;">$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">awk</span> -F<span style="color: #800000;">'</span><span style="color: #800000;">[<>]</span><span style="color: #800000;">'</span> <span style="color: #800000;">'</span><span style="color: #800000;">{print $5}</span><span style="color: #800000;">'</span><span style="color: #000000;">` # 商品标签
GIF_URL</span>=`<span style="color: #0000ff;">grep</span> -B <span style="color: #800080;">10</span> partInfo <span style="color: #800000;">"</span><span style="color: #800000;">$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">grep</span> -o <span style="color: #800000;">"</span><span style="color: #800000;">https.*gif</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">awk</span> <span style="color: #800000;">'</span><span style="color: #800000;">{a=$0}END{print a}</span><span style="color: #800000;">'</span><span style="color: #000000;">` # 产品对应的图片URL
PRODUCT_ID</span>=`<span style="color: #0000ff;">grep</span> <span style="color: #800000;">'</span><span style="color: #800000;">productID</span><span style="color: #800000;">'</span> <span style="color: #800000;">"</span><span style="color: #800000;">$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">awk</span> -F<span style="color: #800000;">'</span><span style="color: #800000;">[<>]</span><span style="color: #800000;">'</span> <span style="color: #800000;">'</span><span style="color: #800000;">{print $3}</span><span style="color: #800000;">'</span><span style="color: #000000;">` # 产品零件号码
GIFILE</span>=${GIF_URL#*/} # 去除了https:/后的图片URL信息,as:/a/<span style="color: #000000;">b.gif
GIF_IMG</span>=<span style="color: #800000;">"</span><span style="color: #800000;">${ROOT_DIR}${GIFILE}</span><span style="color: #800000;">"</span> # 图片存到本地后的绝对路径,as:/dataimg/a/<span style="color: #000000;">b.gif
U4</span>=`<span style="color: #0000ff;">grep</span> -B <span style="color: #800080;">10</span> <span style="color: #800000;">'</span><span style="color: #800000;"><!-- start opentop --></span><span style="color: #800000;">'</span> <span style="color: #800000;">"</span><span style="color: #800000;">$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;">"</span>|<span style="color: #0000ff;">grep</span> javascript|<span style="color: #0000ff;">awk</span> -F<span style="color: #800000;">'</span><span style="color: #800000;">[<>]</span><span style="color: #800000;">'</span> <span style="color: #800000;">'</span><span style="color: #800000;">{print $3}</span><span style="color: #800000;">'</span><span style="color: #000000;">`
</span>! <span style="color: #0000ff;">ls</span> $GIF_IMG >& /dev/<span style="color: #0000ff;">null</span> && <span style="color: #0000ff;">wget</span> -q -m -k -P <span style="color: #800000;">"</span><span style="color: #800000;">$ROOT_DIR</span><span style="color: #800000;">"</span> <span style="color: #800000;">"</span><span style="color: #800000;">$GIF_URL</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">echo</span> $URL_DETAIL_MD >> <span style="color: #800000;">"</span><span style="color: #800000;">$URL_MD5</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800000;">"</span><span style="color: #800000;">$(date +%m%d%T)+++$X1+++$X2+++$X3+++$U4+++$X5+++$URL_DETAIL+++$URL_DETAIL_MD+++$LABEL+++$PRODUCT_ID+++$GIF_IMG+++$URL_LIST</span><span style="color: #800000;">"</span> >> <span style="color: #800000;">"</span><span style="color: #800000;">$REPORT</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">fi</span>
<span style="color: #0000ff;">done</span> <<span style="color: #000000;"> $OPT5 # 传入商品详细列表url信息,进行循环
</span><span style="color: #0000ff;">done</span> <<span style="color: #000000;"> $OPT4 # 传入产品部位分类信息,进行循环
</span><span style="color: #0000ff;">done</span> <<span style="color: #000000;"> $OPT3 # 传入装饰信息,进行循环
</span><span style="color: #0000ff;">done</span> <<span style="color: #000000;"> $OPT2 # 传入车型信息,进行循环
<span style="color: #0000ff;">done <<span style="color: #000000;"> $OPT1 # 传入品牌信息,进行循环
<span style="color: #0000ff;">echo >&<span style="color: #800080;">9<span style="color: #000000;">
}&
<span style="color: #0000ff;">done <<span style="color: #000000;"> $OPT0 # 传入年份信息,进行循环
<span style="color: #0000ff;">wait<span style="color: #000000;">
exec <span style="color: #800080;">9<&-
? ? ? ?以上就是脚本的全部内容,整体脚本主要包含了组合目标URL和抓取目标URL两个大方向,围绕这两个大方向,主要是使用 curl 来做数据抓取,是用sed、awk、grep、cut来做兴趣数据的抽取。
? ? ? ?由于所要抓取的目标URL必须经过几个选项匹配,最终才能得到想要结果,因此我们在抓取目标URL之前添加了组合目标URL这一操作。整体这2个方向,我通过多层的while循环嵌套,来实现对参数的复用和一层一层的输入挖掘。
? ? ? ?shell 多进程主要依托 循环 + { } + & 来实现。如果多进程的进程数量有指定数值,那么我们可以使用for和while都而已,如果多进程的进程数量没有指定数值,那么我们最好使用while循环语句。通过将 { }& 嵌套在循环中实现将 {}内的命令群组放到后台去自动执行,然后完成本次 { }& 操作,使得循环可以进入下一次。
? ? ? ?以上并未实现该shell 在后台开启进程数的控制,假设你的需要执行一万次,如果你未控制速度,就可能会导致直接触发着一万次操作,同时放到后台执行,这样对系统是致命的伤害。另一方面,作为爬虫,你对目标网站的并发量也不能太大。出于这两方面的考虑,我们需要控制 shell 多进程每次放入后台执行的数量。针对这一行为,我们主要通过文件描述符来实现。通过新建一临时管道文件,然后为该文件打开一个文件描述符,并为其传递指定数量的空行(本文传递了10个空行),这样做的目的是为了实现对进程并发量的控制。接着,在下面循环中, { }&操作的前面使用read -u9(这里9为本文使用的文件描述符)来从9这个文件描述符中获取一行,如果获取到就能继续往下执行,如果获取不到就在这里等待。
? ? ? ?采用数据智能判重的目的在于,在脚本调试中发现速度的执行瓶颈在于curl的速度,即网络速度,因此一旦脚本异常中断后,恢复之后,又要重复进行curl操作,这样就极大增加了脚本执行时间。因此通过智能判重,完美实现了curl时间消耗过久的以及数据重复采集的问题。以下是数据只能判重的逻辑图: