Html Agility Pack, веб-скребок и spoofing в C #

c# html-agility-pack spoofing web-scraping

Вопрос

Есть ли способ обмануть веб-запрос из кода на 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";

Принятый ответ

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

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

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

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


Популярные ответы

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

        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 - мой WebClient).

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

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;
    }

Другая основная причина, по которой вы можете столкнуться, - это соединение закрывается сервером, поскольку вы слишком долго открывали соединение. Вы можете это доказать, добавив попытку 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);
                            }

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

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

ОЦЕНИ МЕНЯ!



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow