“这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战”
这是javascript写shell脚本的第三篇文章,之前文章的链接如下:
这篇主要来讲一下如何发起网络请求。
发起网络请求主要使用一个开源的工具curl,其功能和postman差不多,用于构建网络请求,获取并处理数据。
首先介绍下curl的基础使用,如果用过的跳过即可。
curl的基础使用
查看响应
# 查看网页源代码
curl www.baidu.com
# 查看响应头和网页源代码
curl -i www.baidu.com
# 只查看响应头
curl -I www.baidu.comn
构建HTTP请求
http请求包括:
-
请求行
- HTTP动词(方法) -X
-
请求头 -H
- Content-Type 指定发送数据的类型
-
请求体
- -d
指定HTTP方法
# -X指定HTTP方法(动词),默认是GET
curl -X POST www.baidu.com
curl -X DELETE www.baidu.com
发送不同类型的数据
-H 参数添加HTTP请求标头 -d 参数用于发送POST请求的数据体
Content-Type : application/x-www-form-urlencoded
# -d发送请求体数据 默认的Content-Type为`application/x-www-form-urlencoded`
curl -X POST -d 'userPhoneNumber=15064761673' example.com/user
# -d会自动将请求转化为POST,所以-X POST可以省略
curl -d 'userPhoneNumber=15064761673' example.com/user
# 可以读取本地文本文件的数据,向服务器发送
curl -d '@data.txt' example.com/user
Content-Type: multipart/form-data
# -F参数用来向服务器上传二进制文件
curl -F 'file=@photo.png' <https://google.com/profile>
-
Content-Type:application/json- H 添加请求头
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' <https://google.com/login>
下载文件
- o 将服务器的回应保存为文件,等同于wget命令
# 格式:
curl -o 文件名 www.baidu.com
# 示例
curl -o sina.html www.baidu.com
# 可以和其他参数组合使用,例如只下载响应头
curl -o sina_res_header.txt -I www.baidu.com
- O 将服务器的回应保存为文件,并将URL的最后部分当做文件名
curl -O <https://www.baidu.com/img/dong_66cae51456b9983a890610875e89183c.gif>
脚本中使用curl发起网络请求
举个栗子,假如我要获取掘金首页推荐的文章数据,步骤如下:
- 打开Network,看掘金首页调用的是哪个接口
- 复制接口信息
然后开始写代码,把获取列表的接口放到一个函数里,如果需要修改参数的话,可以把要修改的参数作为函数的参数传入
#!/usr/bin/env node
const shell=require('shelljs')
// 获取数据
function fetchList(){
return `
curl 'https://api.juejin.cn/recommend_api/v1/article/recommend_all_feed' \
-H 'authority: api.juejin.cn' \
-H 'pragma: no-cache' \
-H 'cache-control: no-cache' \
-H 'sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36' \
-H 'content-type: application/json' \
-H 'accept: */*' \
-H 'origin: https://juejin.cn' \
-H 'sec-fetch-site: same-site' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-dest: empty' \
-H 'referer: https://juejin.cn/' \
-H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
-H 'cookie: _ga=GA1.2.151728167.1605962485; n_mh=QqqO9vdPyoUgGdMUK7bmzGg_3PdkxHeXQjID5mYHilk; MONITOR_WEB_ID=f9b5a304-d583-464d-ac25-bd0fc1849132; passport_csrf_token_default=6ae74227ec74685add0271300bf1f275; passport_csrf_token=6ae74227ec74685add0271300bf1f275; sid_guard=5d56b314e811199a40ac8d4a1a03774b%7C1627264731%7C5184000%7CFri%2C+24-Sep-2021+01%3A58%3A51+GMT; uid_tt=df38a08a79a50cfc2bde3f330d5cef2c; uid_tt_ss=df38a08a79a50cfc2bde3f330d5cef2c; sid_tt=5d56b314e811199a40ac8d4a1a03774b; sessionid=5d56b314e811199a40ac8d4a1a03774b; sessionid_ss=5d56b314e811199a40ac8d4a1a03774b; _gid=GA1.2.1703676324.1627819267; _tea_utm_cache_2608={%22utm_source%22:%2220210803%22%2C%22utm_medium%22:%22Push%22%2C%22utm_campaign%22:%2231day%22}' \
--data-raw '{"id_type":2,"client_type":2608,"sort_type":3,"cursor":"0","limit":20}' \
--compressed
`
}
;(function(){
shell.exec(fetchList(),{silent:true},(code,stdout)=>{
if(code!==0)throw new Error('调用接口失败')
console.log(stdout)
})
}())
输出如控制台所示:
总体过程比较简单,获取了数据之后,就可以做一些对数据的处理了,例如可以统计一下出现所有的文章最多的关键字什么的。
脚本中可以发起网络请求之后,我们就可以做很多事情了,例如
- 爬取一些网站的壁纸
- 爬取知乎的一些回答
- 爬取一些数据,整理成excel表格
- 做一些自动签到的脚本
以后会写一些栗子。