特定のテーブルからいくつかの情報を抽出するために、phpで記述されたWebサイトをスクレイプしようとしています。これがシナリオです。
ランディングページには、ユーザーからのクエリを受け取り、その検索に基づいて結果を検索できるフォームがあります。これらのフィールドを無視して[送信]をクリックすると、結果全体が生成されます(これが私が興味を持っているものです)。HTTPWebRequestクラスについて知らなかった前は、HtmlAgilityPackライブラリのHtmlweb.load(URL)メソッドに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
しかし、tabletag変数は何もありません。どこが間違っているのか知りたいですか?また、web.loadメソッドに渡すことができるようにhttpwebresponeから直接URLを取得する方法はありますか?
ありがとうございました