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"
#创建<有名管道>
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爬虫简易脚本(线程数可控)的更多相关文章
- shell 外部传入jmeter脚本线程数,rampUp时间,持续运行时间
jmeter参数化部分参考上一篇 shell参数说明:$1线程数,$2:全部并发数rampup时间,$3:脚本持续运行时间,$4:每次脚本循环持续时间 $5:所以循环持续时间 #!/bin/bash ...
- 3.jmeter jsr232 脚本获取当前测试的正在活动的线程数
jsr232 groovy 脚本获取当前测试的正在活动的线程数 (需要选择 groovy类型, 如果使用beanshell或者javascript,请根据其语法稍作修改即可) import org.a ...
- 动态调整线程数的python爬虫代码分享
这几天在忙一个爬虫程序,一直在改进他,从一开始的单线程,好几秒一张图片(网络不好),,,到现在每秒钟十几张图片,,, 四个小时586万条数据,,,简直不要太爽 先上图 最终写出来的程序,线程数已经可以 ...
- Linux shell爬虫实现树洞网自动回复Robot
奇怪的赞数 人生在世,不如意事十之八九,可与言者无二三人.幸好我们生在互联网时代,现实中找不到可以倾诉的人还可以在网络上寻找发情绪宣泄口,树洞这类产品就是提供一个让人在网络上匿名倾诉的平台. 我是偶然 ...
- Linux Shell多进程并发以及并发数控制
1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...
- linux与shell介绍 - 进程与线程
linux linux与windows的区别 linux的文件结构 Linux基本命令 ls: 列出目录 cd: 切换目录 pwd: 显示当前目录 mkdir: 创建一个新的目录 rmdir: 删除一 ...
- LINUX最大线程数及最大进程数
查看最大线程数: cat /proc/sys/kernel/threads-max ulimit User limits - limit the use of system-wide resource ...
- IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的
IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...
- 你真的了解:IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数 吗?
原文链接:http://www.cnblogs.com/yinhaichao/p/4060209.html?utm_source=tuicool&utm_medium=referral 一般购 ...
随机推荐
- hibernate不调用save也保存上了
List<Instrument> insts = instService.search(search); if (insts.size() == 1) { Instrument inst ...
- C# 在Bitmap上绘制文字出现锯齿的问题
解决锯齿问题主要是修改Graphics的属性 修复绘制图片锯齿问题可以修改 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiA ...
- imx6 android4.2 编译
编译imx6dl android4.2的镜像,记录编译的命令. Build Android Image # Build Android images for i.MX6 SABRE-SD boards ...
- Navicat连接Oracle11g 错误的解决办法
一.换成32位的Navicat!!! 二.去Oracle官网下载你要连接数据版本的client. 注意:需要下载两个文件,以11.2.0.4.0版本为例,需要下载 instantclient-sqlp ...
- 使用什么工具连接MySQL Server
字符界面:命令行终端(需MySQL Client) GUI界面:Navicat.MySQL Workbench 开发语言:使用相应语言的MySQL数据库驱动包或模块连接MySQL 我一般用的是命令行, ...
- PHP curl_setopt函数用法介绍补充篇
1.curl数据采集系列之单页面采集函数get_html 单页面采集在数据采集过程中是最常用的一个功能 有时在服务器访问限制的情况下 只能使用这种采集方式 慢 但是可以简单的控制 所以写好一个常用的c ...
- POI-根据Cell获取对应的String类型值
/** * 根据不同情况获取Java类型值 * <ul><li>空白类型<ul><li>返回空字符串</li></ul>< ...
- ThinkPHP之文件上传
在项目其中.我们有的时候需要上传图片的功能.简单的从面相过程的方法是相对较为复杂的,要一步一步的来.假设用框架的话,相对就简单了很多,主要就是方法以及每个变量所代表的意义,然后就是一些注意的地方了. ...
- hbase shell学习-2
一个学生成绩表的例子来演示hbase的用法. name grade course math english Tom 5 97 87 Jim 4 89 80 表的创建:语法:create '表名称',' ...
- Javascript定义类(class)的最新方法
极简主义法 3.1 封装 这种方法不使用this和prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因. 首先,它也是用一个对象模拟"类&qu ...