Html Agility Pack, парсинг веб-страниц и спуфинг в C#

Есть ли способ подделать веб-запрос из кода C #, чтобы он не выглядел как бот или спам, попавший на сайт? Я пытаюсь очистить свой веб-сайт, но продолжаю блокироваться после определенного количества звонков. Я хочу действовать как настоящий браузер. Я использую этот код из HTML Agility Pack.

 var web = new HtmlWeb();
                web.UserAgent =
                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11";

person Mike Flynn    schedule 22.12.2012    source источник


Ответы (2)


Используйте обычный браузер и fiddler (если инструменты разработчика не на должном уровне) и просмотрите заголовки запросов и ответов. .

Создайте свои запросы и заголовки запросов, чтобы они соответствовали тому, что отправляет браузер (вы можете использовать несколько разных браузеров, чтобы оценить, имеет ли это значение).

Что касается «блокировки после определенного количества вызовов» - заблокируйте свои звонки. Выполняйте только один вызов каждые x секунд. Ведите себя хорошо с сайтом, и он будет вести себя хорошо с вами.

Скорее всего, они просто смотрят на количество звонков с вашего IP-адреса в секунду, и если оно превышает пороговое значение, IP-адрес блокируется.

person Oded    schedule 22.12.2012
comment
Сначала я попробовал ваш ответ, прежде чем другие ответы, и это действительно сработало. Я увеличил задержку между веб-вызовами на 30 секунд и добавил в свой запрос пользовательский агент, акцепт и реферер. - person Mike Flynn; 24.12.2012

Я делаю слишком много веб-скрапинга, но вот варианты: у меня есть список заголовков по умолчанию, который я добавляю, поскольку все это ожидается от браузера:

        wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11";
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        wc.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        wc.Headers[HttpRequestHeader.AcceptEncoding] = "gzip,deflate,sdch";
        wc.Headers[HttpRequestHeader.AcceptLanguage] = "en-GB,en-US;q=0.8,en;q=0.6";
        wc.Headers[HttpRequestHeader.AcceptCharset] = "ISO-8859-1,utf-8;q=0.7,*;q=0.3";

(WC - мой веб-клиент).

В качестве дополнительной помощи - вот мой класс веб-клиента, который хранит файлы cookie, что также является огромной помощью:

public class CookieWebClient : WebClient
{

    public CookieContainer m_container = new CookieContainer();
    public WebProxy proxy = null;

    protected override WebRequest GetWebRequest(Uri address)
    {
        try
        {
            ServicePointManager.DefaultConnectionLimit = 1000000;
            WebRequest request = base.GetWebRequest(address);
            request.Proxy = proxy;

            HttpWebRequest webRequest = request as HttpWebRequest;
            webRequest.Pipelined = true;
            webRequest.KeepAlive = true;
            if (webRequest != null)
            {
                webRequest.CookieContainer = m_container;
            }

            return request;
        }
        catch
        {
            return null;
        }
    }
}

Вот мое обычное использование для этого. Добавьте статическую копию в класс вашего базового сайта со всеми вашими функциями синтаксического анализа, которые у вас, вероятно, есть:

    protected static CookieWebClient wc = new CookieWebClient();

И назовите это так:

public HtmlDocument Download(string url)
    {
        HtmlDocument hdoc = new HtmlDocument();
        HtmlNode.ElementsFlags.Remove("option");
        HtmlNode.ElementsFlags.Remove("select");
        Stream read = null;
        try
        {
            read = wc.OpenRead(url);
        }
        catch (ArgumentException)
        {
            read = wc.OpenRead(HttpHelper.HTTPEncode(url));
        }

        hdoc.Load(read, true);


        return hdoc;
    }

Другая основная причина, по которой у вас может произойти сбой, заключается в том, что соединение закрывается сервером, поскольку у вас слишком долго было открытое соединение. Вы можете доказать это, добавив try catch вокруг части загрузки, как указано выше, и, если это не удается, перезагрузите веб-клиент и повторите попытку загрузки:

HtmlDocument d = new HtmlDocument();
                            try
                            {
                                d = this.Download(prp.PropertyUrl);
                            }
                            catch (WebException e)
                            {
                                this.Msg(Site.ErrorSeverity.Severe, "Error connecting to " + this.URL + " : Resubmitting..");
                                wc = new CookieWebClient();
                                d = this.Download(prp.PropertyUrl);
                            }

Это все время спасает мою задницу, даже если это был отказ сервера, это может изменить партию. Файлы cookie очищены, и вы снова можете свободно перемещаться. Если действительно случится что-то плохое, добавьте поддержку прокси и получите новый прокси, применяемый к 50-ти запросам.

Этого должно быть более чем достаточно, чтобы надрать задницу себе и любым другим сайтам.

ОЦЕНИ МЕНЯ!

person Aaron Gibson    schedule 23.12.2012
comment
Все еще полезно после стольких лет! Из любопытства, если вам в конечном итоге понадобится использовать прокси, где вы получите их неограниченный запас? Кажется, это может дорого обойтись. - person Nate Cook; 07.01.2018
comment
Скрыть мою задницу. Множество бесплатных прокси - person Aaron Gibson; 03.03.2018