Crawler همونطور که در متن هم نوشته شده دست سازه و مهم نیست و تابع GetXHtmlFromUri میتونه مثل نمونه زیر باشه و دقت کنید خالی نبودن UseAgent خیله مهمه وگرنه ارور The remote server returned an error: (409) Conflict رو میده.
من با همین تابع یک سایت فارسی رو چک کردم و اروری نداد و متن فارسی قابل کوئری گرفتن بود.
کاملتر و با ارور هندلینگ بهترش رو میتونید در برنامه مفید
plrip آقای وحید نصیری ببینید
private static HtmlDocument GetXHtmlFromUri(string uri) {
HtmlDocument htmlDoc = new HtmlDocument()
{
OptionCheckSyntax = true,
OptionFixNestedTags = true,
OptionAutoCloseOnEnd = true,
OptionDefaultStreamEncoding = Encoding.UTF8
};
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
//important
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
request.Accept = "text/html";
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
using (var response = request.GetResponse() as HttpWebResponse)
{
using (var stream = response.GetResponseStream())
{
htmlDoc.Load(stream, Encoding.UTF8);
}
}
return htmlDoc;
}
اینم روش دوم که بازم UserAgent باید اضافه بشه
private static HtmlDocument GetXHtmlFromUri2(string uri) {
WebClient client = new WebClient() { Encoding = Encoding.UTF8 };
client.Headers.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
HtmlDocument htmlDoc = new HtmlDocument()
{
OptionCheckSyntax = true,
OptionFixNestedTags = true,
OptionAutoCloseOnEnd = true,
OptionDefaultStreamEncoding = Encoding.UTF8
};
htmlDoc.LoadHtml(client.DownloadString(uri));
return htmlDoc;
}