powershell 配合aria2实现简单的图片爬取

news2024/11/8 13:49:54

powershell 配合aria2实现简单的图片爬取

01 前言

现如今,提到爬虫,令人不得不提到Python,确实简单,也强大,到处都可以找到教程。故而今天换换口味,用powershell来实现,配合aria2的强大下载功能,也很nice

02 正文

测试环境:Windows 11

1. 确定目标网站

这一步通过搜索引擎,很容易就可以找到感兴趣的网站,此处略。

2. 确定有订阅源地址

假设目标网站为:https://abc.com,然后在地址栏后面加:/feed,回车访问(即完整的路径为:https://abc.com/feed)。
如果能够正常访问,且有内容(XML格式),那可以,比如大概长这样:
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)

        $sb = [System.Text.StringBuilder]::new()

        foreach($f in $fileList){
            #如果不是标准的http或https开头,则不处理
            if(-not $f[0].StartsWith('http://') -and -not $f[0].StartsWith('https://')){
                continue
            }
            [void]$sb.AppendLine($f[0]).AppendLine(' dir='+($f[1] -replace '\\','/')).AppendLine(' out='+$f[2])
        }

        [System.IO.File]::WriteAllText($tempDownFile,$sb.ToString(),[System.Text.UTF8Encoding]::new($false))


        $referStr = ''
        if(-not [string]::IsNullOrEmpty($refer)){
            $referStr = ('referer={0}' -f $refer)
        }

        $inputStr = ('input-file={0}' -f ($tempDownFile -replace '\\','/'))
        
        $pathStr = ('dir={0}' -f ($newSavePath -replace '\\','/'))

        $newConf = ($conf -f $pathStr,$referStr,$inputStr)

        $tempFName = ([System.IO.Path]::GetRandomFileName() -split '\.')[0]
        $tempConfFile = Join-Path -Path $env:TEMP -ChildPath ($tempFName+'.conf')

        Write-Verbose ('down conf :' + $tempConfFile)

        [System.IO.File]::WriteAllText($tempConfFile,$newConf,[System.Text.UTF8Encoding]::new($false))
        
        $aria2File = Join-Path -Path $aria2Path -ChildPath 'aria2c.exe'
        if((Test-Path -Path $aria2File -PathType Leaf)){
            $cmdStr = ('"{0}" --conf-path="{1}" --quiet' -f $aria2File,($tempConfFile -replace '\\','/'))
            Write-Verbose ("cmd:" + $cmdStr)
            &cmd.exe /c $cmdStr
        }

        #移除文件
        Remove-Item -Path $tempConfFile -Force | Out-Null
        Remove-Item -Path $tempDownFile -Force | Out-Null
    }
    End
    {
    }
}


#验证参数
if([string]::IsNullOrEmpty($server)){
    Write-Host 'Invalid server...'
    exit
}


if([string]::IsNullOrEmpty($aria2Path)){
    Write-Host 'Invalid aria2Path...'
    exit
}


if(-not (Test-Path -Path $aria2Path -PathType Container)){
    Write-Host 'Not exists aria2Path...'
    exit
}


#保存路径
if([string]::IsNullOrEmpty($savePath)){
    #保存在 图片 下
    $savePath = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::MyPictures)
}


#域名
if(-not $server.EndsWith('/')){
    $server += '/'
}

#xml网址,默认是 /feed
$xmlUrl = $server+'feed'

#图片正则,根据情况进行修改
$reg = [System.Text.RegularExpressions.Regex]::new('<figure.*?<img.*?src=["''](.*?)["''].*?/><\/figure>')

#日期
$ts = Get-Date -Format 'yyyy-MM-dd'

#以日期命名的目录
$newSavePath = Join-Path -Path $savePath -ChildPath $ts

#创建目录
if(-not (Test-Path -Path $newSavePath -PathType Container)){
    mkdir -Path $newSavePath -Force | Out-Null
}

$resp = Invoke-RestMethod -Uri $xmlUrl

if(-not $resp){
    Write-Host 'Get page error...'
    exit
}


#数据
$list = [System.Collections.ArrayList]::new()

Write-Host 'Parsing data...'

#文件名中的非法字符
$chs = [System.IO.Path]::GetInvalidFileNameChars()

#遍历
foreach($item in $resp){
    #标题
    $title = $item.title
    #内容
    $str = $item.encoded.'#cdata-section'
    #匹配
    $ms = $reg.Matches($str)

    if($ms -and $ms.Count -gt 0){
            
        #每个item有自己的名称

        #去掉非法字符
        foreach($c in $chs){
            $title = $title.Replace($c,[char]32)
        }

        #以标题创建文件夹
        $curPath = Join-Path $newSavePath -ChildPath $title

        #序号
        $idx = 0
        #[System.Text.RegularExpressions.Match]$m = $null
        foreach($m in $ms){
            #生成一个guid
            $gid = ([guid]::NewGuid().ToString() -replace '\-','')

            #捕获分组
            $url = $m.Groups[1].ToString().Trim()

            #后缀名
            $ext = ($url -split '\.')[-1]

            #文件名
            $baseName =('{0}_{1}.{2}' -f $idx,$gid,$ext)
            
            [void]$list.Add(@($url,$curPath,$baseName))

            $idx++
        }
    }else{
        Write-Host ('【{0}】No matches...' -f $title)
    }

}

if($list.Count -gt 0){
    Write-Host 'Start to download...'
    #开始下载
    Invoke-DownWithAria2 -fileList $list -refer $server -newSavePath $newSavePath -aria2Path $aria2Path

}else{
    Write-Host 'No match data...'
}


Write-Host ('Done at:' + (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'))

注意:

  • 代码另存为 parse-xml.ps1,假设全路径为:C:\script\parse-xml.ps1,需注意修改bat脚本中的对应路径
  • 匹配图片路径是通过正则来的,需要根据不同的实际情况进行修改,应确保图片路径在第1个分组的位置:
    $reg = [System.Text.RegularExpressions.Regex]::new(‘<figure.*?<img.*?src=["''](.*?)["''].*?/><\/figure>’)
  • aria2是临时生成的配置,下载完成后会自动删除,不会影响原来的配置。

(3)bat脚本部分

@echo off
chcp 65001
title 图片下载
REM cls
REM 目标网址
set server=https://abc.com/
REM aria2所在路径
set aria2Path=C:\aria2
REM 图片保存路径(可以为空,空则保存到 我的/图片 下)
REM set savePath=
set savePath=C:\Down
echo.
REM 注意修改.ps1 文件全路径
powershell.exe -file "C:\script\parse-xml.ps1" -server "%server%" -aria2Path "%aria2Path%" -savePath "%savePath%"
echo.
echo.

pause

使用脚本注意:

  • 需修改目标网站aria2所在路径图片保存路径
  • 代码另存为 run.bat,双击运行即可
  • 运行成功后,会在图片保存路径下,新增一个以当前日期命名的文件夹,所有下载的东西放在里面

运行成功:
成功

上班累了,洗把脸精神一下吧。

03 后记

仅供参考学习使用,爬虫技术慎用也。

欢迎留言交流~
------END------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1714650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开发接口图形图像:【@ohos.window (窗口)】

窗口 窗口提供管理窗口的一些基础能力&#xff0c;包括对当前窗口的创建、销毁、各属性设置&#xff0c;以及对各窗口间的管理调度。 该模块提供以下窗口相关的常用功能&#xff1a; [Window]&#xff1a;当前窗口实例&#xff0c;窗口管理器管理的基本单元。[WindowStage]&…

【单片机毕设选题】-智能语音控制风扇

一. 系统功能 此设计采用STM32和SU-03T离线语音模块来控制风扇, 主要功能如下: 1. 通过DHT11温湿度模块来采集环境温湿度。 2. 通过SU-03T语音模块来控制风扇启停加减速等。 3. 通过OLED显示系统状态。 4. 可以通过按键控制风扇启停加减速等。 5. 通过蓝牙模块监视系统状…

内网安全之证书模版的管理

证书模板 Certificate templates 是 CA 证书颁发机构的一个组成部分&#xff0c;是证书策略中的重要元素&#xff0c;是用于证书注册、使用和管理的一组规则和格式。当 CA 收到对证书的请求时&#xff0c;必须对该请求应用一组规则和设置&#xff0c;以执行所请求的功能&#x…

【创作活动】探索 GPT-4o:下一代语言模型的技术革命

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Thingsboard规则链:Customer Details节点详解

在物联网&#xff08;IoT&#xff09;平台Thingsboard的规则引擎体系中&#xff0c;Customer Details节点是一个功能强大的组件&#xff0c;它专为处理与客户&#xff08;Customer&#xff09;实体相关的综合信息而设计。这个节点不仅能够读取客户的基本属性&#xff0c;还能提…

VBA技术资料MF159:实现某个区域内的数据滚动

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【微服务】springboot 构建docker镜像多模式使用详解

目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …

F. Longest Strike[双指针详解]

Longest Strike 题面翻译 给你一个长度为 n n n 的序列 a a a 和一个整数 k k k&#xff0c;你要求一个区间 [ l , r ] [l,r] [l,r] 满足&#xff1a; 对于任何整数 x ∈ [ l , r ] x∈[l,r] x∈[l,r]&#xff0c; x x x 在 a a a 中的出现次数不少于 k k k 次。最大…

【Postman接口测试】第四节.Postman接口测试项目实战(上)

文章目录 前言一、项目介绍 1.1 项目界面功能介绍 1.2 项目测试接口介绍 1.3 项目测试接口流程二、HTTP协议三、接口测试中接口规范四、项目合同新增业务介绍 4.1 登录接口调试 4.1 登录接口自动关联 4.1 添加课程接口调试 4.1 上传合同…

排序(前篇)

1.排序的概念及其运用 2.插入排序的概念及实现 3.希尔排序的概念及实现 4.选择排序概念及实现 总代码&#xff08;对比各个排序在大量的数据情况排序所化的时间&#xff09;&#xff1a; 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使…

linux中逻辑卷管理与扩展

逻辑卷管理与扩展 逻辑卷 作用&#xff1a; 1.整合分散的空间2.空间支持扩大 逻辑卷制作过程&#xff1a;将众多的物理卷&#xff08;PV&#xff09;组建成卷组&#xff08;VG&#xff09;&#xff0c;再从卷组中划分出逻辑卷&#xff08;LV&#xff09; 逻辑卷的逻辑思路 …

前端项目开发,3个HTTP请求工具

这一小节&#xff0c;我们介绍一下前端项目开发中&#xff0c;HTTP请求会用到的3个工具&#xff0c;分别是fetch、axios和js-tool-big-box中的jsonp请求。那么他们都有哪些小区别呢&#xff1f;我们一起来看一下。 目录 1 fetch 2 axios 3 js-tool-big-box 的 jsonp 请求 …

一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型 二叉树 二叉树中的节点最多只能有两个子节点&#xff0c;一个是左侧子节点&#xff0c;另一个是右侧子节点 二叉搜索树 二叉搜索树&#xff08;BST&#xff09;是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&…

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第74讲。 扎气球最高分&…

IntelliJ IDEA内置自带Maven的使用注意事项

一、内置自带Maven的位置 IDEA中是有自带Maven的,虽然可能不够个性化,不太好用,但是如果知道怎么设置,还是能自定义一点的。它作为IDEA的自带插件,位置在IDEA所在目录的“\plugins\plugins\maven\lib\maven3\”文件夹中。 二、本地仓库位置 因为Maven主要功能就是统一下…

MoE模型大火,源2.0-M32诠释“三个臭皮匠,顶个诸葛亮”!

文 | 智能相对论 作者 | 陈泊丞 近半年来&#xff0c;MoE混合专家大模型彻底是火了。 在海外&#xff0c;OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架构。而在国内&#xff0c;浪潮信息也刚刚发布了基于MoE架构的“源2.0-M3…

无人机操作界面来了,起点就很高呀。

无人机操作界面设计需要考虑以下几个方面&#xff1a; 易用性&#xff1a;无人机操作界面应该简单直观&#xff0c;易于操作和理解。操作按钮和控键应该布局合理&#xff0c;易于触摸或点击。重要的操作功能应该易于找到和使用&#xff0c;避免用户迷失或困惑。实时反馈&#…

【Uniapp微信小程序】自定义水印相机、微信小程序地点打卡相机

效果图 template 下方的image图片自行寻找替换! <template><view><camerav-if="!tempImagePath && cameraHeight !== 0":resolution="high":frame-size="large":device-position="device":flash="flas…

RAID配置实战

概念 raid磁盘阵列&#xff1a;可以用不同的硬盘分区&#xff0c;组成一个逻辑上的硬盘。具有高可用 raid级别&#xff1a; raid0 &#xff1a;条带化存储&#xff1a;数据分散在多个物理硬盘上的存储方式。利用多个磁盘并行读取和写入。存储性能和读写性能是最好的。没有冗…

朗读亭主要作用有哪些?

朗读亭的主要作用有以下几个方面&#xff1a; 1. 提供朗读服务&#xff1a;朗读亭是一个专门的场所&#xff0c;提供给人们朗读的环境和场地。人们可以在朗读亭中选择自己喜欢的书籍或文章&#xff0c;并通过朗读将其表达出来。这样可以帮助人们提高朗读能力&#xff0c;增强自…