Die HTMLAgilityPack .load-Verbindung ist auf einigen Websites geschlossen

.net html-agility-pack vb.net

Frage

Ich habe den folgenden Code, der auf einigen Websites funktioniert, die ich versucht habe, für Informationen zu scrapping, aber es funktioniert nicht auf einer bestimmten Website, die ich ausprobiert habe, und ich bekomme den Fehler "Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung wurde unerwartet geschlossen. " Warum sollte das auf einigen Seiten funktionieren und nicht auf anderen? Wenn ich zum Beispiel auf siteA verwendet werde, bekomme ich den letzten Hyperlink in div "wrapper". aber auf einer anderen Seite bekomme ich nur eine geschlossene Verbindung. bitte hilfe.

Private Function getText() As String
    Dim web = New HtmlWeb()
    Dim html As HtmlDocument

    html = web.load("http://some-website.com")
    Dim lastLink = html.DocumentNode.SelectSingleNode("//div[@id='wrapper']//a[last()]")

    If lastLink IsNot Nothing Then
        Return lastLink.InnerHtml
    Else
        Return "nothing found"
    End If

End Function

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load        
    label4.Text = getText()
End Sub

Akzeptierte Antwort

Dafür gibt es viele mögliche Gründe. Verzögerte Javascript-Ausführung kommt in den Sinn oder eine archaische Art von Browser wechseln. Es könnte nützlich sein, die Header Ihrer Browser-Anfragen mit den in HtmlAgilityPack verwendeten zu überprüfen.

Das erste, was ich tun würde, ist die gleiche User-Agent-Zeichenfolge zu verwenden:

Private Function getText() As String
    Dim web = New HtmlWeb()
    web.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36"
    Dim html As HtmlDocument

    html = web.load("http://some-website.com")
    Dim lastLink = html.DocumentNode.SelectSingleNode("//div[@id='wrapper']//a[last()]")

    If lastLink IsNot Nothing Then
        Return lastLink.InnerHtml
    Else
        Return "nothing found"
    End If

End Function

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load        
    label4.Text = getText()
End Sub

Ich nehme an, Ihr Browser kann Ihnen einen Hinweis auf den eigentlichen Anfrage-Header geben (zB Chrome Developer Tools, Firebug). Ein schneller Weg, um beide Einstellungen zu vergleichen, kann durch Abrufen von http://www.mybrowserinfo.com/ erfolgen . Wenn Sie einen eigenen Webserver haben, sehen Sie sich einfach die Protokolle an. Wenn dies nicht hilft, den Verkehr zu dumpen, wäre die Brute-Force-Option.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum