Shell 爬虫

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

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

工具一览

NameUse
curl裸数据
wget下载器
awk列文本处理
sed行文本处理
seq特定范围 整数(页码)生成
grep文本过滤
jqjson格式解析
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
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值