使用系统命令curl、wget ,写个少量的数据采集脚本

0

最近想采集几个网站的数据,分析了一下网站是vue js写成的,虽然是动态网站,但因为采用的vue写的前端,数据全部都是json格式的,比直接采集静态网页的html再清洗数据方便多了。

源数据是公开可访问的数据 json 数据,虽然单条数据id没有规律可寻,但是api接口的全部搜索和搜索分页接口的URL有规律可寻,而且都是按照列表分页的,还给定义了传递每页取多少条的参数。

通过固定的命令就可以采集到,以前的时候我可能会手工采集一下。本来是考虑自己写个 js 脚本通过chrome的调试工具采集以后再写个程序接口回传采集到的数据的。

但觉得写 js 和写程序接收数据的接口太麻烦,需要对数据字段一一对应入到数据库,还要梳理他们的业务逻辑来造数据库。想起来就觉得不想干,一直没有行动。

前段时间看了一下采集源的json数据结构,想过能不能直接写个采集脚本,使用火车头这种采集工具把数据采集到本地数据库就好了,但也没空折腾火车头的采集程序,不想因为采集几千条数据再单独写个火车头脚本,写火车头浏览器的采集规则也挺麻烦的,同样需要梳理数据库结构,还需要再梳理采集脚本,一样需要做一遍数据和逻辑梳理工作。

采集这些数据的目标其实挺简单,就是想把数据采集回来,可以做一做分析,看看有什么内容可以做训练素材,毕竟是他们整理好的数据,人工整理省下了。

最近研究chrome调试工具,又折腾深度学习的环境搭建,需要下载很多被屏蔽的文件,有些安装包需要通过 vutlr 的服务器中转,所以特别研究了一下直接通过curl、和wget 下载文件的命令。

在看采集源的json数据格式的时候,看到 chrome 调试模式有复制 curl 的链接方式,尝试了一下通过 curl 命令下载json数据来使用,发现 curl 还挺好用,单纯转存下载文件比用浏览器脚本效率高很多。

curl 可以模拟很多复杂的浏览器请求,基本上能从浏览器发起的请求都可以直接通过 chrome 控制台复制出curl的请求方式,适合改改另作他用。以前通过onedrive转存calibre的数据库文件就是用的curl,国外vultr 服务器下载 onedrive 文件速度快到飞起,300m的文件只需要几秒钟。

这次采集数据当做实验,用了 shell 脚本循环执行 curl ,下载需要验证cookie的json文件。第一次写shell的脚本,发现shell 里面的循环和C语言、PHP脚本都不太一样,序列生成器和变量使用都需要现学习。

curl 采集到列表数据的 json 文件以后,需要清洗一遍,从 json 中提取出需要另外下载的单个内容详情的 id 和图片文件。提取数据用熟悉的PHP,通过读取列表的 json 文件,提取出 shell 循环需要的列表。

再通过 shell 循环执行 curl 把内容数据的 json 文件下载到文件夹。后续还有进一步的json文件采集,需要登录鉴权才能继续采集接下来的数据,没有接着往下研究,只把公开数据采集到就足够使用了。

接下来就是对公开图片进行下载了,因为图片下载没有防盗链,只需要 wget 下载即可,以前只知道使用 wget 下载文件到服务器,现在了解一下 wget 还是个强大的下载工具,不但可以下载单个文件,还可以通过文件列表循环下载,把 wget 需要下载的图片 url 列表使用 php 代码从 json 文件中提取出来。

wget 设置好参数以后,直接自动从文件列表读取图片 url 下载,下载速度和链接优化都很给力,感觉比迅雷下载速度稳定多了。也许 aira2 的下载工具也有借鉴 wget 的实现思路。

这次写 php 提取 json 数据用的 ci 框架,很多功能写起来简单多了,比用原生 php 写也快很多,写着写着连 json 数据展示网站都写了出来,还顺带把 json 文件输出的 api 接口也一起写了出来,在不考虑容错的情况下还是简单可用的。

有了页面,顺带测试了一下 wget 的自动遍历网站,扒网站的功能,只要是纯 html 的网站页面,真的是分分钟把站点就扒下来,自动循环链接进行递归采集,还支持对 html 里面的 css 样式,JS 文件进行自动替换,链接也会自动处理。 我试了一下把采集到的 json 数据通过 php 的 ci 框架生成 html 链接,做了两层目录。

一条 wget 命令,设置好采集参数,直接把整个网站给下载下来,规规整整的整理成了静态页面。测试 wget 扒站,好像 wget 最后强制把 https 的请求资源和不指定协议的自适应资源都自动替换成了 http 的协议,我再测试 wget 采集的网站资源的时候发现没法通过 https 完整访问。

这些系统自带的命令行工具居然功能如此强大,之前都不知道,耗费了多少精力去干体力活,根本不会使用生产力工具,现在会用了,也不知道还有没有做事情的动力了。

相关代码记录,测试演示网址放到了gitee,感兴趣的可以自行查看 :
https://gitee.com/xpx/code/blob/master/%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6/wget%20%E9%87%87%E9%9B%86%E7%BD%91%E7%AB%99%E7%B4%A0%E6%9D%90%E4%BB%A3%E7%A0%81.md

本文关键词:
shell
curl
wget
php
ci

采用 shell+curl 进行少量规则数据采集,因为是api的列表接口数据,具有重复性和数字循环规律,数据采集脚本。wget
curl
shell
采集

参考资料:
wget 15种终极用法。
https://www.cnblogs.com/lbnnbs/p/4781940.html

##shell curl wget 采集脚本代码记录

###shell curl 循环采集脚本:

shell seq 序列生成器生产的循环数组用空格间隔开,生产顺序数可以用seq。

数字可以类似这样 (1 2 3);

如果是字符类似 (“1” “2” “3”);

循环中只能够需要用到变量的地方需要包含在双引号“”里面。

###shell 文件.sh代码示例
curl -o 是另存为的文件名。

“`
#!/bin/bash
#采集梦课学堂在线列表
for i in $(seq 0 4632)
do
curl -o “/Users/mac/Desktop/xtcourse/c/${i}.json” “http://www.learning.mil.cn/weixin/official/search/?page=${i}&page_size=1&type=2
done
“`

###shell 文件.sh 代码示例二。

curl 脚本是从chrome 的控制台复制的curl代码改造的。

“`
#!/bin/bash

adata=(4022307 4230808 4231448 4231365 4173204 3970283 1511723 5430900 4230178 4231312)

for i in ${adata[@]};
do

curl -o “/Users/mac/Desktop/${i}.json” “https://www.xuetangx.com/api/v1/lms/product/get_course_detail/?cid=${i}”
-H ‘authority: www.xuetangx.com’
-H ‘accept: application/json, text/plain, */*’
-H ‘django-language: zh’
-H ‘x-client: web’
-H ‘accept-language: zh’
-H ‘xtbz: xt’
-H ‘user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’
-H ‘sec-fetch-site: same-origin’
-H ‘sec-fetch-mode: cors’
-H ‘sec-fetch-dest: empty’
-H “referer: https://www.xuetangx.com/course/HUBU10011000132/${i}?channel=course_list_all
-H ‘cookie: ajs_group_id=null; ajs_anonymous_id=%22e746e057-fgkk-f-8a73-80000002e7f0%22; ajs_user_id=%228745%22; OUTFOX_SEARCH_USER_ID_NCOO=2049968781.6459324; UM_distinctid=172d97c5c84611-04b191ba3b946d-31617402-fa000-172d97c5c858a3; _ga=GA1.2.1048958767.160240090513; _log_user_id=0d8cebyuuyuyu77e331b; sharesessionid=92a0ee47dcfbc8b4125cdde; _gid=GA1.2.43.1605508972; provider=xuetang; django_language=zh; _gat_gtag_UA_155656573_1=1’
–compressed

done
“`

###采集脚本:-b 是后台隐藏, -i 可以带一个文件列表,-r 是递归下载。

这是下载整站的代码

采集的源站:http://x.08nm.com/course/

“`
wget -r -p -np -k http://x.08nm.com/course/
“`
采集后的站点示例:http 和https,https资源也被强制替换成了http资源,导致https有些文件无法加载。

http://www.08nm.com/xtcourse/
https://www.08nm.com/xtcourse/

采集源站:http://www.dxzy163.com/

“`
wget -b -r -p -np -k http://www.dxzy163.com/
“`

采集后的静态网址:http://wy.bitx.cn/

采集后的静态网站:配合了php 做了一些带问号资源的读取和显示。还需要手工转存一些程序检测不到由js生成的文件。

采集了一天还没采完,需要慢慢等待一下其他资源的缓存状况。

wget 使用 -b 以后会在后台运行,并且在下载执行的目录下生成一个 wget-log 的文件。

可以通过 tail -f wget-log 查看实时采集进度。

另外通过文件列表下载文件的方式 -i 后面跟文件
其他类型的wget采集,通过文件列表采集图片等。
“`
wget -N -P “/Applications/MAMP/htdocs/x/app/xuetangxpic” –no-check-certificate -i “/Applications/MAMP/htdocs/x/app/xuetangxpic/picfile.php”
“`

picfile.php 文件类似这种代码格式,通过用php 提前提取了数据文件列表,人工整理太累了。
“`
https://qn-next.xuetangx.com/15676560608844.png
https://qn-next.xuetangx.com/15676560441782.png
https://qn-next.xuetangx.com/15676560673329.png
https://qn-next.xuetangx.com/15676690892449.png
https://qn-next.xuetangx.com/15676690761522.png
“`

###nginx 临时配合ci php 代码输出带?号的资源访问规则。
rewrite 结尾符号 last,break,redirect. 最后用last结尾还不行。
“`
rewrite ^/player/index([0-9]+).html$ ^/ci/public/index.php?/player/?index$1.html?$query_string? last;
“`

“`
rewrite ^/player/index([0-9]+).html$ /public/index.php?/player/?index$1.html?$query_string? redirect;

rewrite ^/playdata/([0-9]+)/([0-9]+).js$ /public/index.php?/playdata/?/playdata/$1/$2.js?$query_string? redirect;
“`

###php 处理gb2312 数据乱码。

“`
//设置流的编码格式,这是文件流(file),如果是网络访问,file改成http
$opts = array(‘file’ => array(‘encoding’ => ‘gb2312’));
$ctxt = stream_context_create($opts);
file_get_contents(文件名, FILE_TEXT, $ctxt);
“`
###php 中处理uri 时get请求中的英文句号 . 是php连接符号,会自动替换成下划线,需要再单独替换回来。
“`
^str_replace(“_html”,”.html”,urldecode($str));
“`

###todo
nginx 代理可以直接访问带?的资源静态文件。

### 需要解决的疑难问题。
php 网站的生成和代码可以通过codeigniter 框架生成,简单快捷。
之前的介绍:https://5656t.com/archives/1114

codeigniter官网:https://codeigniter.com/
codeigniter中文站:https://codeigniter.org.cn/

开发简单的展示网站和api 接口足够可用:示例网址
http://x.08nm.com/course/

http://x.08nm.com/course/jsonpage/xuetangx/10

http://x.08nm.com/course/jsonpage/xuetangxlist/4230813

http://x.08nm.com/course/jsonpage/xuetangxdata/4230813