网页抓取问题

网页抓取问题

我在访问调用的网页 HtmlWebResponseObject 对象时遇到问题。该对象由以下人员获取:

PS>$webpage = Invoke-WebRequest -uri "https://www.grittv.com/tv-schedule/"

尝试解析/查询后:

PS>$webpage.AllElements

它只是停留在那里,光标闪烁,直到我取消它(一次 30 分钟以上)

以下是一些调查:

PS>$webpage | get-member


   TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject

Name              MemberType Definition
----              ---------- ----------
Dispose           Method     void Dispose(), void IDisposable.Dispose()
Equals            Method     bool Equals(System.Object obj)
GetHashCode       Method     int GetHashCode()
GetType           Method     type GetType()
ToString          Method     string ToString()
AllElements       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
BaseResponse      Property   System.Net.WebResponse BaseResponse {get;set;}
Content           Property   string Content {get;}
Forms             Property   Microsoft.PowerShell.Commands.FormObjectCollection Form...
Headers           Property   System.Collections.Generic.Dictionary[string,string] He...
Images            Property   Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
InputFields       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
Links             Property   Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
ParsedHtml        Property   mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent        Property   string RawContent {get;set;}
RawContentLength  Property   long RawContentLength {get;}
RawContentStream  Property   System.IO.MemoryStream RawContentStream {get;}
Scripts           Property   Microsoft.PowerShell.Commands.WebCmdletElementCollectio...
StatusCode        Property   int StatusCode {get;}
StatusDescription Property   string StatusDescription {get;}
PS>$webpage.RawContentLength
139792
PS>$webpage.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    HtmlWebResponseObject                    Microsoft.PowerShell.Commands.WebResponseObject

状态代码返回200OK

是什么阻碍了解析?您能帮忙调用此数据吗:?

$list = $webpage.allelements | where class -EQ "three-quarters"| select -ExpandProperty innertext

此外,它做过我相信它只工作了一次。我关闭了脚本,改天再回来,但从那以后,它似乎就挂了。

在第二台计算机上调用得到了相同的结果。

谢谢

答案1

请记住,Invoke-WebRequest 使用的是旧的、有缺陷的 IE 引擎,因此奇怪的事情是可以预料的。

首先要说明的是,您使用的是 Invoke-WebRequest,默认情况下,它会呈现 HTML DOM 并完全混淆 AllElements 成员。在使用 JavaScript 的页面上,这可能会发生其他事情,例如打开 IE 窗口或隐藏提示无休止地等待您的响应。

您需要向 Invoke-WebRequest 添加 参数 -UseBasicParsing,如下所示:

$webpage = Invoke-WebRequest -uri "https://www.grittv.com/tv-schedule/" -UseBasicParsing

使用时的缺点-UseBasicParsing是您没有可以 .ParsedHtml使用的 DOM 函数。

结果$webpage不能与 一起使用AllElements。您需要直接访问其属性。

列出所有属性及其值:

$webpage | Format-List

例如查看所有链接:

$webpage  | select -ExpandProperty Links

相关内容