Я попытался использовать phantomjs, cheerio в узле и элемент управления webBrowser на C #, чтобы получить свой список песен, я могу успешно получить html, но без списка песен я не могу понять, почему я не могу его получить ...
Единственный способ, которым я могу это сделать, - это скопировать html с помощью инструмента разработчика и проанализировать его с помощью JQuery.
Вот мой код в WinForm:
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("http://grooveshark.com/#!/shinningstar1001/collection");
webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
}
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
File.WriteAllText("D://test.txt", webBrowser1.DocumentText);
}
В Cheerio:
var cheerio = require('cheerio');
var request = require('request');
var url = 'http://grooveshark.com/#!/shinningstar1001/collection';
request({
url: url,
headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
}, function (err, resp, body) {
$ = cheerio.load(body);
console.log(body);
})
Я думаю, это потому, что я не могу получить полный документ после загрузки ajax?
Но почему WebBrowser Control тоже не работает? Я вижу, что в элемент управления загружено полное содержимое. Любой совет буду очень признателен.
Я пробовал решение @Murray Foxcroft, все еще не могу получить именно тот html, который мне нужен:
Дополнительный вопрос
С помощью решения @Murray Foxcroft я могу получить 8% содержимого списка, но почему я не могу получить полный список песен, который отображается на странице? Например, я могу получить песню «Освободи меня», которая находится примерно на 40-м месте в списке, но не могу получить «This Love», которая находится примерно на 70-м месте в списке. (Две песни точно есть на сайте)
if (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
return;
if (richTextBox1.Text.Length > 0) return;
var songList = webBrowser1.Document.GetElementById("profile-grid");
//try to get "This Love" that never step into the code:
if (songList != null && songList.InnerHtml.Contains("This Love")){...}
//"Set Me Free" is OK:
if (songList != null && songList.InnerHtml.Contains("Set Me Free"))
{
richTextBox1.Text = songList.OuterHtml;
}