0

HTMLAgilityPack を使用して、次の Web サイトから HTML を取得していました: http://tennis.wettpoint.com/en/

うまくいきましたが、今では.. 1時間後にはもう機能しません!

最初にコードを変更しようとしました-HTMLを取得する方法について:

string url = "http://tennis.wettpoint.com/en/";
HtmlWeb hw = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = hw.Load(url);
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
   //Code..
}

私が言ったように、それは常にうまくいきました..サイトが私にとって「ダウン」しているように見えるまで..だから私はコードを次のように変更しました:

using (WebClient wc = new WebClient())
{
    wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4");
    string html = wc.DownloadString("http://en.wikipedia.org/wiki/United_States");
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
}

(それは私のサイトでは機能しませんでしたが、他のサイトでは機能しました)

少なくとも私はこれを持っていますが、これも機能しますが、私のサイトでは機能しません:

HtmlAgilityPack.HtmlDocument doc = GetHTMLDocumentByURL(url);

public HtmlAgilityPack.HtmlDocument GetHTMLDocumentByURL(string url)
{
    var htmlDoc = new HtmlAgilityPack.HtmlDocument();
    htmlDoc.OptionReadEncoding = false;
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5";
    request.Method = "GET";
    using (var response = (HttpWebResponse)request.GetResponse())
    {
        using (var stream = response.GetResponseStream())
        {
            htmlDoc.Load(stream, Encoding.UTF8);
        }
    }
    return htmlDoc;
}

最初は、サイトがダウンしていると思っていました。どのブラウザでもサイトにアクセスできないためです..だから友人に尋ねたところ、彼らはサイトにアクセスできました..つまり、私の IP がブロックされていたということです.. 。 私に何ができる?Ip (方法) を変更する必要がありますか、それともプロキシ (方法) を使用する必要がありますか?

4

2 に答える 2

5

クロールの第一のルール:礼儀正しさ!

Web サイトをクロールするときはいつでも、クローラーが robots.txt ファイルのルールに従っていることを確認する必要があります: http://tennis.wettpoint.com/robots.txt

User-agent: msnbot 
Crawl-delay: 1

User-agent: MJ12bot
Disallow: /

User-agent: sistrix
Disallow: /

User-agent: TurnitinBot
Disallow: /

User-agent: Raven
Disallow: /

User-agent: dotbot
Disallow: /

これは、msnbot が 1 秒の遅延で Web サイトをクロールすることを明示的に許可されていることを意味します。MJ12bot、sistrix、TurnitinBot、Raven、および dotbot は、Web サイトのクロールを明示的に許可されていません。さて、これは Web サイトから見られる最初の防衛線です。これは、偶発的な悪用から Web サイトを保護するための最も丁寧な方法です。robots.txt の詳細については、こちらを参照してください: http://www.robotstxt.org/meta.html

妥当なクロール遅延 (1 ~ 10 秒) を実装し、再度クロールできるかどうかを確認する必要があります。

ルール 2: ボット トラップに注意してください。

これは現時点では当てはまりませんが、一般的には知っておく必要があります。礼儀正しくないボットを捕まえる方法の 1 つは、次のように、すべてのロボットが特定のディレクトリに移動することを禁止する明示的なルールを robots.txt に入れることです。

ユーザーエージェント: * 許可しない: /the/epic/robot/trap/path

次に、HTML のどこかにリンクがあります。これは人間には見えませんが、ボットには見えます。

<a href="www.mydomain.com/the/epic/robot/trap/path/gotcha.html"></a>

明らかに、ブラウザを使用している場合、人間がこのリンクを見たりクリックしたりすることはなく、robots.txt ルールに従うボットが に移動することはありません/the/epic/robot/trap/path。しかし、robots.txt の規則に従わず、クロール目的で内部リンクを収集するボットは、最終的にそのディレクトリにたどり着き、彼らを待っているのは確実な死です! Web サイトの運営者は、そのリンクにアクセスしたユーザーのすべての IP を収集してブロックしている可能性が高いです。

于 2012-10-15T16:45:28.773 に答える
4

ウィキペディアは、IP アドレスから取得するリクエストの数を監視し、IP がそのコンテンツを積極的にスクレイピングすることを禁止します。Google 検索結果をスクレイピングしても同じ効果があります。

当初ウィキペディアはあなたを 24 時間のみ禁止しますが、「違反」を続けると、あなたの IP は永久に禁止されます。

HttpRequest でプロキシを使用して IP アドレスを変更するか、リクエストを遅くすることができます。

于 2012-10-15T16:20:50.930 に答える