Как смоделировать веб-браузер, чтобы веб-сайт предоставлял мне правильный источник HTML? - PullRequest
2 голосов
/ 23 октября 2009

Я пытаюсь создать веб-сайт, и он, похоже, передает мне фиктивный HTML с помощью метода WebClient.DownloadData ().

Есть ли способ для меня "обмануть" сайт, что я своего рода браузер?

Edit:

Добавление этого заголовка по-прежнему не решает проблему:

Client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

Есть что-то еще, что я могу попробовать? :)

Редактировать 2:

Если это вообще поможет. Я пытаюсь загрузить исходный код поиска ThePirateBay.

Этот URL: http://thepiratebay.org/search/documentary/0/7/200

Как вы можете видеть, источник показывает, что должно, начальная информация для фильмов и т. Д. Но когда я использую метод DownloadData (), я получаю случайные результаты торрента, ничего общего с тем, что я ищу.

Ответы [ 5 ]

4 голосов
/ 23 октября 2009

Попробуйте добавить заголовок пользовательского агента, чтобы он считал вас одним из основных браузеров (IE, FF и т. Д.)

client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
3 голосов
/ 23 октября 2009

Возможно, я что-то упустил, но следующий код работал без проблем:

Regex torrents = new Regex(
    @"<tr>[\s\S]*?<td><a href=""(?<link>.*?)"".*?>" + 
    @"(?<name>.*?)</a>[\s\S]*?<td><a href=""(?<torrent>.*?)""[\s\S]*?>" + 
    @"(?<size>\d+\.?\d*)&nbsp;(?<unit>.)iB</td>");
Uri url = new Uri("http://thepiratebay.org/search/documentary/0/7/200");

WebClient client = new WebClient();
string html = client.DownloadString(url);
//string html = Encoding.Default.GetString(client.DownloadData(url));

foreach (Match torrent in torrents.Matches(html))
{
    Console.WriteLine("{0} ({1:0.00}{2}b)", 
        torrent.Groups["name"].Value, 
        Double.Parse(torrent.Groups["size"].Value), 
        torrent.Groups["unit"].Value);
    Console.WriteLine("\t{0}", 
        new Uri(url, torrent.Groups["link"].Value).LocalPath);
    Console.WriteLine("\t{0}",
        new Uri(torrent.Groups["torrent"].Value).LocalPath);
}
1 голос
/ 23 октября 2009

HTTP - это текстовый протокол, который очень удобочитаем! Подключитесь к сайту с помощью telnet и введите HTTP-запросы вручную. Это позволяет вам полностью контролировать строку агента пользователя и другую связанную информацию. Это также очень просто.

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

Подробнее: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

Я бы разместил ссылки на RFC и страницу Википедии в строке user-agent, но я только что присоединился.

0 голосов
/ 23 октября 2009

Попробуйте распечатать заголовки WebClient - может быть, по умолчанию есть что-то странное, что может указывать на то, что сайт не является браузером?

0 голосов
/ 23 октября 2009
WebClient client = new WebClient ();
client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...