powershell - 使用 Invoke-WebRequest 时 为什么我使用 UseBasicParsing 时只能连接到某些 URL?
问题描述
我正在遍历 URL 的 CSV 文件并使用 Invoke-WebRequest 来获取与指定条件匹配的链接的 innerHTML 和 href 值,但这仅适用于某些 URL,而不适用于其他 URL,除非我添加参数 -UseBasicParsing 不t 提供我需要的属性访问和过滤功能。
一个共同点是,那些不起作用的都使用 www 子域,但其中一些仍然可以在没有这个的情况下访问,但仍然不起作用,我不确定这应该是一个问题,因为其他 www URL 确实有效
如上所述,我尝试添加允许连接的 UseBasicParsing,但这限制了我可以访问的数据。我还查看了 URLS 的 http 标头,以尝试了解差异是什么,但不确定问题是什么。
这可以正确运行并返回页面上每个链接的 innerHTML 文本和 href
$currentRequest = Invoke-WebRequest -Uri https://moz.com/learn/seo/what-
is-seo
$currentRequest | Get-Member
$currentRequest = $currentRequest.Links |
Select innerHTML, href |
WHERE innerHTML -like *SEO*
$currentRequest
使用与以下 URL 完全相同的代码,控制台只是冻结,直到脚本退出
https://www.redevolution.com/what-is-seo
当我使用工作 URL 运行脚本时,我会为每个链接获得一对值,如下所示
innerHTML : Recommended SEO Companies
href : https://moz.com/community/recommended
使用上面提到的非工作 URL,命令行只会停留在闪烁的光标处。
这只是一个示例,我还需要查询其他数据,因此很高兴了解我如何能够始终如一地运行 Invoke-WebRequest 而不会出现问题。
非常感谢!!
麦克风
解决方案
与其说是答案,不如说是长评论...
在 PowerShell 5.1 中,Invoke-WebRequest 使用 Internet Explorer 引擎将 html 解析为 DOM,这也可能导致执行页面上的任何脚本,因此脚本中可能出现问题,或者无头 Internet Explorer 实例没有'不喜欢页面内容,无论出于何种原因。
在其他地方还有其他报告同样的问题 - 例如Invoke-WebRequest 在某些情况下挂起,除非使用 -UseBasicParsing
添加-UseBasicParsing
开关绕过 Internet Explorer 并使用更简单的内部 HTML 解析器 - 如果您需要提取其他信息,您可以使用 HTML 解析器库(如HtmlAgilityPack或AngleSharp)来解析和查询$currentRequest.Content
属性。
请注意,PowerShell Core 6.0 及更高版本已将-UseBasicParsing
开关设为默认行为,实际上无法将其关闭,因此如果您现在想编写面向未来的脚本,最好找到一种方法来解决您的问题,-UseBasicParsing
这样您就不用如果/当您想升级到 PowerShell Core 时,必须重写它。(请参阅PowerShell 6.0 的重大更改 -> 对 Web Cmdlet 的更改)
有关相关问题,请参阅如何在 Powershell Core 中解析 html 。
推荐阅读
- android - 丢失密钥库密码,但让 Google 管理签名密钥
- javascript - 当页面以角度重新加载时在页面中做一些工作
- swift - 根据 Apple 文档计算文本高度
- c++ - Is there any way to use both Borland Compiler and graphics.h in CodeBlocks?
- azure-data-lake - 限制从 ADLS Gen2 到其他平台的数据移动
- arrays - 是否可以仅使用这三个过程 Max(A, i, j)、Min(A, i, j) 和 Swap(A, i, j) 来设计 O(n log n) 排序算法?
- arduino-esp8266 - HTTP Espressif arduino 客户端无法连接
- r - R函数使用的参数是固定的吗?
- javascript - 在返回确认中添加 href
- android - 忽略房间中的 Where 子句