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

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 hokis2024-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 $tempFNameWrite-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-NullRemove-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 $xmlUrlif(-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 = $nullforeach($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.mzph.cn/pingmian/19177.shtml

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

相关文章

目标检测 | R-CNN、Fast R-CNN与Faster R-CNN理论讲解

☀️教程&#xff1a;霹雳吧啦Wz ☀️链接&#xff1a;https://www.bilibili.com/video/BV1af4y1m7iL?p1&vd_sourcec7e390079ff3e10b79e23fb333bea49d 一、R-CNN R-CNN&#xff08;Region with CNN feature&#xff09;是由Ross Girshick在2014年提出的&#xff0c;在PAS…

Qt 配置Eigen矩阵库 - 并简单测试

Qt 配置Eigen矩阵库 - 并简单测试 引言一、在Qt中配置Eigen二、低通Demo源码三、参考链接以及其他 引言 Eigen是一个开源的C模板库&#xff0c;提供了线性代数和矩阵运算的功能。它被设计为一个高性能、可扩展和易用的库&#xff0c;可以用于科学计算、机器学习和计算机图形学等…

服务器感染了. rmallox勒索病毒,如何确保数据文件完整恢复?

导言&#xff1a; 近年来&#xff0c;随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。其中&#xff0c;勒索病毒作为一种严重的网络威胁&#xff0c;对个人和企业数据造成了巨大的威胁。本文将重点介绍.rmallox勒索病毒的特点、传播途径以及应对策略&#xff0c;旨…

【LeetCode算法】第94题:二叉树的中序遍历

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树的中序遍历。访问二叉树的左子树&#xff0c;再访问二叉树的根节点&#xff0c;最后访问二叉树的右叉树。 2. 代码&#xff1a; void order(struct TreeNode* r…

文心智能体平台丨创建你的四六级学习小助手

引言 在人工智能飞速发展的今天&#xff0c;我们迎来了文心智能体平台。该平台集成了最先进的人工智能技术&#xff0c;旨在为用户提供个性化、高效的学习辅助服务。今天&#xff0c;我们将向大家介绍如何利用文心智能体平台&#xff0c;创建一个专属于你的四六级学习小助手。…

Scikit-Learn随机森林回归

Scikit-Learn随机森林回归 1、随机森林1.1、集成学习1.2、Bagging方法1.3、随机森林算法1.4、随机森林的优缺点2、Scikit-Learn随机森林回归2.1、Scikit-Learn随机森林回归API2.2、随机森林回归实践(加州房价预测)1、随机森林 随机森林是一种由决策树构成的集成算法,它在大多…

初探Flask:Pycharm社区版创建Flask项目

文章目录 一、创建工程二、引入Flask库1.使用命令行安装Flask2.在PyCharm中安装Flask 三、创建Flask框架基本文件四、运行项目 本文将带您一步步创建一个简单的Flask项目&#xff0c;包括设置Python环境、安装Flask库以及创建基本的项目结构。 一、创建工程 首先&#xff0c;确…

云原生网关 MSE-Higress

云原生网关 MSE-Higress 什么是云原生网关MSEMSE测评产品文档产品能力产品控制台 MSE与其他网关 什么是云原生网关MSE 在体验云原生网关 MSE-Higress功能之前&#xff0c;先了解一下什么是云原生网关 MSE&#xff0c;简单的说就是MSE就是遵循开源 Ingress/Gateway API 标准的下…

【java程序设计期末复习】chapter2 基本数据类型与数组

基本数据类型与数组 一&#xff0c;标识符和关键字 标识符 定义 用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符&#xff0c;简单地说&#xff0c;标识符就是一个名字 。 性质 &#xff08;1&#xff09;标识符由字母、下划线、美元符号和…

008-Linux后台进程管理(作业控制:、jobs、fg、bg、ctrl + z、nohup)

文章目录 前言 1、& 2、ctrl z 3、jobs 4、fg&#xff1a;将后台进程调到前台执行 5、bg&#xff1a;将一个暂停的后台进程变为执行 6、&和nohup 总结 前言 有时候我们需要将一个进程放到后台去运行&#xff0c;或者将后台程序切换回前台&#xff0c;这时候就…

03 Prometheus+Grafana可视化配置

03 PrometheusGrafana可视化配置 大家好&#xff0c;我是秋意零。接上篇Prometheus入门安装教程 grafana官网下载安装包比较慢&#xff0c;如果没有魔法。可关注公众号【秋意零】回复101获取 Grafana官网下载&#xff1a;https://grafana.com/grafana/download 这里采用的二进制…

使用C语言实现学生信息管理系统

前言 在我们实现学生信息管理系统的过程中&#xff0c;我们几乎会使用到C语言最常用最重要的知识&#xff0c;对于刚学习完C语言的同学来说是一次很好的巩固机会&#xff0c;其中还牵扯到数据结果中链表的插入和删除内容。 实现学生信息管理系统 文件的创建与使用 对于要实现…

【小技巧】Keil C51 报错“*** ERROR L107: ADDRESS SPACE OVERFLOW****

软件&#xff1a;Keil C51 C51V961版本 电脑&#xff1a;Win10 报错提示&#xff1a; compiling System.c... linking... *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: ?DT?LCD LENGTH: 0034H Program Size: data174.0 xdata17 code1205 Target not create…

100个投资者99个选择使用这款EA,WeTrade发现1个事实

为什么100个投资者会有99个选择使用这款EA&#xff0c;是因为这款EA能提供两个版本吗?是因为能控制风险吗?都不是&#xff0c;WeTrade发现1个事实才是这么多投资者选择的原因&#xff0c;那就是能实现100%的盈利率。 我们都知道外汇狙击手EA提供两种版本&#xff0c;分别是标…

MVC和Filter

目录 MVC和三层架构模型的联系 Filter 概念 作用 应用场景 步骤 简单入门 MVC和三层架构模型的联系 m-->model即模型是三层架构模型的业务层&#xff08;service&#xff09;和持久层(dao) v-->views即视图是三层架构模型的表现层(web) c-->controller即控制器也…

【SpringMVC】_SpringMVC项目返回HTML与JSON

目录 1. SpringMVC项目返回HTML页面 2. SpringMVC项目返回JSON 2.1 程序演示 2.2 关于响应的Content-Type 2.2.1 接口为对象 2.2.2 接口为String 2.2.3 接口为Map 本专栏已介绍&#xff1a; 返回静态页面&#xff1a; 【Spring MVC】_SpringMVC项目返回静态页面_mvc 返…

一种基于高德Web API实现沿路画面的实现

概述 本文在mapboxGL框架下&#xff0c;分享一种基于高德Web API实现沿路画面的实现。 实现效果 实现 1. 实现思路 通过点击获取路径的起点和终点&#xff1b;将多次规划路径的结果连成一条线&#xff1b;当鼠标点击回到第一个点的时候结束绘制&#xff1b;绘制结束后将路径…

写代码之前一定要提前想好思路

就和写数学题目一样&#xff0c;在做题目之前要先把思路确立下来。可能是我早年做数学的时候老是着急做题目没怎么分析过题目&#xff0c;把这个习惯不自觉地代入了代码的写入当中。习惯的养成使得我即使明白了自己的问题也依然会不断的犯错&#xff0c;看来只有刻意地提醒自己…

【MATLAB源码-第217期】基于matlab的16QAM系统相位偏移估计HOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 高阶统计量&#xff08;HOS&#xff09;频偏估计算法 高阶统计量&#xff08;Higher Order Statistics, HOS&#xff09;频偏估计算法是一种先进的信号处理技术&#xff0c;广泛应用于现代数字通信系统中&#xff0c;以应对…

如何快速申请免费单域名SSL证书

申请免费的单域名SSL证书通常涉及以下几个步骤&#xff0c;虽然具体细节可能会根据不同的证书颁发机构(CA)有所差异。以下是通用的申请流程&#xff1a; 1.选择证书颁发机构&#xff1a; 访问提供免费单域名SSL证书的证书颁发机构网站&#xff0c;例如JoySSL等。 2.注册账号…