Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Crawler / 13 сообщений из 13, страница 1 из 1
16.01.2005, 20:56
    #32866814
Nis
Nis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
public string getsource(string url)

{

try

{

System.Net.WebClient MyWebClient=new System.Net.WebClient();
byte[] MyDatabuffer=MyWebClient.DownloadData(url);
return System.Text.Encoding.ASCII.GetString(MyDatabuffer);

}



столкнулся с проблемой что не всегда получаю тот код который получаю при View-->Source
Пробовал также использовать HttpWebRequest, HttpWebResponse...
Не помогает...
Что делать ???
...
Рейтинг: 0 / 0
17.01.2005, 10:23
    #32867143
Serg****
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
А что получаешь? часть кода или что-то другое?
и в каких случаях?
...
Рейтинг: 0 / 0
17.01.2005, 10:53
    #32867214
Nis
Nis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
получаю совсем другой код.
это происходит в редких случаях, в сайтах как: miniclip.com, expedia.com
...
Рейтинг: 0 / 0
17.01.2005, 16:57
    #32868446
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Вероятно, стоит заменить http-заголовок User-Agent на тот же, который отсылает твой браузер ( в котором ты смотришь исходный код). Так как hhtp-сервер (тот же IIS) может содержать различные шаблоны страниц для различных агентов.

PS: Насчет кодировки - в http-заголовках возвращается кодировка ответа сервера и вместо

> System.Text.Encoding.ASCII

стоит использовать ее
...
Рейтинг: 0 / 0
17.01.2005, 19:41
    #32868825
Nis
Nis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Roman S. Golubin
PS: Насчет кодировки - в http-заголовках возвращается кодировка ответа сервера и вместо

> System.Text.Encoding.ASCII

стоит использовать ее

а можно подробнее про кодировку...
пример случайно не найдётся ?
...
Рейтинг: 0 / 0
18.01.2005, 11:21
    #32869546
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Nisа можно подробнее про кодировку...
пример случайно не найдётся ?

Ну, примерно так (не могу гарантировать, что всегда будет работать правильно):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
static void Main(){
  string URL = "http://localhost";
  string charset = "us-ascii";
  WebClient client = new WebClient();
		
  byte[] bytes = client.DownloadData(URL);

  Regex ex = new Regex(@".*;\s*charset=(?<charset>[^\s;]*)");

  Match m = ex.Match(client.ResponseHeaders["Content-Type"]);
  if( m.Success )
    charset = m.Groups["charset"].Value;
  string s = System.Text.Encoding.GetEncoding(charset).GetString(bytes);
}

--
WBR, Roman S. Golubin

PS: Заголовков может быть море... рекомендую ознакомиться с RFC на протокол HTTP на сайте www.ietf.org ...
...
Рейтинг: 0 / 0
18.01.2005, 13:06
    #32869909
Nis
Nis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
спасибо!!! Но мне это не помогло :(
нашел, следующую функцию, но и она не помогает



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
private StreamReader DecodeData(WebResponse w) {
			// first see if content length header has charset = calue
			String charset = null;
			String ctype = w.Headers["content-type"];
			if(ctype != null) {
				int ind = ctype.IndexOf("charset=");
				if(ind != -1) {
					charset = ctype.Substring(ind + 8);
				}
			}

			// save data to a memorystream
			MemoryStream rawdata = new MemoryStream();
			byte [] buffer = new byte[1024];
			Stream rs = w.GetResponseStream();
			int read = rs.Read(buffer,0,buffer.Length);
			while(read > 0) {
				rawdata.Write(buffer,0,read);
				read = rs.Read(buffer,0,buffer.Length);
			}

			rs.Close();

			//
			// if ContentType is null, or did not contain charset, we search in body
			//
			if(charset == null) {
				MemoryStream ms = rawdata;
				ms.Seek(0,SeekOrigin.Begin);

				StreamReader srr = new StreamReader(ms,Encoding.ASCII);
				String meta = srr.ReadToEnd();
          
				if(meta != null) {
					int start_ind = meta.IndexOf("charset=");
					int end_ind = -1;
					if(start_ind != -1) {
						end_ind = Math.Min(meta.IndexOf("\"", start_ind),meta.IndexOf("'", start_ind));
						end_ind = Math.Min(end_ind,meta.IndexOf("/", start_ind));
						end_ind = Math.Min(end_ind,meta.IndexOf(">", start_ind));
						if(end_ind != -1) {
							int start = start_ind + 8;
							charset = meta.Substring(start, end_ind - start + 1);
							charset = charset.TrimEnd(new Char[] { '>','"','\'','/' });
						}
					}
				}
			}

			Encoding e = null;
			try
			{
				if (charset == null) 
				{
					e = Encoding.ASCII; //default encoding
				} 
				else 
				{
					e = Encoding.GetEncoding(charset);
				}
			}
			catch (Exception ex)
			{
				string str = ex.ToString();
				e = Encoding.ASCII;
			}

			rawdata.Seek(0,SeekOrigin.Begin);
			StreamReader sr = new StreamReader(rawdata, e);
			
			return sr;
		}


я думаю что проблема с expedia.com вовсе не в кодировке...
я получил следующую строчку применив ascii:

tScripting must be enabled before you can continue.\r\n\tTo enable scripting, you need to make a simple adjustment to your browser settings.<BR><BR>\r\n\t\r\n\t<A HREF=\"/pubspec/help/ENU1033/h_ex_actscrpt.htm\">Click here if you need more help with your browser.</A><BR><BR>\r\n\t<B>After you have enabled
scripting refresh this page.
...
Рейтинг: 0 / 0
18.01.2005, 14:11
    #32870156
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Nisя думаю что проблема с expedia.com вовсе не в кодировке...
я получил следующую строчку применив ascii:

tScripting must be enabled before you can continue.\r\n\tTo enable scripting, you need to make a simple adjustment to your browser settings.<BR><BR>\r\n\t\r\n\t<A HREF=\"/pubspec/help/ENU1033/h_ex_actscrpt.htm\">Click here if you need more help with your browser.</A><BR><BR>\r\n\t<B>After you have enabled
scripting refresh this page.

Дык, выше было сказано - Заголовок "User-Agent" выстави в Mozilla/4.0/Internet Explorer ... что-то там... как обычный IE его отдает. Вероятность что заработает будет выше на порядок, т.к. сервер первым делом проверяет именно его и локальные переменные типа IsScriptingSupported (или вроде того) проставляет, а потом уже отдает твое сообщение дольше обработчику запроса. Тот видит, что скрипты не поддерживаются твоим агентом и посылает тебе такой ответ.

Если и это не заработает, то, вероятно, придется еще какие-то заголовки добавлять. Полное описание смотри в rfc по HTTP на ietf.org или www.w3c.org

--
Удачи, Roman S. Golubin

PS: А то что у тебя написано делает тоже самое что и мой пример... а потом занимается полной фигней (не определив тип контекста роет его на предмет тегов :-) которых в нем может и не быть вовсе)
...
Рейтинг: 0 / 0
18.01.2005, 14:48
    #32870283
Nis
Nis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
авторЗаголовок "User-Agent" выстави в Mozilla/4.0/Internet Explorer
пробовал... это... и многое другое...
в rfc копаться, времени пока нет...
если что найду, напишу...
...
Рейтинг: 0 / 0
21.01.2005, 16:12
    #32877682
marina milanina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Заголовок HOST надо добавить и поместить туда доменное имя, к которому вы обращаетесь (напр. Host: roller.ru)
Скорей всего поможет
Дело в том, что большинство веб-серверов позволяет на один ip-адрес навесить несколько веб-сайтов
При запросе к такому веб-серверу, конкретный сайт определяется по заголовку HOST
...
Рейтинг: 0 / 0
21.01.2005, 16:18
    #32877709
marina milanina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Вот пример кода:
Код: plaintext
myWebClient.Headers.Add("Header","roller.ru");


В некоторых случаях, для получения нужного кода надо ставить еще и http-referer (для получения результатов работы динамических скриптов, проверяющих этот параметр (счетчиков, как правило))
Код: plaintext
myWebClient.Headers.Add("Referer","roller.ru");
...
Рейтинг: 0 / 0
22.01.2005, 23:47
    #32878728
marina milanina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Сорри, очепяталась. Первый пример конечно такой:

Код: plaintext
myWebClient.Headers.Add("Host","roller.ru");
...
Рейтинг: 0 / 0
23.01.2005, 18:13
    #32878976
Nis
Nis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Crawler
Большое спасибо за совет!
Но результат тот-же, тоесть результата нет.
А после выполнения:
Код: plaintext
MyWebClient.Headers.Add("Host","expedia.com");
при вызове метода:
Код: plaintext
MyWebClient.DownloadData(url);
получаю: Exception - An exception occurred during a WebClient request.
Но все равно спасибо!
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Crawler / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]