老铁们,还记得 PowerShell 吗?

背景

头吃午饭的时候,同事突然发了个链接过来,问我能不能把这个网站上的图片一把搂下来(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写作社区

猜你喜欢

转载自blog.csdn.net/juanhuge/article/details/132536497
今日推荐