背景
头吃午饭的时候,同事突然发了个链接过来,问我能不能把这个网站上的图片一把搂下来(ps.均为开放资源,不涉及盗版,隐私等敏感问题)。
我看了下总共也就 400 来张图片,想着要是人工在下的话可能比写爬虫还要快,就跟她这么回了一下。
回完了,我突然想到了一位老朋友——powershell,想着,如果用 powershell 的话,可能也就几行代码就完全搞定了,也不用配环境什么的,即用即走(仅限 Windows 系统)。
那就来试试吧
思路
首先,这个网站上的图片也不是一把都加载出来的,涉及到了分页。
我在 postman 上试了一下,分页的接口也是公开的,
那这事儿就简单了啊!我这里想到了 2 条方案,
-
第一条是边请求数据,边下载,也就是,请求一页数据,然后提取图片路径属性,最后执行下载,循环到下载结束。
扫描二维码关注公众号,回复: 16812687 查看本文章 -
第二条是,我先把所有的分页数据下载到本地的 json 文件里,这样数据源就是本地的文件 json 文件,然后读取 json 文件,逐条获取图片地址进行下载。
第二种方案,等于是把整理数据和下载文件的流程分开了,最后决定用第二种方案。
下载分页数据
powshell 的请求方法其实非常简单,而实际的案例却并不具备参考价值,因为对于爬虫类应用或者脚本来说,你的目标网站往往都是不一致的,适用于我的请求代码,大概率是不适用你的,终归还是要人工参与微调。
因为涉及到目标网站的信息,我这里就不贴我的获取数据脚本了,贴一个测试脚本过来,大家可以根据实际需求来修改
# 设置API的URL和请求参数
$apiUrl = "http://example.com/api/data"
$pageSize = 100
# 发送HTTP请求并获取响应
$response = Invoke-WebRequest -Uri $apiUrl -Method Get
# 将响应转换为JSON对象
$json = $response.Content | ConvertFrom-Json
# 获取总记录数和已获取的记录数
$totalRecords = $json.total_records
$recordsReturned = $json.data.length
# 计算需要获取的页数
$pageCount = [math]::Ceiling($totalRecords / $pageSize)
# 循环获取每一页的数据,并将结果存储到数组中
$data = @()
for ($i = 1; $i -le $pageCount; $i++) {
$url = "{0}?page={1}&per_page={2}" -f $apiUrl, $i, $pageSize
$response = Invoke-WebRequest -Uri $url -Method Get
$json = $response.Content | ConvertFrom-Json
$data += $json.data
}
# 将获取到的数据转换为JSON格式,并保存到本地文件
$jsonOutput = $data | ConvertTo-Json -Depth 100
$jsonOutput | Out-File -FilePath "tt.json"
读取 json 文件下载图片
整理好后,就可以读取文件,并执行下载了,这一步也没啥好说的,我这里也直接贴几段代码得了。
$Path = 'tt.json'
$json_data = Get-content -Raw -Path $Path | ConvertFrom-Json
$cnt = 0
$save = 'C:\Users\Administrator\Desktop\tt\'
foreach ($item in $json_data.pages) {
# 目标网站缺少协议头,powershell不能自动设定缺省值下载,这里咱给它补上!
$uri = 'https:' + $item.origin_img
# 存这里
$savePath = $save + $item.pic_name
# 走你
Invoke-WebRequest -Uri $uri -OutFile $savePath $cnt++
}
Write-Output $cnt
执行起来之后,下载的效果就是这样
然后,就等着它慢慢下载完成就好了。
如果下载量大,还需要注意下载间隔,可能还要考虑自动更换代理 ip,这些就不再本篇的讨论范畴啦
总结
其实这部分的代码是最不重要的,主要还是给 Windows 的开发者在提个醒,咱系统自带的 powrshell 也是一个非常强大且高效的开发工具,在面对一些简单,重复性的工作时,可以考虑一下它,非常方便!
如果你不记得 powershell 的语法,就目前来说,这真的完全不是事儿!为啥?因为有大模型!不论是 chatgpt 还是国内的文心一言等,都可以很快速的生成出 powershell 的范例代码,我们只需要简单修改就可以了啊!非常的丝滑~
好了,就这样吧。
本文同步发表于InfoQ社区:老铁们,还记得PowerShell吗?_PowerShell_为自己带盐_InfoQ写作社区