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"

#创建<有名管道>
mkfifo testfifo
exec <>testfifo
rm -rf testfifo

#设置线程数
Thread=128 #指定线程数
for ((n=;n<$Thread;n++))
do
echo >&
done #设置计时器,记录开始时的时间戳
seconds_1=$(date +%s)

#开始获取黄页地址列表
for i in {..};
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 $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 >&
}&
done done wait

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

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

exec >&- 

exec <&-
exit 

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

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

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

    jmeter参数化部分参考上一篇 shell参数说明:$1线程数,$2:全部并发数rampup时间,$3:脚本持续运行时间,$4:每次脚本循环持续时间 $5:所以循环持续时间 #!/bin/bash ...

  2. 3.jmeter jsr232 脚本获取当前测试的正在活动的线程数

    jsr232 groovy 脚本获取当前测试的正在活动的线程数 (需要选择 groovy类型, 如果使用beanshell或者javascript,请根据其语法稍作修改即可) import org.a ...

  3. 动态调整线程数的python爬虫代码分享

    这几天在忙一个爬虫程序,一直在改进他,从一开始的单线程,好几秒一张图片(网络不好),,,到现在每秒钟十几张图片,,, 四个小时586万条数据,,,简直不要太爽 先上图 最终写出来的程序,线程数已经可以 ...

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

    奇怪的赞数 人生在世,不如意事十之八九,可与言者无二三人.幸好我们生在互联网时代,现实中找不到可以倾诉的人还可以在网络上寻找发情绪宣泄口,树洞这类产品就是提供一个让人在网络上匿名倾诉的平台. 我是偶然 ...

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

    1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...

  6. linux与shell介绍 - 进程与线程

    linux linux与windows的区别 linux的文件结构 Linux基本命令 ls: 列出目录 cd: 切换目录 pwd: 显示当前目录 mkdir: 创建一个新的目录 rmdir: 删除一 ...

  7. LINUX最大线程数及最大进程数

    查看最大线程数: cat /proc/sys/kernel/threads-max ulimit User limits - limit the use of system-wide resource ...

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

    IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...

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

    原文链接:http://www.cnblogs.com/yinhaichao/p/4060209.html?utm_source=tuicool&utm_medium=referral 一般购 ...

随机推荐

  1. 一个CSS3滤镜Drop-shadow阴影效果

    <html> <head> <title>CSS3 Drop-shadow阴影</title> <style type="text/cs ...

  2. Android解决下拉刷新控件SwipeRefreshLayout和ViewPager的滑动冲突

    直接说明下我自己项目中的情况,如图: 外部嵌套任何一种refresh下拉控件之后,上方的viewpager左右滑动事件都受到影响,滑动不流畅,稍微有点向下的趋势就会触发刷新. 起初以为可能跟不同下拉控 ...

  3. jquery动态分页

    最近一直研究jquery的分页效果,刚刚弄好了一个,拿出来与大家分享.分页效果与时光网的差不多. 网址:http://www.mtime.com/movie/news/all/ 先在aspx页面放置一 ...

  4. tensorflow中slim模块api介绍

    tensorflow中slim模块api介绍 翻译 2017年08月29日 20:13:35   http://blog.csdn.net/guvcolie/article/details/77686 ...

  5. 第三百一十七节,Django框架,缓存

    第三百一十七节,Django框架,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返 ...

  6. Javascript实用代码片段(译)

    原文:http://www.bestdesigntuts.com/10-time-saving-javascript-code-snippets-for-web-developers 1. 同高或同宽 ...

  7. 从头认识java-18.2 主要的线程机制(7)join

    这一章节我们来讨论一下join. 1.什么是join? 阻塞当前线程,让.join的线程先做完.然后再继续当前线程 以下是api的解释: A.join,在API中的解释是,阻塞当前线程B,直到A运行完 ...

  8. Docker 集群管理

    docker systemd unit file [Unit] Description=Docker Application Container Engine Documentation=http:/ ...

  9. About {DynamicResource {x:Static SystemColors.ControlBrushKey}}

    from : http://blog.sina.com.cn/s/blog_749e42850100sahi.html 前提: <system:String x:Key="{Compo ...

  10. 怎么解决MathType希腊字母无法显示的问题

    MathType是一种常见的数学公式编辑软件,有些用户在编辑论文公式的时候发现,一些希腊字母在公式编辑器中无法打出来,上面显示一个“叉”号,面对这种MathType希腊字母无法显示的问题该如何解决呢? ...