HtmlAgilityPack.HtmlDocument Cookies - PullRequest
       8

HtmlAgilityPack.HtmlDocument Cookies

5 голосов
/ 06 апреля 2011

Это относится к файлам cookie, установленным внутри скрипта (возможно, внутри тега скрипта).

System.Windows.Forms.HtmlDocument выполняет эти сценарии, и набор файлов cookie (например, document.cookie=etc...) можно получить через его свойство Cookies .

Полагаю, HtmlAgilityPack.HtmlDocument этого не делает (исполнение). Интересно, есть ли простой способ эмулировать возможности System.Windows.Forms.HtmlDocument (часть куки).

Любой

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Когда мне нужно использовать Cookies и HtmlAgilityPack вместе или просто создавать пользовательские запросы (например, установить свойство User-Agent и т. Д.), Вот что я делаю:

  • Создать класс, который инкапсулирует запрос / ответ. Давайте назовем этот класс WebQuery
  • Имейте частное CookieCollection (в вашем случае public ) свойство внутри этого класса
  • Создайте метод внутри класса, который выполняет запрос вручную. Подпись может быть:

...

public HtmlAgilityPack.HtmlDocument GetSource(string url);

Что нам нужно делать внутри этого метода?

Хорошо, используя HttpWebRequest и HttpWebResponse , сгенерируйте http-запрос вручную (есть несколько примеров, как это сделать в Интернете), создайте экземпляр класса HtmlDocument используя конструктор, который получает поток.

Какой поток мы должны использовать? Ну, тот, который возвращается:

httpResponse.GetResponseStream();

Если вы используете HttpWebRequest для выполнения запроса, вы можете легко установить его свойство CookieContainer в переменную, которую вы объявили перед каждым доступом к новой странице, и таким образом все файлы cookie установленные вами сайты будут правильно храниться в переменной CookieContainer, которую вы объявили в WebQuery классе , с учетом того, что вы используете только один экземпляр класса WebQuery.

Надеюсь, вы найдете это объяснение полезным. Примите во внимание, что используя это, вы можете делать все, что захотите, независимо от того, поддерживает это HtmlAgilityPack или нет.

2 голосов
/ 02 июля 2012

Я также работал с классом BrowserSession Рохита Агарвала вместе с HtmlAgilityPack.Но для меня последующие вызовы «Get-function» не работали, потому что каждый раз были установлены новые куки.Вот почему я добавил некоторые функции самостоятельно.(Мое решение далеко не идеальное - это просто быстрое и грязное исправление) Но для меня это сработало, и если вы не хотите тратить много времени на изучение BrowserSession класса, вот чтоЯ сделал:

Добавлены / изменены следующие функции:

class BrowserSession{
   private bool _isPost;
   private HtmlDocument _htmlDoc;
   public CookieContainer cookiePot;   //<- This is the new CookieContainer

 ...

    public string Get2(string url)
    {
        HtmlWeb web = new HtmlWeb();
        web.UseCookies = true;
        web.PreRequest = new HtmlWeb.PreRequestHandler(OnPreRequest2);
        web.PostResponse = new HtmlWeb.PostResponseHandler(OnAfterResponse2);
        HtmlDocument doc = web.Load(url);
        return doc.DocumentNode.InnerHtml;
    }
    public bool OnPreRequest2(HttpWebRequest request)
    {
        request.CookieContainer = cookiePot;
        return true;
    }
    protected void OnAfterResponse2(HttpWebRequest request, HttpWebResponse response)
    {
        //do nothing
    }
    private void SaveCookiesFrom(HttpWebResponse response)
    {
        if ((response.Cookies.Count > 0))
        {
            if (Cookies == null)
            {
                Cookies = new CookieCollection();
            }    
            Cookies.Add(response.Cookies);
            cookiePot.Add(Cookies);     //-> add the Cookies to the cookiePot
        }
    }

Что он делает: Он в основном сохраняет куки из первоначального «пост-ответа» и добавляет тот же CookieContainer взапрос позвонил позже.Я не совсем понимаю, почему он не работал в начальной версии, потому что он как-то делает то же самое в функции AddCookiesTo.(if (Cookies! = null && Cookies.Count> 0) request.CookieContainer.Add (Cookies);) В любом случае, с этими добавленными функциями теперь все должно работать нормально.

Его можно использовать так:

//initial "Login-procedure"
BrowserSession b = new BrowserSession();
b.Get("http://www.blablubb/login.php");
b.FormElements["username"] = "yourusername";
b.FormElements["password"] = "yourpass";
string response = b.Post("http://www.blablubb/login.php");

все последующие вызовы должны использовать:

response = b.Get2("http://www.blablubb/secondpageyouwannabrowseto");
response = b.Get2("http://www.blablubb/thirdpageyouwannabrowseto");
...

Надеюсь, это поможет, когда вы столкнетесь с той же проблемой.

...