加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

SHELL网络爬虫实例剖析--转载

发布时间:2020-12-15 07:18:04 所属栏目:安全 来源:网络整理
导读:div class="CopyrightStatement lh22"原创作品,允许转载,转载时请务必以超链接形式标明文章?a href="http://nolinux.blog.51cto.com/4824967/1552472" target="_blank"原始出处?、作者信息和本声明。否则将追究法律责任。a href="http://nolinux.blog.51ct

<div class="CopyrightStatement lh22">原创作品,允许转载,转载时请务必以超链接形式标明文章?<a href="http://nolinux.blog.51cto.com/4824967/1552472" target="_blank">原始出处?、作者信息和本声明。否则将追究法律责任。<a href="http://nolinux.blog.51cto.com/4824967/1552472"&gt;http://nolinux.blog.51cto.com/4824967/1552472

? ? ? ?前天简单分享了用?的一些见解,今天特地把代码发出来与51博友分享,还是那句话,爱技术、爱开源、爱linux。

? ? ? ?针对脚本的注解和整体构思,我会放到脚本之后为大家详解。

#!/bin/-- ::<span style="color: #0000ff;">if [ <span style="color: #0000ff;"&gt;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;"&gt;echo</span> $URL1|cksum|<span style="color: #0000ff;"&gt;cut</span> -d<span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span> -<span style="color: #000000;"&gt;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;"&gt;echo</span> $X2|<span style="color: #0000ff;"&gt;sed</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;s# #%20#g</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;
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;"&gt;echo</span> $URL|cksum|<span style="color: #0000ff;"&gt;cut</span> -d<span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span> -<span style="color: #000000;"&gt;f1

</span><span style="color: #0000ff;"&gt;if</span> ! <span style="color: #0000ff;"&gt;ls</span> $OPT2 >&amp;/dev/<span style="color: #0000ff;"&gt;null</span>;<span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt;
  $CURL </span>-s $URL2|<span style="color: #0000ff;"&gt;awk</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BEGIN{RS="<"}{print $0}</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;awk</span> -F<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;></span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{print $2}</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;sed</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;1,6d</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;sed</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;$d</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;grep</span> -v <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;^$</span><span style="color: #800000;"&gt;'</span> ><span style="color: #000000;"&gt; $OPT2
</span><span style="color: #0000ff;"&gt;fi</span>
<span style="color: #0000ff;"&gt;while</span> read X3;<span style="color: #0000ff;"&gt;do</span><span style="color: #000000;"&gt;
  X3</span>=`<span style="color: #0000ff;"&gt;echo</span> $X3|<span style="color: #0000ff;"&gt;sed</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;s#[[:space:]]#%20#g</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`
  URL3</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;${URL2}&amp;PassModel=$X3</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
  X3_MD5</span>=`<span style="color: #0000ff;"&gt;echo</span> $URL3|cksum|<span style="color: #0000ff;"&gt;cut</span> -d<span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span> -<span style="color: #000000;"&gt;f1`
  </span><span style="color: #0000ff;"&gt;if</span> ! <span style="color: #0000ff;"&gt;ls</span> $OPT3 >&amp;/dev/<span style="color: #0000ff;"&gt;null</span>;<span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt;
    $CURL </span>-s $URL3|<span style="color: #0000ff;"&gt;sed</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;s#[[:space:]]##g</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;awk</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BEGIN{RS="<|=|>"}{print $0}</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;egrep</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;^[0-9]+$</span><span style="color: #800000;"&gt;'</span> ><span style="color: #000000;"&gt; $OPT3
  </span><span style="color: #0000ff;"&gt;fi</span>
  <span style="color: #0000ff;"&gt;while</span> read X4;<span style="color: #0000ff;"&gt;do</span><span style="color: #000000;"&gt;
    X4</span>=`<span style="color: #0000ff;"&gt;echo</span> $X4|<span style="color: #0000ff;"&gt;sed</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;s# #%20#g</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`
    URL4</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;${URL3}&amp;PassVehicleID=$X4</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
    X4_MD5</span>=`<span style="color: #0000ff;"&gt;echo</span> $URL4|cksum|<span style="color: #0000ff;"&gt;cut</span> -d<span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span> -<span style="color: #000000;"&gt;f1`
    </span><span style="color: #0000ff;"&gt;if</span> ! <span style="color: #0000ff;"&gt;ls</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;${OPT4}</span><span style="color: #800000;"&gt;"</span> >&amp;/dev/<span style="color: #0000ff;"&gt;null</span>;<span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt;
      $CURL </span>-s $URL4|<span style="color: #0000ff;"&gt;awk</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BEGIN{RS="<"}{print $0}</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;awk</span> -F<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;[>;]</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{print $2}</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;sed</span> -e <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;1,3d</span><span style="color: #800000;"&gt;'</span> -e <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;$d</span><span style="color: #800000;"&gt;'</span> -e <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;/^$/d</span><span style="color: #800000;"&gt;'</span> ><span style="color: #000000;"&gt; $OPT4
    </span><span style="color: #0000ff;"&gt;fi</span>
    <span style="color: #0000ff;"&gt;while</span> read X5;<span style="color: #0000ff;"&gt;do</span><span style="color: #000000;"&gt;
      X5</span>=`<span style="color: #0000ff;"&gt;echo</span> $X5|<span style="color: #0000ff;"&gt;sed</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;s# #%20#g</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`
      URL_LIST</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;${WEB_URL}index.cfm?fuseaction=store.sectionSearch&amp;YMMTyears=$X1&amp;YMMTmakenames=$X2&amp;YMMTmodelnames=$X3&amp;YMMTtrimnames=$X4&amp;YMMTsectionnames=$X5</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
      URL_LIST_MD5</span>=`<span style="color: #0000ff;"&gt;echo</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_LIST</span><span style="color: #800000;"&gt;"</span>|md5sum|<span style="color: #0000ff;"&gt;awk</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{print $1}</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`
      </span><span style="color: #0000ff;"&gt;if</span> ! <span style="color: #0000ff;"&gt;grep</span> -q $URL_LIST_MD5 <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5</span><span style="color: #800000;"&gt;"</span> ;<span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt;
        $CURL </span>-s <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_LIST</span><span style="color: #800000;"&gt;"</span> > <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
        NUM</span>=`<span style="color: #0000ff;"&gt;grep</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;View page</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;wc</span> -<span style="color: #000000;"&gt;l`
        NUM2</span>=$(($NUM/<span style="color: #800080;"&gt;2</span><span style="color: #000000;"&gt;))
        </span><span style="color: #0000ff;"&gt;echo</span> ><span style="color: #000000;"&gt; $OPT5
        </span><span style="color: #0000ff;"&gt;grep</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;a href="index.cfm?fuseaction=store.PartInfo&amp;PartNumbe</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;cut</span> -d<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;'</span> -f2 ><span style="color: #000000;"&gt; $OPT5
        </span><span style="color: #0000ff;"&gt;while</span> [ $NUM2 -ge <span style="color: #800080;"&gt;2</span> ];<span style="color: #0000ff;"&gt;do</span><span style="color: #000000;"&gt;
          URL_LIST</span>=`<span style="color: #0000ff;"&gt;grep</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;View page $NUM2</span><span style="color: #800000;"&gt;"</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5_DIR/$URL_LIST_MD5</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;awk</span> -F<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;[" ]</span><span style="color: #800000;"&gt;'</span>  <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{a[$9]=$9}END{for(i in a)print a[i]}</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`
          $CURL </span>-s <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_LIST</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;grep</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;a href="index.cfm?fuseaction=store.PartInfo&amp;PartNumbe</span><span style="color: #800000;"&gt;'</span>|<span style="color: #0000ff;"&gt;cut</span> -d<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;'</span> -f2 >><span style="color: #000000;"&gt; $OPT5
          NUM2</span>=$(($NUM2-<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;))
        </span><span style="color: #0000ff;"&gt;done</span>
        <span style="color: #0000ff;"&gt;echo</span> $URL_LIST_MD5 >> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5</span><span style="color: #800000;"&gt;"</span>
      <span style="color: #0000ff;"&gt;fi</span>
      <span style="color: #0000ff;"&gt;while</span> read X6;<span style="color: #0000ff;"&gt;do</span><span style="color: #000000;"&gt;
        URL_DETAIL</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;${WEB_URL}${X6}</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
        URL_DETAIL_MD</span>=`<span style="color: #0000ff;"&gt;echo</span> $URL_DETAIL|md5sum|<span style="color: #0000ff;"&gt;awk</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{print $1}</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`
        </span><span style="color: #0000ff;"&gt;if</span> ! <span style="color: #0000ff;"&gt;grep</span> -q $URL_DETAIL_MD <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5</span><span style="color: #800000;"&gt;"</span> >&amp;/dev/<span style="color: #0000ff;"&gt;null</span>;<span style="color: #0000ff;"&gt;then</span><span style="color: #000000;"&gt; # 该判断以商品列表详细页URL的md5值为基准,负责URL的重复项判定
          $CURL </span>-s <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_DETAIL</span><span style="color: #800000;"&gt;"</span> > <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
          LABEL</span>=`<span style="color: #0000ff;"&gt;grep</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;diagram-label</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;awk</span> -F<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;[<>]</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{print $5}</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`  # 商品标签
          GIF_URL</span>=`<span style="color: #0000ff;"&gt;grep</span> -B <span style="color: #800080;"&gt;10</span> partInfo <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;grep</span> -o <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;https.*gif</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;awk</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{a=$0}END{print a}</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;` # 产品对应的图片URL
          PRODUCT_ID</span>=`<span style="color: #0000ff;"&gt;grep</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;productID</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;awk</span> -F<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;[<>]</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{print $3}</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;` # 产品零件号码
          GIFILE</span>=${GIF_URL#*/}   # 去除了https:/后的图片URL信息,as:/a/<span style="color: #000000;"&gt;b.gif
          GIF_IMG</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;${ROOT_DIR}${GIFILE}</span><span style="color: #800000;"&gt;"</span> # 图片存到本地后的绝对路径,as:/dataimg/a/<span style="color: #000000;"&gt;b.gif
          U4</span>=`<span style="color: #0000ff;"&gt;grep</span> -B <span style="color: #800080;"&gt;10</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;<!-- start opentop --></span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$HTML_DIR/$URL_DETAIL_MD</span><span style="color: #800000;"&gt;"</span>|<span style="color: #0000ff;"&gt;grep</span> javascript|<span style="color: #0000ff;"&gt;awk</span> -F<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;[<>]</span><span style="color: #800000;"&gt;'</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;{print $3}</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;`
          </span>! <span style="color: #0000ff;"&gt;ls</span> $GIF_IMG >&amp; /dev/<span style="color: #0000ff;"&gt;null</span> &amp;&amp; <span style="color: #0000ff;"&gt;wget</span> -q -m -k -P <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$ROOT_DIR</span><span style="color: #800000;"&gt;"</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$GIF_URL</span><span style="color: #800000;"&gt;"</span>
          <span style="color: #0000ff;"&gt;echo</span> $URL_DETAIL_MD >> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$URL_MD5</span><span style="color: #800000;"&gt;"</span>
          <span style="color: #0000ff;"&gt;echo</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$(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;"&gt;"</span> >> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;$REPORT</span><span style="color: #800000;"&gt;"</span>
        <span style="color: #0000ff;"&gt;fi</span>
      <span style="color: #0000ff;"&gt;done</span> <<span style="color: #000000;"&gt; $OPT5  # 传入商品详细列表url信息,进行循环
    </span><span style="color: #0000ff;"&gt;done</span> <<span style="color: #000000;"&gt; $OPT4    # 传入产品部位分类信息,进行循环
  </span><span style="color: #0000ff;"&gt;done</span> <<span style="color: #000000;"&gt; $OPT3      # 传入装饰信息,进行循环
</span><span style="color: #0000ff;"&gt;done</span> <<span style="color: #000000;"&gt; $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<&-

OK!

? ? ? ?以上就是脚本的全部内容,整体脚本主要包含了组合目标URL和抓取目标URL两个大方向,围绕这两个大方向,主要是使用 curl 来做数据抓取,是用sed、awk、grep、cut来做兴趣数据的抽取。

? ? ? ?由于所要抓取的目标URL必须经过几个选项匹配,最终才能得到想要结果,因此我们在抓取目标URL之前添加了组合目标URL这一操作。整体这2个方向,我通过多层的while循环嵌套,来实现对参数的复用和一层一层的输入挖掘。

? ? ? ?为了优化速度以及控制速度,采用了 shell 的多进程和数据智能判重的方式。

? ? ? ?采用 shell 的多进程目的是为了增大操作数来缩短整体完成时间,提高抓取效率。

? ? ? ?shell 多进程主要依托 循环 + { } + & 来实现。如果多进程的进程数量有指定数值,那么我们可以使用for和while都而已,如果多进程的进程数量没有指定数值,那么我们最好使用while循环语句。通过将 { }& 嵌套在循环中实现将 {}内的命令群组放到后台去自动执行,然后完成本次 { }& 操作,使得循环可以进入下一次。

? ? ? ?以上并未实现该shell 在后台开启进程数的控制,假设你的需要执行一万次,如果你未控制速度,就可能会导致直接触发着一万次操作,同时放到后台执行,这样对系统是致命的伤害。另一方面,作为爬虫,你对目标网站的并发量也不能太大。出于这两方面的考虑,我们需要控制 shell 多进程每次放入后台执行的数量。针对这一行为,我们主要通过文件描述符来实现。通过新建一临时管道文件,然后为该文件打开一个文件描述符,并为其传递指定数量的空行(本文传递了10个空行),这样做的目的是为了实现对进程并发量的控制。接着,在下面循环中, { }&操作的前面使用read -u9(这里9为本文使用的文件描述符)来从9这个文件描述符中获取一行,如果获取到就能继续往下执行,如果获取不到就在这里等待。

? ? ? ?通过以上的2者结合,就能实现对 shell 多进程的智能管控。

? ? ? ?采用数据智能判重的目的在于,在脚本调试中发现速度的执行瓶颈在于curl的速度,即网络速度,因此一旦脚本异常中断后,恢复之后,又要重复进行curl操作,这样就极大增加了脚本执行时间。因此通过智能判重,完美实现了curl时间消耗过久的以及数据重复采集的问题。以下是数据只能判重的逻辑图:

wKioL1QUnWzyFIJZAAMW8rN7OK8488.jpg

? ? ? 针对脚本中变量的取值意义,我已经在上面的脚本中进行了详细的注释,这里不在复述。

? ? ? 其它细枝末节的一些使用方法和技巧,这里不再一一解释。对 shell 感兴趣的朋友可以和我一起交流,一起进步。

本文出自 “” 博客,请务必保留此出处

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读