Shell 爬虫

前段时间有位朋友对爬虫感兴趣,正好我之前也干过几个项目,顺手发一篇。

本文旨在使用Shell构建一个快速的小爬虫,分分钟上手
多快好省是主要目标;没有现成的轮子,那就建一个

工具一览

Name Use
curl 裸数据
wget 下载器
awk 列文本处理
sed 行文本处理
seq 特定范围 整数(页码)生成
grep 文本过滤
jq json格式解析
iconv 字符编码转换
sort 排序工具
tac 反向输出(与cat相反)
wc 行统计

基本流程

与爬虫原理相同,下图仅代表作者的理解

Created with Raphaël 2.2.0 开始 获取内容 筛选、过滤 格式化 转储 结束

案例

批量下载

前不久有学弟说想批量下载某网站资源:某法国网站里不知明的五线谱
使用迅雷批量下载失败

曲折

通过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

你可能感兴趣的:(捣鼓)