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

目录

  • 一. 需求
  • 二. 分析
    • 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.mfbz.cn/a/759907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sqlmap注入详解

免责声明:本文仅做分享... 目录 1.介绍 2.特点 3.下载 4.帮助文档 5.常见命令 指定目标 请求 HTTP cookie头 HTTP User-Agent头 HTTP协议的证书认证 HTTP(S)代理 HTTP请求延迟 设定超时时间 设定重试超时 设定随机改变的参数值 利用正则过滤目标网址 避免过多的…

神经网络在机器学习中的应用:手写数字识别

机器学习是人工智能的一个分支&#xff0c;它使计算机能够从数据中学习并做出决策或预测。神经网络作为机器学习的核心算法之一&#xff0c;因其强大的非线性拟合能力而广泛应用于各种领域&#xff0c;包括图像识别、自然语言处理和游戏等。本文将介绍如何使用神经网络对MNIST数…

AI Agent:技术原理与未来趋势

在人工智能的快速发展中&#xff0c;AI Agent作为一项创新技术&#xff0c;正逐渐成为研究和应用的热点。AI Agent不仅仅是执行命令的程序&#xff0c;它们能够感知环境、做出决策并采取行动&#xff0c;展现出类似人类的群体协作能力。本文将探讨AI Agent的技术原理、开源框架…

Animate软件基础:选择图层或文件夹

在使用Animate软件中对图层或图层文件进行操作时&#xff0c;选择某个图层或某个图层文件夹也是基础操作。 如果选择图层或图层文件夹&#xff0c;可以按如下方法进行操作&#xff1a; 单击时间轴中图层或文件夹的名称。 单击选择一个图层 单击选择一个图层文件夹 在时间轴中…

vue2实例实现一个初步的vuex

vue2实例实现一个初步的vuex 实现源码&#xff1a;vue2-review 1.App.vue 2.store目录下的index.js 3.效果 微信公众号&#xff1a;刺头拾年

vue2 element ui 表单 动态增加表单项 表单项值不可重复 select多选

案例 <template><el-form :model"form" ref"form" label-width"70px"><el-form-item><el-button icon"el-icon-plus" type"primary" plain click"add">新增</el-button><el-b…

乌兰图雅“不躲汉子”躲小人 ,一起守护社会正能量!

无论是在庆祝中南建交25周年文艺晚会、马中建交50周年文化艺术交流盛典等国际舞台上&#xff0c;还是在2024“花开四季 ”北京演唱会、“唱响北疆”内蒙古流行音乐演唱会等国内舞台上&#xff0c;乌兰图雅的《套马杆》都是最受观众欢迎的歌曲之一&#xff0c;因为热情奔放的《套…

DS18B20单总线数字温度传感器国产替代MY18E20 MY1820 MY18B20Z MY18B20L(一)

前言 DS18B20是全球第一个单总线数字温度传感器&#xff0c;推出时间已经超过30年&#xff0c;最早由美国达拉斯半导体公司推出&#xff0c;2001年1月&#xff0c;美信以25亿美元收购达拉斯半导体&#xff08;Dallas Semiconductor&#xff09;&#xff0c;而美信在2021年8月被…

谷歌个人号,20人连续封测14天所需设备该怎么解决?

现在&#xff0c;在Google Play上架应用&#xff0c;对于大部分开发者来说&#xff0c;真的是不小的挑战&#xff0c;因为目前谷歌上架政策越来越严格了。特别是从2023年11月13日起&#xff0c;新政策要求个人开发者账号的应用必须经过20个独立用户连续14天的封闭测试&#xff…

只需10分钟1条,全是原创精美视频,拆分8个步骤详细讲解!

不少朋友在问如何快速学习剪辑视频&#xff0c;网上还有很多在收几百到几千学费。其实所有的付费&#xff0c;都是认知与信息差。 这篇文章我直接讲干货&#xff0c;内容不多&#xff0c;大概3分钟可以看完。所有步骤都是富哥亲测的内容&#xff0c;每条视频长达1分钟以上&…

ThreadPoolExecutor基于ctl变量的声明周期管理

个人博客 ThreadPoolExecutor基于ctl变量的声明周期管理 | iwts’s blog 总集 想要完整了解下ThreadPoolExecutor&#xff1f;可以参考&#xff1a; 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog ctl字段的应用 线程池内部使用一个变量ctl维护两个值&#xff…

万字浅析视频搜索系统中的多模态能力建设

万字浅析视频搜索系统中的多模态能力建设 FesianXu 20240331 at Tencent WeChat search team 前言 视频搜索是天然的富媒体检索场景&#xff0c;视觉信息占据了视频的一大部分信息量&#xff0c;在视频搜索系统中引入多模态能力&#xff0c;对于提高整个系统的能力天花板至关重…

一次关于k8s的node节点NotReady的故障排查

master现象 分析 kubectl get nodes -A 看了下pod的状态&#xff0c;好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址&#xff0c;登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务&#xff…

RocketMQ 顺序消息和事务消息及其原理

RocketMQ 顺序消息和事务消息 1、Spring Cloud Alibaba RocketMq 架构图2、RocketMQ 顺序消息2.1、RockerMQ 实现顺序消费2.1.1、顺序发消息2.1.2、顺序收消息 2.2、顺序发送的技术原理2.3、顺序消费的技术原理 3、RocketMQ 的事务消息3.1、RocketMQ 事务消息流程3.2、事务消息…

微服务之服务保护策略【持续更新】

文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离&#xff08;Hystix隔离&#xff09;&#xff0c;每个被隔离的业务都要创建一个独立的线程池&#xff0c;线程过多会带来额外的CPU…

emptyDir + initContainer实现ConfigMap的动态更新(K8s相关)

1. 絮絮叨叨 K8s部署服务时&#xff0c;一般都需要使用ConfigMap定义一些配置文件例如&#xff0c;部署分布式SQL引擎Presto&#xff0c;会在ConfigMap中定义coordinator、worker所需的配置文件以node.properties为例&#xff0c;node.environment和node.data-dir的值将由Helm…

Transformer丨基础Transformer模型和代码详解

笔者在深度学习入门期间自学过Transformer&#xff0c;但是那时碍于急于求成&#xff0c;并未对其进行深度归纳与分享。 近期&#xff0c;笔者观察到不论是自然语言处理模型还是视觉模型&#xff0c;已经几乎从传统的CNN、RNN的网络结构设计全面转向基于Transformer的结构设计…

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

Vue3学习(一)

创建组件实例&#xff1a;我们传入 createApp 的对象实际上是一个组件 import { createApp } from vue // 从一个单文件组件中导入根组件 import App from ./App.vueconst app createApp(App) 大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。 App (root compone…

AI大模型的崛起:第四次工业革命的前奏?

在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型的崛起引起了广泛的关注和讨论。有人将其视为第四次工业革命的前奏&#xff0c;然而&#xff0c;这真的可能吗&#xff1f;本文将探讨这一问题&#xff0c;并对中国AI大模型的发展进行简要分析。…