在表单上使用HttpWebRequest来获取用于抓取的表时出现意外行为 [英] Unexpected behaviour while using Httpwebrequest on a form to obtain a table for scraping
本文介绍了在表单上使用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。更多信息请参阅this和this等帖子。
第二个建议:当你不想在屏幕上有一个可视化的事件驱动的控件时,或者在最糟糕的情况下,当你想在后台线程中操作网页时,WebBrowser变得有点棘手。在这种情况下,您可以使用STAThread solution here和here,或者使用一个称为无头浏览器,如Selify或HtmlUnitWatin,并使用它们的DOM访问执行相同的操作。
这篇关于在表单上使用HttpWebRequest来获取用于抓取的表时出现意外行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文