Shell 爬虫_shell脚本爬虫-程序员宅基地

技术标签: 爬虫  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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ke515041/article/details/80964330

智能推荐

4.JDBC通用的查询数据库方法_jdbc查询sql数据格式对应方法-程序员宅基地

文章浏览阅读1.2k次,点赞3次,收藏3次。package com.jdbc3.selectTest;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.ArrayList;import java.util.List;import org.junit.T_jdbc查询sql数据格式对应方法

操作系统---(34)请求分页存储管理之基本原理_请求页式管理的原理-程序员宅基地

文章浏览阅读8.4k次。1. 基本原理要点内存分大小想的帧(Frame);进程按照帧的大小被分为若干页(Page);进程仅装入部分页面,即开始执行在执行过程中访问的页若已在内存,进行动态的地址重定位,执行指令(同基本分页存储管理)2. 请求分页式存储管理在执行过程中访问的页未装入内存时,产生缺页中断,进程阻塞,等待从磁盘动态装入页面;缺页装入以后,进程转入就绪,可以参与调度继续执行;内存无空闲可用帧时,暂时不用的页面可换出到交换区;通过页面的换入换出,实现小内存运行大进程。3. 进程的一个页面会存在哪里_请求页式管理的原理

TensorFlow模型转换h5转pb_tensorflow h5转pb-程序员宅基地

文章浏览阅读2.8k次。在TensorFlow模型训练阶段一般使用model.save()将模型保存为h5格式,但部署阶段经常需要将训练好的模型固化为pb格式。h5模型转pb模型实现脚本:import tensorflow as tffrom tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2def h5_to_pb(h5_save_path): model = t..._tensorflow h5转pb

CXF客户端Invalid address. Endpoint address cannot be null异常求助-程序员宅基地

文章浏览阅读736次。1.服务器端代码package com.sunyard.service.deploy;import javax.xml.ws.Endpoint;import com.sunyard.service.HelloWorldService;/** * * @ClassName: DeployHelloWorldService * @Description:..._invalid endpoint address

司徒正美:为什么类 React 框架层出不穷?-程序员宅基地

文章浏览阅读359次。点击上方“程序员黑叔”,选择“置顶或者星标”你的关注意义重大!文/司徒正美来源:知乎阅读本文需要3分钟前言一、讲述这其实涉及一个难度问题,在angular里面自带了一个HTML par..._司徒正美 react

Vue.js表格增加删除demo_vue 新加一行tr-程序员宅基地

文章浏览阅读1.2w次。Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js。下面的例子会用到bootstrap.min.css以及vue.js,都可以从网上下载。 Vue.js小demo_vue 新加一行tr

随便推点

vscode远程连接以及无法免密登录的问题_vscode 设置了公钥 不行-程序员宅基地

文章浏览阅读2.7k次,点赞6次,收藏4次。目录1、在vscode安装remote2、修改remote的json配置3、修改setting.json4、(免密登录,不需要的可以不配)将win的公钥发给服务器5、vscode连接最后:在配置免密登录后,若还是不能免密首先无论是win还是linux主机都要先配置好ssh,且生成公钥私钥,这里不在赘述1、在vscode安装remote2、修改remote的json配置3、修改setting.json修改remote setting..._vscode 设置了公钥 不行

APIC_EM REST API URLs_rest api /v1-程序员宅基地

文章浏览阅读184次。1. URL的组成部分:https://fqdn-Or-IPofController/api/v1/api_itself其中:1、https://fqdn-Or-IPofController是基本URL,如有需要,URL中还可以加上端口号;2、api/v1/是指REST API的版本号3、/api_itself是指API的端口2. 如何使用python发出HTTP请求?HTTP - “CRUD”方法去创建、读取、更新和删除数据:POST - 创建数据GET - 读取数据PUT _rest api /v1

腾讯前端团队是如何做web性能监控的?-程序员宅基地

文章浏览阅读683次。点击上方“程序员黑叔”,选择“置顶或者星标”你的关注意义重大!作者/ 腾讯AlloyTeam团队 阅读本文需要8分钟也许你有听过一个问题,你这款 web 应用性能怎么..._腾讯云前端监控接入方式

Python replace() 和 re.sub() 替换不全的问题及解决办法_python的replace()函数只能替换一个怎么解决-程序员宅基地

文章浏览阅读1.2k次。昨天在调试我的网站文本分析工具的问题,发现replace 方法存在问题。替换不合 注意,我的“ 是 ”字两边是有空格的。s=" 是 是 是 还是 不是 这个呀"s=s.replace(' 是 '," YES ")print(s)输出: YES 是 YES 还是 不是 这个呀 你会发现,第一个“是”被正确替换为"YES"了,第二个没有。分析了一下,pytho内部的逻辑应该是认为当第一个" 是 "匹配上之后,第二“ 是 ”字就变成了”是 “,”,左边没有空格了。第三“ 是 ”又能._python的replace()函数只能替换一个怎么解决

微前端从实战到源码-可能是最完整的版本!-程序员宅基地

文章浏览阅读550次。众所周知,早在2016年的时候,微前端就诞生了,但为什么直到2020年,微前端才高频的出现在我们视野中呢?要知道一个项目随着时间的推移,业务不断发展,前端业务场景就会变得越来越庞大臃肿,..._珠峰 微前端

react-native项目android端 友盟库升级_react native 首次启动隐私弹窗-程序员宅基地

文章浏览阅读616次。react-native项目android端 友盟库升级第一次接触rn项目,就遇到了个让人抓狂的问题,APP分享功能在android11上分享失败了,在咨询项目前负责人和相关文档查阅后,发现涉及两个主要的问题。问题一:友盟基础库版本太低,项目友盟基础库原先版本 2.2.2,基础库和与之对应的SDK需要升级到最高。问题二:APP监管力度加强,为保护用户隐私,需要将友盟+SDK初始化延迟到用户同意隐私政策后进行。这次友盟升级主要是针对微信分享问题的解决,由于时间紧迫,这里不涉及统计、推送相关的问题的解决_react native 首次启动隐私弹窗

推荐文章

热门文章

相关标签