试图在网站上获取歌曲列表不起作用

时间:2014-12-30 11:37:47

标签: c# node.js winforms webbrowser-control cheerio

我曾尝试使用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: enter image description here

其他问题

通过@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;                
        }        

1 个答案:

答案 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;
            }
        }