2017-06-26 16 views
0

私はニュース記事を収集するためにウェブスクレイパーを作ろうとしていますが、ウェブページの完全なHTMLコンテンツを取得することに問題があります。 Here is the url最初に記事検索結果を取得する必要がある:C#で完全なWebページHTMLを取得するには?

次に、個々の記事(example)をこすります。

WebRequest、HTTPWebRequest、およびWebClientを使用してリクエストを行いましたが、毎回返される結果にはサイドバーなどのHTMLコンテンツしか含まれていませんでした。Chromeデベロッパーツールを使用して返されたHTMLはちょうどページの主な内容の後に、したがって役に立たない。私はまた、コンテンツのためのajax呼び出しを探していて、何も見つけることができませんでした。

私はSelenium Webdriverを使用して必要なコンテンツをスクラップすることができましたが、これは理想的ではありません。すべてのURLにアクセスするのがずっと遅く、ページが読み込まれないことがよくあります。ページの完全なHTMLコンテンツを要求することについての助けがあれば幸いです。

+1

実行中のコードを追加した場合に役立ちます – foobar

+1

HTMLを取得していない場合は、最初のリクエストでスクレイプする必要がありますが、JavaScriptがロードされている可能性があります。この場合、必要なものを得るために要求を複製する必要があります。 – ThePerplexedOne

+0

記事リンクのHTMLを取得しています。私が見ることのできるところでは、クエリー引数が空のままであれば、クエリー引数http://www.fa-mag.com/search.php?query=u&offset=0を送る必要があります。 –

答えて

0

あなたは何が問題なのかよく分かりませんが、私はあなたの仕事をどのように達成しましたか?

最初に私は開発ツールでネットワークタブを開いたままウェブブラウザでページを閲覧しました。

ここから、実際のブラウザから送信されたヘッダーのリストを収集しました。その後、後続のヘッダーを追加してHttpWebRequestを構築し、ページの完全なHTMLを取得することができました。

public string getHtml() 
{ 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.fa-mag.com/search.php?and_or=and&date_range=all&magazine=&sort=newest&method=basic&query=ubs"); 

    req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0"; 
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    req.AllowAutoRedirect = false; 
    req.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5"); 
    req.Headers.Add("cookie", "analytics_id=595127c20cdfe6.52043028595127c20ce022.71834842; PHPSESSID=tbbo7npldsv26n2q7pg2728k77; D_IID=3E4FEA7F-9794-34EE-99F8-87EEA3DF0689; D_UID=5F374D94-270D-3653-8C54-9A46F381EAE2; D_ZID=505BB8EF-5A2D-3CBD-87D8-FABAD5014776; D_ZUID=BB0C9EF2-0E7B-383E-A03A-A3E92CC8051A; D_HID=9642D775-D860-3F04-8720-73E5339042BA; D_SID=63.138.127.22:6Ci6jv2Xv+yum3m9lNfnyRcAylne67YfnS/u8goKrxQ"); 
    req.Headers.Add("DNT", "1"); 
    req.Headers.Add("Upgrade-Insecure-Requests", "1"); 
    HttpWebResponse res = null; 
    try 
    { 
     res = (HttpWebResponse)req.GetResponse(); 
    } 
    catch (WebException webex) 
    { 
     res = (HttpWebResponse)webex.Response; 
    } 

    string html = new StreamReader(res.GetResponseStream()).ReadToEnd(); 
    return html; 
} 

カスタムヘッダーがないと、416応答を送信してリダイレクトするボット保護がページにあります。あなたがリダイレクトページのhtmlを読むと、サイトがあなたをボットとして検出したことを示します。

+0

あなたは正しいですが、セッションの有効期限が切れる可能性が高く、あなたはボットと宣言されます。リダイレクトの呼び出しを2回行う必要があります。 –

+0

私はちょうどこの同じコードを実行し、まだページの部分的なHTMLを受け取った – FightOn

+0

私は得るHTMLです:編集、あまりにも長いここでそれを貼り付けることはできません。 –

関連する問題