在表单上使用HttpWebRequest来获取用于抓取的表时出现意外行为 [英] Unexpected behaviour while using Httpwebrequest on a form to obtain a table for scraping

查看:22
本文介绍了在表单上使用HttpWebRequest来获取用于抓取的表时出现意外行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试抓取一个用php编写的网站,以便从特定表格中提取一些信息。以下是场景。

在登录页面上有一个表单,可以接受用户的查询并基于该查询搜索结果。如果我忽略这些字段并点击"提交",它将产生整个结果(这就是我感兴趣的)。以前我不知道HTTPWebRequest类,我只是将URL传递给HtmlAgilityPack库中的Htmlweb.Load(URL)方法,显然不应该这样做。

然后我搜索HTTPWebRequest,我找到了一个类似以下的示例

    Dim cookies As New CookieContainer
    Dim postData As String = "postData obtained using live httpheaders pluging in firefox"
    Dim encoding As New UTF8Encoding
    Dim byteData As Byte() = encoding.GetBytes(postData)


    Dim postRequest As HttpWebRequest = DirectCast(WebRequest.Create("URL"), HttpWebRequest)
    postRequest.Method = "POST"
    postRequest.KeepAlive = True
    postRequest.CookieContainer = cookies
    postRequest.ContentType = "application/x-www-form-urlencoded"
    postRequest.ContentLength = byteData.Length
    postRequest.Referer = "Referer Page"
    postRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"

    Dim postreqstream As Stream = postRequest.GetRequestStream()
    postreqstream.Write(byteData, 0, byteData.Length)
    postreqstream.Close()
    Dim postresponse As HttpWebResponse

    postresponse = DirectCast(postRequest.GetResponse(), HttpWebResponse)
    cookies.Add(postresponse.Cookies)
    Dim postreqreader As New StreamReader(postresponse.GetResponseStream())

    Dim thepage As String = postreqreader.ReadToEnd
现在,当我以vb形式将页面变量输出到浏览器时,我可以看到我想要的页面(包含表格)。此时,我只是将该页面的URL传递给htmlagilitypack,如下所示

    Dim web As New HtmlAgilityPack.HtmlWeb()
    Dim htmlDoc As HtmlAgilityPack.HtmlDocument = web.Load("URL")
    Dim tabletag As HtmlNodeCollection = htmlDoc.DocumentNode.SelectNodes("//table")
    Dim tablenode As HtmlNode = htmlDoc.DocumentNode.SelectSingleNode("//table[@summary='List of services']")

    If Not tabletag Is Nothing Then

        Console.WriteLine("YES")

    End If

但Tablettag变量为Nothing。我想知道我哪里错了?另外,有没有什么方法可以直接从HTTPWebResponone中获取URL,这样我就可以传递到web.Load方法中?

谢谢

推荐答案

如果您想要的内容是通过JAVASCRIPT构建的,则不能通过HtmlAgilityPack Load方法或任何简单的URL加载器客户端(如WebRequest.)运行JAVASCRIPT。它们不会进行处理,也不会像浏览器那样与网页交互。否则,您可以直接从流中加载,如下所示:

Dim htmlDoc As New HtmlAgilityPack.HtmlDocument
htmlDoc.Load(postresponse.GetResponseStream())
第一个建议:您可以在WebBrowser中加载表单页面URL,然后设法填写表单并单击提交按钮,通过DOM以编程方式访问HTMLDocument。更多信息请参阅thisthis等帖子。

第二个建议:当你不想在屏幕上有一个可视化的事件驱动的控件时,或者在最糟糕的情况下,当你想在后台线程中操作网页时,WebBrowser变得有点棘手。在这种情况下,您可以使用STAThread solution herehere,或者使用一个称为无头浏览器,如Selify或HtmlUnitWatin,并使用它们的DOM访问执行相同的操作。

这篇关于在表单上使用HttpWebRequest来获取用于抓取的表时出现意外行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆