我曾尝试使用phantomjs,节点中的cheerio和C#中的webBrowser控件来获取我的歌曲列表, 我可以成功获得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位的歌曲“Set me free”,但是不能在歌曲列表中获得大约70的“This Love”。 (两首歌肯定在网站上)
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;
}
答案 0 :(得分:1)
对于WebBrowser示例,事件是否实际触发?
尝试在导航前关联事件:
即。将这些行换成以下内容:
webBrowser1.DocumentCompleted + = webBrowser1_DocumentCompleted;
WebBrowser1.Navigate时( “http://grooveshark.com/#!/shinningstar1001/collection”);
此外,DocumentCompleted可能会为每个子文档(如CSS样式表)触发,因此请确保您正在捕获您所访问的URL的事件。
void BrowserDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
//The page is finished loading
}
此处有更多详情:Detect WebBrowser complete page loading
最终解决方案 - 内容从另一个来源传输到主页面,因此寻找目标div是最佳解决方案:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// If the ReadyState is Complete then the page or an iFrame within have completed downloading.
if (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
return;
// Ensures only the first match of page-content is resturned to the RichTextBox.
// If this does not contain what you are looking for then you may need to find an
// additional way to refine for the content you are after.
if (richTextBox1.Text.Length > 0) return;
// Check to see if we have got the page-content div in our result source
// and set the richtextbox if we have it.
var songList = webBrowser1.Document.GetElementById("page-content");
if (songList != null)
{
richTextBox1.Text = songList.OuterHtml;
}
}