Powershell 简易爬虫,提取种子网站的磁力链接

news2025/1/16 11:09:23

目录

  • 一. 需求
  • 二. 分析
    • 2.1 思路分析
    • 2.2 技术点
  • 三. 代码
  • 四. 效果


一. 需求

⏹有网站如下所示,先要求从按照关键词搜索到的网页中,提取出所有的磁力链接。

在这里插入图片描述


二. 分析

2.1 思路分析

  • 打开网页之后,从网页中先提取出所有的标题相关的url
  • 然后再打开所有提取到的url
  • 再从每一个新打开的页面中获取磁力链接所在a标签的href属性值

2.2 技术点

  • Invoke-WebRequest:发送网络请求
  • workflow
    • workflow 是一种特殊的语法结构,用于创建并发执行的工作流。工作流允许你定义一系列步骤,这些步骤可以同时执行或并行执行,适用于需要处理大量数据或需要在多个计算资源上执行任务的情况。
    • 在 foreach -parallel 循环内并行执行多个任务,从而加快处理速度。
    • InlineScript { ... }:内联脚本块用于在工作流中执行本地 PowerShell 脚本或命令。
  • Add-Type -Path ".\xxx.dll":用于引入第三方dll
  • New-Object HtmlAgilityPack.HtmlDocument:用于创建引入的库中的对象
    • HtmlAgilityPack:用于解析html文本的第三方库
    • 官网:https://github.com/zzzprojects/html-agility-pack/releases/tag/v1.11.61
    • 下载源码后,手动编译 HtmlAgilityPack.Net40,得到 HtmlAgilityPack.dll
  • .DocumentNode.SelectSingleNode:用于配合XPATH语法解析html文本
  • [System.Uri]::EscapeDataString($搜索关键词)
    • 搜索的关键字是中文,实际发送请求时,需要把中文转换

三. 代码

param(
    # 参数必须输入
    [Parameter(Mandatory)]
    # 当未添加 -name 参数时,脚本会报错
    [string]$搜索关键词
)

# 域名
$domain = 'http://www.kisssub.org'
# 搜索关键字,通过 [System.Uri]::EscapeDataString 对汉字进行编码
$enCoded_search_keyword = [System.Uri]::EscapeDataString($搜索关键词)
# 请求地址
$request_url = "$($domain)/search.php?keyword=$($enCoded_search_keyword)"

# session
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
$session.Cookies.Add((New-Object System.Net.Cookie("user_script_url", "%2F%2F1.acgscript.com%2Fscript%2Fmiobt%2F4.js%3F3", "/", "www.kisssub.org")))
$session.Cookies.Add((New-Object System.Net.Cookie("user_script_rev", "20181120.2", "/", "www.kisssub.org")))

# 请求头
$request_header = @{
    "Accept"="text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
    "Accept-Encoding"="gzip, deflate"
    "Accept-Language"="zh-CN,zh;q=0.9,ja;q=0.8,en;q=0.7,zh-TW;q=0.6"
    "Cache-Control"="no-cache"
    "Pragma"="no-cache"
    "Upgrade-Insecure-Requests"="1"
}

# 获取磁力链接所在页面的URL
function Get_WEB_URL {

    param (
        [string]$url
        , [Microsoft.PowerShell.Commands.WebRequestSession]$session
        , [PSCustomObject]$header
    )

    # 发送网络请求
    $response = Invoke-WebRequest -UseBasicParsing `
    -Uri $url `
    -WebSession $session `
    -Headers $header

    # 若响应code不是200,则证明网络连接失败
    if ($response.StatusCode -ne 200) {
        Write-Host "网络请求失败..."
        return 
    }

    # 提取磁力链接所在页面的url
    $target_web_urls = $response.Links.outerHTML | ForEach-Object {
		
		# 若不是对应页面的url,则跳过
        if (-not ($_ -match ".*show.*.html")) {
            return
        }

        # 提取出目标页面的url
        $_.split(" ")[1].replace("href=`"", "$($domain)/").replace("`"", "")
    }
    return $target_web_urls
}

# 指定url,session,header 发送网络请求
$target_web_urls = Get_WEB_URL -url $request_url -session $session -header $request_header
$target_web_urls | Out-Host

<#
    ⏹创建一个workflow,用于并发处理多任务
#>
workflow Get-WebContent {

    param (
        [string[]] $urls
    )

    <#
        ⏹foreach -parallel 是 Workflow 中用来并行处理迭代集合的语法
        每个 $url 都会并行处理,即同时发送多个请求以提高效率
    #>
    foreach -parallel ($url in $urls) {

        # 睡眠1秒
        # Start-Sleep -Seconds 1

        # ⏹InlineScript 块允许在 Workflow 中执行本地的 PowerShell 脚本或命令
        $web_response = InlineScript {
            # 发送网络请求
            $webRequest = Invoke-WebRequest -UseBasicParsing -Uri $using:url -Headers $my_header
            # 获取页面上的所有url连接
            $webRequest.Links.outerHTML
        }

        # PSCustomObject 是自定义对象的数据类型
        [PSCustomObject]@{
            Content = $web_response
        }
    }
}

Write-Host "⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓提取到的磁力链接如下⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓" -ForegroundColor Red

# 引入 HtmlAgilityPack.dll 依赖库
Add-Type -Path ".\HtmlAgilityPack.dll"
# 创建 HtmlDocument对象 用于解析html文本
$htmlDoc = New-Object HtmlAgilityPack.HtmlDocument

# 调用workflow,获取响应
$results = Get-WebContent -urls $target_web_urls
$results.Content | ForEach-Object {

    # 如果不是磁力链接的url,就跳过
    if (-not ($_ -match ".*ref=`"magnet.*")) {
        return
    }

    # 将含有磁力链接的html文本放到 HtmlDocument对象 中
    $htmlDoc.LoadHtml($_)

    <#
        ⏹通过xpath语法提取到a标签对象
        SelectSingleNode
            只能提取单节点
        SelectNodes
            可以提取多个节点
    #>
    $aEelement = $htmlDoc.DocumentNode.SelectSingleNode("//a[@id='magnet']")

    <#
        ⏹根据id获取href属性(磁力链接内容)
        第2个参数是默认参数
    #>
    $aEelement.GetAttributeValue("href", "")
} | Get-Unique

# 暂停
Pause

四. 效果

  • 只是简易爬虫,并未做IP代理池和cookie池等防反扒机制
  • 频繁使用,在一段时间内会无法访问该网站

在这里插入图片描述

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

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

相关文章

XXL-JOB分布式任务调度框架详解(全网最详细!!!)

引言 第一部分&#xff1a;XXL-JOB概述 第二部分&#xff1a;架构与组件 第三部分&#xff1a;使用教程 第四部分&#xff1a;源码分析 第五部分&#xff1a;最佳实践 引言 在分布式系统中&#xff0c;任务调度是一项基础而又关键的服务&#xff0c;它涉及到定时任务的管理…

如何玩单机版:QQ音速

前言 我是研究单机的老罗&#xff0c;今天教大家带来一款怀旧游戏QQ音速 的教程。根据我的文章&#xff0c;一步一步就可以玩了。 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; QQ音速 搭建教程 此…

甘特图:项目管理中的任务分解工具

项目管理中是将大的项目目标划分为各个小阶段任务&#xff0c;将复杂的项目拆分为简单的任务&#xff0c;它可让事情依照一定规则或关系&#xff0c;通过一层一层来分解&#xff0c;这样要做的目标可以变为小任务。 任务分解的标准 管理项目时&#xff0c;要学会分解任务&am…

【计算机毕业设计】061互助学习微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

微波消解罐TFM内罐适配新拓XT9906微波消解仪主控罐副罐

我厂可定制的各个厂家微波消解仪内罐如下&#xff1a; 美国CEM、迈尔斯通、安东帕、耶拿、上海新仪、上海新拓、上海屹尧、北分瑞利、北京祥鹄、山东海能等&#xff0c;我厂特殊研发的生产工艺保证特别厂家&#xff08;如CEMMARS5、MARS6、XPRESS&#xff09;的超长罐的光洁度…

Quectel EM05-CE 模块测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

windows下启动redisSentinel

如果已经安装redis的就继续往下看&#xff0c;还没安装redis&#xff0c;先安装一下redis 安装完redis之后&#xff0c;打开redis的目录。 新建一个sentinel.conf文件 # 端口号 port 26379# Sentinel 监控的主节点信息&#xff0c;格式为 <master-name> <ip> &l…

用Lobe Chat部署本地化, 搭建AI聊天机器人

Lobe Chat可以关联多个模型&#xff0c;可以调用外部OpenAI, gemini,通义千问等, 也可以关联内部本地大模型Ollama, 可以当作聊天对话框消息框来集成使用 安装方法参考&#xff1a; https://github.com/lobehub/lobe-chat https://lobehub.com/zh/docs/self-hosting/platform/…

R语言数据分析案例39-合肥市AQI聚类和多元线性回归

一、研究背景 随着全球工业化和城市化的迅速发展&#xff0c;空气污染问题日益凸显&#xff0c;已成为影响人类健康和环境质量的重大挑战。空气污染不仅会引发呼吸系统、心血管系统等多种疾病&#xff0c;还会对生态系统造成不可逆转的损害。因此&#xff0c;空气质量的监测和…

第3章:数据结构

树 对稀疏矩阵的压缩方法有三种&#xff1a; 1、三元组顺序表 2、行逻辑连接的顺序表 3、十字链表 同义词才会占用同个位置&#xff0c;从而需要进行多次比较。这些关键字的第一个可以不是e的同义词&#xff0c;可以是排在e之前的关键字正好占了那个位置。 Dijkstra算法主要特点…

【想起就补】整理了一些SSH中常用的命令

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、常用命令类型2.1 远程登录相关2.2 文件操作命令2.3 权限和所有权操作命令2.4 文…

强化学习的数学原理:课程梗概与基本概念

Overview 从上图可以看见&#xff0c;整个强化学习被分为两个板块&#xff1a;一个是基础的工具&#xff0c;一个是基本的算法和方法。 基础工具包括&#xff1a;基本的概念、贝尔曼公式、贝尔曼最优公式。 算法和方法包括&#xff1a;值迭代、策略迭代、蒙特卡洛方法、时序差…

【初阶数据结构】深入解析队列:探索底层逻辑

&#x1f525;引言 本篇将深入解析队列:探索底层逻辑&#xff0c;理解底层是如何实现并了解该接口实现的优缺点&#xff0c;以便于我们在编写程序灵活地使用该数据结构。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#…

四.iOS核心动画 - 图层的视觉效果

引言 在前几篇博客中我们讨论了图层的frame,bounds,position以及让图层加载图片。但是图层事实上不仅可以显示图片&#xff0c;或者规则的矩形块&#xff0c;它还有一系列内建的特性来创建美丽优雅的页面元素。在这篇博客中我们就来探索一下CALayer的视觉效果。 视觉效果 图…

喜讯!安全狗荣获“2023年网络安全技术支撑优秀单位”称号

6月6日&#xff0c;由中共厦门市委网络安全和信息化委员会办公室&#xff08;以下简称“厦门市委网信办”&#xff09;主办的2023年网络安全技术支撑优秀单位颁奖仪式在厦门成功举行。 作为国内云原生安全领导厂商&#xff0c;安全狗受邀出席此次活动。 会上&#xff0c;安全狗…

DEBOPIE框架:打造最好的ChatGPT交易机器人

本文介绍了如何利用 DEBOPIE 框架并基于 ChatGPT 创建高效交易机器人&#xff0c;并强调了在使用 AI 辅助交易时需要注意的限制以及操作步骤。原文: Build the Best ChatGPT Trading Bots with my “DEBOPIE” Framework 如今有大量文章介绍如何通过 ChatGPT 帮助决定如何以及在…

做工作室项目重要还是运营重要

做工作室项目重要还是运营重要&#xff0c;先说答案&#xff0c;项目好是基础&#xff0c;然后才能谈运营&#xff01; 90%的工作室活不过一年&#xff0c;这句话是有数据支撑的&#xff0c;因为就工商注册的公司而言&#xff0c;一年内倒闭的就是这么个数据&#xff0c;所以工…

在AvaotaA1全志T527开发板上烧录AvaotaOS固件

烧写到 TF 卡上 材料准备 首先需要准备的材料有: SD-Card Formatter&#xff1a;balenaEtcherAvaota Pi - A1开发板 x1TF-Card ( 不小于4Gb ) x112V-DC电源适配器 x1TF读卡器 x1USBTTL Splitter x1&#xff08;可选&#xff09;HDMI 采集卡 x1 &#xff08;可选&#xff09;…

input调用手机摄像头实现拍照功能vue

项目需要一个拍照功能&#xff0c;实现功能如下图所示:若使用浏览器则可以直接上传图片&#xff0c;若使用手机则调用手机摄像头拍照。 1.代码结构 <!--input标签--> <input ref"photoRef"type"file"accept"image/*"capture"envir…

DM表级触发器

可以理解为行变动级 触发体中写逻辑 这是表修改时调用存储过程 感谢大哥分享: https://blog.csdn.net/WuLex/article/details/83181449 感谢大哥分享: https://blog.csdn.net/ChennyWJS/article/details/131913198