前段时间有位朋友对爬虫感兴趣,正好我之前也干过几个项目,顺手发一篇。
本文旨在使用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
手动建字典-.-#///
#!/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
页码很长,内容很短
文章浏览阅读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数据格式对应方法
文章浏览阅读8.4k次。1. 基本原理要点内存分大小想的帧(Frame);进程按照帧的大小被分为若干页(Page);进程仅装入部分页面,即开始执行在执行过程中访问的页若已在内存,进行动态的地址重定位,执行指令(同基本分页存储管理)2. 请求分页式存储管理在执行过程中访问的页未装入内存时,产生缺页中断,进程阻塞,等待从磁盘动态装入页面;缺页装入以后,进程转入就绪,可以参与调度继续执行;内存无空闲可用帧时,暂时不用的页面可换出到交换区;通过页面的换入换出,实现小内存运行大进程。3. 进程的一个页面会存在哪里_请求页式管理的原理
文章浏览阅读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
文章浏览阅读736次。1.服务器端代码package com.sunyard.service.deploy;import javax.xml.ws.Endpoint;import com.sunyard.service.HelloWorldService;/** * * @ClassName: DeployHelloWorldService * @Description:..._invalid endpoint address
文章浏览阅读359次。点击上方“程序员黑叔”,选择“置顶或者星标”你的关注意义重大!文/司徒正美来源:知乎阅读本文需要3分钟前言一、讲述这其实涉及一个难度问题,在angular里面自带了一个HTML par..._司徒正美 react
文章浏览阅读1.2w次。Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js。下面的例子会用到bootstrap.min.css以及vue.js,都可以从网上下载。 Vue.js小demo_vue 新加一行tr
文章浏览阅读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 设置了公钥 不行
文章浏览阅读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
文章浏览阅读683次。点击上方“程序员黑叔”,选择“置顶或者星标”你的关注意义重大!作者/ 腾讯AlloyTeam团队 阅读本文需要8分钟也许你有听过一个问题,你这款 web 应用性能怎么..._腾讯云前端监控接入方式
文章浏览阅读1.2k次。昨天在调试我的网站文本分析工具的问题,发现replace 方法存在问题。替换不合 注意,我的“ 是 ”字两边是有空格的。s=" 是 是 是 还是 不是 这个呀"s=s.replace(' 是 '," YES ")print(s)输出: YES 是 YES 还是 不是 这个呀 你会发现,第一个“是”被正确替换为"YES"了,第二个没有。分析了一下,pytho内部的逻辑应该是认为当第一个" 是 "匹配上之后,第二“ 是 ”字就变成了”是 “,”,左边没有空格了。第三“ 是 ”又能._python的replace()函数只能替换一个怎么解决
文章浏览阅读550次。众所周知,早在2016年的时候,微前端就诞生了,但为什么直到2020年,微前端才高频的出现在我们视野中呢?要知道一个项目随着时间的推移,业务不断发展,前端业务场景就会变得越来越庞大臃肿,..._珠峰 微前端
文章浏览阅读616次。react-native项目android端 友盟库升级第一次接触rn项目,就遇到了个让人抓狂的问题,APP分享功能在android11上分享失败了,在咨询项目前负责人和相关文档查阅后,发现涉及两个主要的问题。问题一:友盟基础库版本太低,项目友盟基础库原先版本 2.2.2,基础库和与之对应的SDK需要升级到最高。问题二:APP监管力度加强,为保护用户隐私,需要将友盟+SDK初始化延迟到用户同意隐私政策后进行。这次友盟升级主要是针对微信分享问题的解决,由于时间紧迫,这里不涉及统计、推送相关的问题的解决_react native 首次启动隐私弹窗