写点什么

老铁们,还记得 PowerShell 吗?

作者:为自己带盐
  • 2023-08-28
    河北
  • 本文字数:1569 字

    阅读完需:约 5 分钟

老铁们,还记得PowerShell吗?

背景

头吃午饭的时候,同事突然发了个链接过来,问我能不能把这个网站上的图片一把搂下来(ps.均为开放资源,不涉及盗版,隐私等敏感问题)。

我看了下总共也就 400 来张图片,想着要是人工在下的话可能比写爬虫还要快,就跟她这么回了一下。

回完了,我突然想到了一位老朋友——powershell,想着,如果用 powershell 的话,可能也就几行代码就完全搞定了,也不用配环境什么的,即用即走(仅限 Windows 系统)。

那就来试试吧

思路

首先,这个网站上的图片也不是一把都加载出来的,涉及到了分页。

我在 postman 上试了一下,分页的接口也是公开的,那就简单了啊!我这里想到了 2 条方案,

  • 第一条是边请求数据,边下载,也就是,请求一页数据,然后提取图片路径属性,最后执行下载,循环到下载结束。

  • 第二条是,我先把所有的分页数据下载到本地的 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 "data.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 的范例代码,我们只需要简单修改就可以了啊!非常的丝滑~

好了,就这样吧


发布于: 刚刚阅读数: 6
用户头像

学着码代码,学着码人生。 2019-04-11 加入

是一枚,热爱技术,天赋不高,又有点轴,的猿。。

评论

发布
暂无评论
老铁们,还记得PowerShell吗?_PowerShell_为自己带盐_InfoQ写作社区