2016-03-26 3 views
2

После того как я узнал кое-что о разных технологиях, я хотел создать небольшой проект с использованием UWP + NoSQL. Я хотел сделать небольшое приложение UWP, которое захватывает гороскоп и отображает его на моей малине Pi каждое утро.Извлечь содержимое веб-страницы, как браузер

Так что я взял WebClient, и я следующее:

WebClient client = new WebClient(); 
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
string downloadString = client.DownloadString("http://www.horoscope.com/us/horoscopes/general/horoscope-general-daily-today.aspx?sign=2"); 

Но, кажется, что он обнаруживает, что этот запрос не приходит из браузера, так как интересная часть не в содержании (и когда я проверяю браузер, он находится в исходном HTML, по мнению скрипача).

Я также пробовал с ScrapySharp, но я получил тот же результат. Любая идея почему?

(я уже сделал часть UWP, так что я не хочу, чтобы изменить тему моего личного проекта только потому, что обнаруживается как «боты»)

EDIT

Кажется, я был недостаточно ясен. Вопрос ** не *, что я не могу разобрать HTML, проблема в том, что я не получаю ожидаемого HTML при использовании ScrapySharp/WebClient

EDIT2

Вот что я получить: http://pastebin.com/sXi4JJRG

И я не получаю (на примере) в «звезда рейтинги по домену» + соответствующие изображения для каждой звезды

+0

Я попытался найти этот XML, но не смог. Не могли бы вы немного объяснить, где это? – ganchito55

+0

@ ganchito55 Извините, я имел в виду исходный HTML, а не XML. Я просто сказал, что он не загружается в ajax-вызов. – J4N

+0

Вы пробовали пакет гибкости HTML? –

ответ

0

ОК, я думаю, что знаю, что происходит: я сравнивал реальный вывод (без каких-либо строк пользовательского агента) с выходом, предоставленным вашим pastebin, и нашел что-то интересное. В строке 213, ваш Pastebin имеет:

<li class="dropdown"><a href="/us/profiles/zodiac/index-profile-zodiac-sign.aspx" class="dropdown-toggle" data-hov...ck">Forecast Tarot Readings</div> 

виду data-hov...ck ближе к концу. В реальной продукции, это:

<li class="dropdown"><a href="/us/profiles/zodiac/index-profile-zodiac-sign.aspx" class="dropdown-toggle" data-hover="dropdown" data-toggle="link">Astrology</a> 

следует около 600 строк коды, включая вышеупомянутый «интересный». В строке 814, он говорит:

<div class="bot-explore-col-subtitle f14 blocksubtitle black">Forecast Tarot Readings</div> 

, который, начиная с ск в черном, совпадает с остальной частью выходного Pastebin. Таким образом, либо пастебин конденсировал выход, либо исходный результат был.

Я создал новое консольное приложение, вставить код, и получил результат я ожидал, в том числе 600 строк HTML вы, кажется, не пропустите:

static void Main(string[] args) 
{ 
    WebClient client = new WebClient(); 
    client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
    string downloadString = client.DownloadString("http://www.horoscope.com/us/horoscopes/general/horoscope-general-daily-today.aspx?sign=2"); 

    File.WriteAllText(@"D:\Temp\source-mywebclient.html", downloadString); 
} 

Мои WebClient составляет от System.Net. И изменение UserAgent вряд ли имеет какой-либо эффект, несколько ссылок немного разные.

Итак, чтобы подвести итог: ваша проблема не имеет ничего общего с содержимым, которое динамически вставлено после первоначального get, но, возможно, с webclient в сочетании с UWP. Еще один вопрос, касающийся веб-клиента и UWP на сайте: (UWP) WebClient and downloading data from URL in, который утверждает, что вы должны использовать HttpClient. Может быть, это решение?

1

Вы можете прочитать все содержимое веб-страницы, используя фрагмент кода, как показано ниже :

internal static string ReadText(string Url, int TimeOutSec) 
{ 
    try 
    { 
     using (HttpClient _client = new HttpClient() { Timeout = TimeSpan.FromSeconds(TimeOutSec) }) 
     { 
      _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html")); 
      using (HttpResponseMessage _responseMsg = _client.GetAsync(Url)) 
      { 
       using (HttpContent content = _responseMsg.Content) 
       { 
        return content.ReadAsString(); 
       } 
      } 
     } 
    } 
    catch { throw; } 
} 

Или просто:

public static void DownloadString (string address) 
{ 
    WebClient client = new WebClient(); 
    string reply = client.DownloadString (address); 

    Console.WriteLine (reply); 
} 

(ре: https://msdn.microsoft.com/en-us/library/fhd1f0sw(v=vs.110).aspx)

+0

Уже делалось это, проблема в том, что я не получаю тот же HTML-контент, который спрашивал у браузера. Кажется, что сервер обнаруживает, что я спрашиваю приложение, и возвращает мне только структуру веб-сайта без интереса. – J4N

1

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

Для решения проблемы вам понадобится «безголовый браузер». Я знаю два проекта для этого (я никогда не попробовать оны его):

http://webkitdotnet.sourceforge.net/ - это, кажется устаревшим

http://www.awesomium.com/

+0

Но, как я уже упоминал, контент присутствовал в исходном HTML-файле, который я получил внутри скрипача, поэтому он hasn 't был загружен внутри вызова ajax – J4N

+0

Это странно. Просто попробовал свой код и получил HTML-код с гороскопом. Я могу предположить, что вы можете быть запрещены для многих запросов во время тестирования. –

+0

Я только что протестировал его из другой сети, другого компьютера и получил тот же результат. Я опубликовал результат в ссылке pastebin (в моем основном вопросе). Вы уверены, что у вас есть интересная часть, а не только какой-то HTML? – J4N

0

Некоторое время назад я использовал http://www.nrecosite.com/phantomjs_wrapper_net.aspx он работал хорошо, и, как Антон упомянутый это безголовый браузер. Может быть, это поможет.

+0

У вас есть пример, как открыть страницу? Я предполагаю, что это в части PhantomJS, но я не могу найти пример. – J4N

0

Мне интересно, есть ли все «интересная часть», которую вы ожидаете увидеть в содержании? Вам известно о том, что вам нужно получить какие-либо изображения отдельно? Тот факт, что html-страница содержит <image.../> теги, не волшебным образом отображает их. Как вы можете видеть с помощью Fiddler, после получения страницы браузер затем извлекает все изображения, таблицы стилей, javascript и все другие элементы, которые указаны, но не включены в страницу. (вам может понадобиться очистить кеш браузера, чтобы это произошло ...)

+0

Я прекрасно знаю html. Я ожидаю получить элемент изображения и проверить их URL, чтобы определить, что было рейтингом. Как я показал в pastebin в вопросе, кажется, что есть только шаблон веб-сайта (заголовок, меню, нижний колонтитул), но не так много контента – J4N

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

  • Нет связанных вопросов^_^