前段时间有位朋友对爬虫感兴趣,正好我之前也干过几个项目,顺手发一篇。
本文旨在使用Shell构建一个快速的小爬虫,分分钟上手
多快好省是主要目标;没有现成的轮子,那就建一个
工具一览
Name | Use |
---|---|
curl | 裸数据 |
wget | 下载器 |
awk | 列文本处理 |
sed | 行文本处理 |
seq | 特定范围 整数(页码)生成 |
grep | 文本过滤 |
jq | json格式解析 |
iconv | 字符编码转换 |
sort | 排序工具 |
tac | 反向输出(与cat相反) |
wc | 行统计 |
基本流程
与爬虫原理相同,下图仅代表作者的理解
案例
批量下载
前不久有学弟说想批量下载某网站资源:某法国网站里不知明的五线谱
使用迅雷批量下载失败
曲折
通过F12和Wireshark发现该网站加了一定的防爬措施,Referer + 302跳转
以前没碰到http 302跳转的情况,虽说加上Referer可以获取到目标资源了,但下载名不对,显示download?=10,于是乎先把整个列表名称抓下来,清洗,过滤,放另一个文本里。。。对的,你没猜错,下载的同时按列表里的重命名。
但是啊,又出现了重名问题,原来一个资源有多个不同的打包格式,名字却是一样的,这样搞确实很蛋疼。
那么Chrome下载的时候是怎么个情况呢?
情况是,这货居然能自动重命名,按以往的体验,Chrome自带的下载器只能算中规中矩,如此看来自动重命名是个基础功能,看看wget有没有可选参数可以支持"根据服务器的规定给下载的文件命名",
果然有,加上**–content-disposition**
最终代码
for i in `seq 150`; do
wget -c --content-disposition --referer='http://freescores.free.fr/partitions-gratuites/partitions-pop-rock.php?lang=zh' 'http://freescores.free.fr/partitions-gratuites/download.php?id='$i''
done
额外收获
Linux文件批量重命名 rename
#将dir目录下面的所有文件名中的空格替换为下划线"_"
rename 's/ /_/g' dir/*
#反操作,下划线替换为空格
rename 's/_/ /g' dir/*
Linux行文本处理 sed
#空格转下划线
sed 's/[ ][ ]*/_/g'
零散的小说
有一次,看到一篇中意的小说,但是呢,目录掺杂了别的连载(报纸类),为了方便观看查阅(获得完整的目录及链接),弄了只爬虫
#!/bin/bash
for i in `seq 80`
do
echo 'Now page' $i
curl -s 'http://www.dahuawang.com/dhserver/writer/List.asp?CNo=120301&Page='$i'' --compressed \
| iconv -f gb2312 -t utf-8 \
| sed -n '44,72p' \
| grep "活灵魂" >> list_novel
done
- curl 获取网页代码
- iconv 字符转换解决Linux下中文乱码问题
- sed 将每页含有目录及链接的区域留下
- grep 字段过滤(小说名)
- 重定向至文件
查字典
手动建字典-.-#///
#!/bin/bash
for i in `cat list_target`
do
echo -n $i
curl -s "https://dict.hjenglish.com/w/$i" \
-H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' \
2>/dev/null \
| sed -n '230,273p' \
| sort -n \
| tail -n 12 \
| tac \
| sed -n 4p
done
评论区
页码很长,内容很短
总结
优
- 体量小;速度快
- 低环境依赖,工具现成
- 无需大动干戈安装各类依赖库
劣
- It’s a plaything