powershell 配合aria2实现简单的图片爬取
01 前言
现如今,提到爬虫,令人不得不提到Python
,确实简单,也强大,到处都可以找到教程。故而今天换换口味,用powershell
来实现,配合aria2
的强大下载功能,也很nice
。
02 正文
测试环境:Windows 11
1. 确定目标网站
这一步通过搜索引擎,很容易就可以找到感兴趣的网站,此处略。
2. 确定有订阅源地址
假设目标网站为:https://abc.com
,然后在地址栏后面加:/feed
,回车访问(即完整的路径为:https://abc.com/feed
)。
如果能够正常访问,且有内容(XML格式
),那可以,比如大概长这样:
3. 开始处理
为了方便使用,分为两个部分:powershell脚本
和bat脚本
,那么通过修改bat脚本
参数,可以双击直接运行。
(1)首先应该有aria2,【下载】好并解压。如果本机已经有,就不必下载了。
(2)powershell脚本
代码
<#
xml解析图片地址,调用aria2下载
by hokis
2024-05-29 19:36
#>
[CmdletBinding()]
Param
(
# 域名,一般以/结尾,如:https://abc.com/
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
[string]
$server,
#保存路径,如果为空,则放在 我的/图片 下
[string]
$savePath = '',
#aria2.exe所在目录
[Parameter(Mandatory=$true)]
[string]
$aria2Path
)
function Invoke-DownWithAria2
{
[CmdletBinding()]
Param
(
# 文件列表,格式:ArrayList 里面放一个2个元素的数组,第一个是URL,第二个是文件名
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
[System.Collections.ArrayList]
$fileList,
#referer
[string]
$refer,
[string]
$newSavePath,
#aria2路径
[string]
$aria2Path = ''
)
Begin
{
}
Process
{
#配置模板
$conf = @'
## 日志
log-level=error
#log=/PATH/.aria2/aria2.log
#控制台日志
console-log-level=error
## 文件保存相关 ##
# 文件保存目录
#dir=
{0}
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
disk-cache=32M
# 断点续传
continue=true
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=falloc
## 下载连接相关 ##
# 最大同时下载任务数, 运行时可修改, 默认:5
max-concurrent-downloads=10
# 整体下载速度限制, 运行时可修改, 默认:0(不限制)
max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0(不限制)
#max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0(不限制)
#max-overall-upload-limit=0
# 单个任务上传速度限制, 默认:0(不限制)
#max-upload-limit=0
# 禁用IPv6, 默认:false
disable-ipv6=true
# 客户端伪装
user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
#referer=
{1}
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M
# 单个任务最大线程数, 添加时可指定, 默认:5
# 建议同max-connection-per-server设置为相同值
split=20
# 读取下载任务
#input-file=
{2}
'@
if(-not $fileList -or $fileList.Count -lt 1){
Write-Warning 'file should not be null'
return
}
$tempFName = [System.IO.Path]::GetRandomFileName()
$tempDownFile = Join-Path -Path $env:TEMP -ChildPath $tempFName
Write-Verbose ('down file :' + $tempDownFile<