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