0

特定のテーブルからいくつかの情報を抽出するために、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を取得する方法はありますか?

ありがとうございました

4

1 に答える 1