2009-12-05 4 views
0

Я пытаюсь выполнить скрипинг с помощью C#. Он работает несколько раз, после чего я получаю сообщение об истечении срока действия сессии. Любая помощь будет оценена.. Очистка экрана экрана и сеанс

+1

Вы хотите сказать веб-страницу scraping? Возможно, с объектом HttpWebRequest. В принципе, мы не можем помочь без дополнительной информации и, возможно, с некоторым кодом. –

+0

Как вы это делаете? – Shoban

+0

Да, я имею в виду веб-страницу, очищающую с помощью WebRequest. – Jignesh

ответ

5

Вот набор классов, которые я использую для скрипирования экрана. (Я писал эти классы, не стесняйтесь использовать, как вы хотите.)

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

Он также отлично обрабатывает SSL-сайты, работает с переадресацией и захватывает исходные страницы, вызвавшие перенаправление, а также в классе WebPage.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.IO.Compression; 
using System.Threading; 
using System.Web; 
using System.Security.Cryptography.X509Certificates; 

public class PostValue 
{ 
    public PostValue(String key, String value) 
    { 
     Key = key; 
     Value = value; 
    } 


    public String Key { get; set; } 

    public String Value { get; set; } 
} 

[Serializable] 
public class WebPage 
{ 
    public WebPage(String html) 
    { 
     Html = html; 
    } 

    public WebPage(String html, WebPage parent) 
    { 
     Html = html; 
     Parent = parent; 
    } 

    public String Html { get; set; } 
    public WebPage Parent { get; set; } 
} 


internal class AcceptAllCertificatePolicy : ICertificatePolicy 
{ 
    public AcceptAllCertificatePolicy() 
    { 
    } 

    public bool CheckValidationResult(ServicePoint sPoint, 
     X509Certificate cert, WebRequest wRequest, int certProb) 
    { 
     // Always accept 
     return true; 
    } 
} 

public class WebSession 
{ 
    public String BaseUrl { get; set; } 
    public String LastUrl { get; set; } 
    public String UserAgent { get; set; } 

    public int PageReattempts { get; set; } 
    public WebProxy Proxy { get; set; } 
    public String CookieString { get; set; } 
    public Dictionary<String, String> Cookies { get; set; } 

    private static WebSession instance { get; set; } 
    public static WebSession Instance { get { if (instance == null) instance = new WebSession(); return instance; } } 

    public const String DefaultAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"; 

    public WebSession() 
     : this(DefaultAgent, null) 
    { 
    } 


    public WebSession(String baseUrl) 
     : this(DefaultAgent, null) 
    { 
     BaseUrl = baseUrl; 
    } 

    public WebSession(String userAgent, WebProxy proxy) 
    { 
     ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); 
     CookieString = ""; 
     Cookies = new Dictionary<string, string>(); 

     if (userAgent == "") 
      UserAgent = DefaultAgent; 
     else 
      UserAgent = userAgent; 

     Proxy = proxy; 
     LastUrl = ""; 
     PageReattempts = 4; 
     ServicePointManager.Expect100Continue = false; 
    } 


    public WebPage RequestPage(string URL) 
    { 
     return RequestPage(new Uri(BaseUrl + URL)); 
    } 

    public WebPage RequestPage(string URL, string Values, string Method) 
    { 
     return RequestPage(new Uri(BaseUrl + URL), Values, Method); 
    } 

    public WebPage RequestPage(string URL, string Values, string Method, string ContentType) 
    { 
     return RequestPage(new Uri(BaseUrl + URL), Values, Method, "application/x-www-form-urlencoded"); 
    } 

    public WebPage RequestPage(Uri URL) 
    { 
     return RequestPage(URL, "", "GET"); 
    } 


    public WebPage RequestPage(String URL, params PostValue[] postValues) 
    { 
     String totalString = ""; 

     if (postValues.Length > 0) 
     { 
      for (int count = 0; count < postValues.Length; count++) 
      { 
       if (count > 0) 
        totalString += "&"; 

       totalString += postValues[count].Key + "=" + HttpUtility.UrlEncode(postValues[count].Value); 
      } 
     } 

     return RequestPage(URL, totalString); 
    } 


    public WebPage RequestPage(string URL, string Values) 
    { 
     return RequestPage(new Uri(BaseUrl + URL), Values); 
    } 


    public WebPage RequestPage(Uri URL, string Values) 
    { 
     return RequestPage(URL, Values, "POST"); 
    } 


    public WebPage RequestPage(Uri URL, string Values, string Method) 
    { 
     return RequestPage(URL, Values, Method, "application/x-www-form-urlencoded"); 
    } 


    public WebPage RequestPage(Uri url, string content, string method, string contentType) 
    { 
     string htmlResult; 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
     HttpWebResponse response = null; 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] contentData = encoding.GetBytes(content); 

     request.Proxy = Proxy; 
     request.Timeout = 60000; 
     request.Method = method; 
     request.AllowAutoRedirect = false; 
     request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     request.Referer = LastUrl; 
     request.KeepAlive = false; 

     request.UserAgent = UserAgent; 

     request.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
     //request.Headers.Add("UA-CPU", "x86"); 
     request.Headers.Add("Cache-Control", "no-cache"); 
     request.Headers.Add("Accept-Encoding", "gzip,deflate"); 

     String cookieString = ""; 
     foreach (KeyValuePair<String, String> cookiePair in Cookies) 
      cookieString += cookiePair.Key + "=" + cookiePair.Value + ";"; 

     if (cookieString.Length > 2) 
     { 
      String cookie = cookieString.Substring(0, cookieString.Length - 1); 
      request.Headers.Add("Cookie", cookie); 
     } 

     if (method == "POST") 
     { 
      request.ContentLength = contentData.Length; 
      request.ContentType = contentType; 

      Stream contentWriter = request.GetRequestStream(); 
      contentWriter.Write(contentData, 0, contentData.Length); 
      contentWriter.Close(); 
     } 

     int attempts = 0; 

     while (true) 
     { 
      try 
      { 
       response = (HttpWebResponse)request.GetResponse(); 
       if (response == null) 
        throw new WebException(); 

       break; 
      } 
      catch (WebException) 
      { 
       if (response != null) 
        response.Close(); 

       if (attempts == PageReattempts) 
        throw; 

       // Wait three seconds before trying again 
       Thread.Sleep(3000); 
      } 

      attempts += 1; 
     } 

     // Tokenize cookies 
     if (response.Headers["Set-Cookie"] != null) 
     { 
      String headers = response.Headers["Set-Cookie"].Replace("path=/,", ";").Replace("HttpOnly,", ""); 
      foreach (String cookie in headers.Split(';')) 
      { 
       if (cookie.Contains("=")) 
       { 
        String[] splitCookie = cookie.Split('='); 
        String cookieKey = splitCookie[0].Trim(); 
        String cookieValue = splitCookie[1].Trim(); 

        if (Cookies.ContainsKey(cookieKey)) 
         Cookies[cookieKey] = cookieValue; 
        else 
         Cookies.Add(cookieKey, cookieValue); 
       } 
       else 
       { 
        if (Cookies.ContainsKey(cookie)) 
         Cookies[cookie] = ""; 
        else 
         Cookies.Add(cookie, ""); 
       } 
      } 
     } 

     htmlResult = ReadResponseStream(response); 
     response.Close(); 

     if (response.Headers["Location"] != null) 
     { 
      response.Close(); 
      Thread.Sleep(1500); 
      String newLocation = response.Headers["Location"]; 
      WebPage result = RequestPage(newLocation); 
      return new WebPage(result.Html, new WebPage(htmlResult)); 
     } 

     LastUrl = url.ToString(); 

     return new WebPage(htmlResult); 
    } 

    public string ReadResponseStream(HttpWebResponse response) 
    { 
     Stream responseStream = null; 
     StreamReader reader = null; 

     try 
     { 
      responseStream = response.GetResponseStream(); 
      responseStream.ReadTimeout = 5000; 

      if (response.ContentEncoding.ToLower().Contains("gzip")) 
       responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
      else if (response.ContentEncoding.ToLower().Contains("deflate")) 
       responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 

      reader = new StreamReader(responseStream); 

      return reader.ReadToEnd(); 
     } 
     finally 
     { 
      reader.Close(); 
      responseStream.Close(); 
     } 
    } 
} 
+0

Я думаю, что он должен работать. Спасибо Custos. – Jignesh

+0

Это решение для перенаправления работало отлично! Благодаря! – scader

+0

Извините мое высокое невежество - но это похоже на то, что мне нужно - как это реализовать? – TheGeekZn

0

я соединял метод расширения некоторого времени назад, чтобы очистить и электронную почту мне удаленные рабочие места по пятницам из нескольких мест работы. Я разместил код в консольном приложении и связал приложение с Планировщиком задач Windows.

// Scrapes html pages from given Uri 
// Usage: this.Literal1.Text = new System.Uri("https://www.amazon.com/gp/goldbox/ref=nav_cs_gb").Scrape(); 
public static string Scrape(this System.Uri uri) 
{ 
    using (var sr = new System.IO.StreamReader(System.Net.HttpWebRequest.Create(uri.GetLeftPart(System.UriPartial.Query)).GetResponse().GetResponseStream())) 
    { 
     return sr.ReadToEnd(); 

    } 

} 
Смежные вопросы