shell爬虫简易脚本(线程数可控)

1.介绍

以机电之家网站为例
经过初步分析,机电之家的数据量较大,并且数据组织规则较为统一,适合以代码方式进行全量爬取。 

企业列表URL统一为http://www.jdzj.com/yp_vlist_1_1.html 的模式,变化的仅为其中的数字,而且企业的黄页均为 :http://xxxx.jdzj.com/的模式。 

因此,我们的爬取思路采用遍历企业列表,正则匹配获取企业黄页地址,然后逐次从黄页上获取企业相关信息。 

2.批量获取黄页地址:

#!/bin/bash
#trap,捕捉到信号,2表示ctrl+c
trap "exec 6>&-;exec 6<&-;exit 0" 2
#创建<有名管道>
mkfifo testfifo
exec 6<>testfifo
rm -rf testfifo
#设置线程数
Thread=128  #指定线程数
for ((n=0;n<$Thread;n++))
do
        echo >&6
done

#设置计时器,记录开始时的时间戳seconds_1=$(date +%s)
#开始获取黄页地址列表
for i in {1..77};
do

   j=` curl -i -s  http://www.jdzj.com/yp_vlist_{$i}_1.html |grep lblpage |awk ‘{match($0,/<b>[0-9]*<\/b>/);print substr($0,RSTART+3,RLENGTH-7)}‘`

   for n in `seq 1 $j`;               #批量获取子域名并筛选去重
   do

   read -u6
   echo "threads:   `ps -ef |grep $0|grep -v grep|grep -v vim|wc -l`" #输出当前线程数
   echo "Completed: `cat url.txt|wc -l`"                   #输出当前获取的黄页地址数
   echo "######################"
   {
         curl -i -s http://www.jdzj.com/yp_vlist_{$i}_{$n}.html |awk ‘{match($0,/http:\/\/[a-zA-Z0-9]+.jdzj.com/);print substr($0,RSTART,RLENGTH)}‘| sort | uniq|sed -e ‘/^$/d‘ >> url.txt
         echo >& 6
    }&
    done

done 

wait

#设置计时器,记录结束时的时间戳
seconds_2=$(date +%s) 

echo "TIME: `expr $seconds_2 - $seconds_1`" 

exec 6>&- 

exec 6<&-
exit 0

3.依次获取子域名并提取公司信息

#!/bin/bash

trap "exec 6>&-;exec 6<&-;exit 0" 2

mkfifo testfifo
exec 6<>testfifo
rm -rf testfifo

Thread=32
for ((n=0;n<$Thread;n++))
do
echo >&6
done

seconds_1=$(date +%s)
touch dd.txt

v1=`cat url.txt|wc -l`
for n in `seq 1 $v1`
do
  read -u6

  echo "threads: `ps -ef |grep $0|grep -v grep|grep -v vim|wc -l`"
  echo "Completed: `cat dd.txt|grep 手机|wc -l`"
  echo "######################"

  {
    sed -n ${n}p url.txt |xargs curl -i -s|egrep -A6 lblhtc | sed ‘s/[a-z{.<>"=_:\/}]/ /g‘ >t_$n.txt
    l=`cat t_$n.txt|wc -l`

    if [[ $l -eq 7 ]]
    then
      i=1
      while read line
      do
        j=`expr $i % 8`
        case $j in
        1)
        echo -n $line | awk ‘{print$1" "}‘>>t_2_$n.txt
        ;;
        2)
        ;;
        3)
        echo -n $line | awk ‘{print$1$3" "}‘>>t_2_$n.txt
        ;;
        4)
        echo -n $line | awk ‘{print$PN" "}‘>>t_2_$n.txt
        ;;
        5)
        echo -n $line | awk ‘{print$1$3$4$6" "}‘>>t_2_$n.txt
        ;;
        6)
        echo -n $line | awk ‘{print$1$3$4$6" "}‘>>t_2_$n.txt
        ;;
        7)
        echo -n $line | awk ‘{print$1$3" "}‘>>t_2_$n.txt
        echo -e -------------------------- >>t_2_$n.txt
        cat t_2_$n.txt >> dd.txt
        ;;
        esac
        i=`expr $i + 1`
      done <t_$n.txt
    fi
    rm -rf t_2_$n.txt
    rm -rf t_$n.txt
    echo >& 6
  }&
done

wait

seconds_2=$(date +%s)
echo "TIME: `expr $seconds_2 - $seconds_1`"

exec 6>&-
exec 6<&-

exit 0

时间: 2024-10-15 02:25:18

shell爬虫简易脚本(线程数可控)的相关文章

shell 外部传入jmeter脚本线程数,rampUp时间,持续运行时间

jmeter参数化部分参考上一篇 shell参数说明:$1线程数,$2:全部并发数rampup时间,$3:脚本持续运行时间,$4:每次脚本循环持续时间 $5:所以循环持续时间 #!/bin/bash REPORT_TIME=`date '+%Y%m%d%H%M%S'` jmeter_basedir=/Users/lyh/Desktop/dubbo-performance-testing/apache-jmeter-2.13 report_icon=$jmeter_basedir/extras/c

Linux shell爬虫实现树洞网自动回复Robot

奇怪的赞数 人生在世,不如意事十之八九,可与言者无二三人.幸好我们生在互联网时代,现实中找不到可以倾诉的人还可以在网络上寻找发情绪宣泄口,树洞这类产品就是提供一个让人在网络上匿名倾诉的平台. 我是偶然间发现了这个平台:http://www.6our.com/,感觉自己比较惨的时候去看看别人的不如意,发现上帝还是蛮眷顾自己的(也不知道中国在不在他老人家的管辖范围内).不过我发现了一个奇怪的现象:秘密有一个赞和踩的功能,但是我看到的秘密的赞都没有发现有低于2的,然后尝试着发了一条,发现刚发出来就有两

Linux Shell 运维脚本功底积累

1.删除Linux远程用户连接会话 [[email protected] logs]# w 10:45:28 up 15 days, 16:23, 4 users, load average: 0.00, 0.00, 0.00 USER TTY FROM [email protected] IDLE JCPU PCPU WHAT root tty1 - Sun21 4days 0.00s 0.00s -bash root pts/0 192.168.1.2 09:11 0.00s 0.07s 0

Linux Shell多进程并发以及并发数控制

1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&字符,该命令就会被送往到linux后台执行,而终端又可以继续输入下一个命令了. 比如: sh a.sh & sh b.sh & sh c.sh & 这三个命令就会被同时送往linux后台执行,在这个程度上,认为这三个命令并发执行了. 1.2. linux文件描述符 文件描述符(缩

Shell编程(脚本)的常用命令和语句

一些常用的Shell编程(脚本)命令和语句,可以满足一般需求. 接收到的命令参数: 参数个数: $# 参数值: 命令本身:$0 第一个参数:$1 第二个参数:$2 -- 退出命令: exit echo命令: 换行: echo 输出后不换行: echo -n "请选择(y/n)?" 利用转义符号输出双引号: echo "欢迎使用\"正式服务器\"部署工具." 输出中带变量: echo "即将部署项目:$project_name"

你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?

IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫“IIS限制连接数” 这边客户请求的连接内容包括: 1.网站html请求,html中的图片资源,html中的脚本资源,其他需要连接下载的资源等等,任何一个资源的请求即一次连接(虽然有的资源请求连接响应很快) 2.如果网页采用框架(框架内部嵌套网页请求),那么一个框架即一次连接 3.如果网页弹出窗口(窗口内部嵌

Shell编程(脚本)的经常使用命令和语句

一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit echo命令: 换行: echo 输出后不换行: echo -n "请选择(y/n)?" 输出后不换行,并把光标移到最左(以便下次输出覆盖当前行) echo -ne "$i\r" 利用转义符号输出双引號: echo "欢迎使用\"正式server\&qu

IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的

IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫"IIS限制连接数" 这边客户请求的连接内容包括: 1.网站html请求,html中的图片资源,html中的脚本资源,其他需要连接下载的资源等等,任何一个资源的请求即一次连接(虽然有的资源请求连接响应很快) 2.如果网页采用框架(框架内部嵌套网页请求),那么一个框架即一次连接 3.如果网页弹出窗口(

用于Nagios中监控服务器进程的最大线程数

最近在刚好一些业务经常把线程跑满,导致服务器资源用完,所以就写了一个脚本用于Nagios下相关进程的最大线程数的监控,Unix的服务器上最大的线程数默认的是1024,当然在业务繁忙的服务器中这样肯定是不够用的,当然在实际生产环境中做初始化调优时一般都会有做过修改,如开启打开文件的最大句柄数等等,一般情况下我们都是修改/etc/security/limits.conf文件,但是要修改最大线程树就要修改/etc/security/limits.d/90-nproc.conf文件了,修改就和修改lim