最近写的豆瓣红心音乐下载器分析和总结 (C#)


    因为觉得豆瓣FM比较不错,唯一觉得不好的就是不能导出到手机上,虽然手机也有豆瓣,但无奈,缓存只有100m,于是就诞生了写一个豆瓣红心表单下载器的想法。花了还是不少时间的。


   过程中遇到的问题如下:

1 验证码问题

   首先我们需要提取出红心表单,我用的webbrowser,这个东西吧单线程容易阻塞,造成ui假死,而且是神马STA,好吧,我百度了也没看太懂是啥意思,我就不用多线程呗,反正这个我觉得也比较好资源。但是我发现红心表单的页面是不止一页的,我需要用webbrowser一张张载入,然后提取我想要的信息,也许你会问为什么要用webbrowser,而不用httpwebrequest来提取呢,好吧,开始的时候发现有验证码啊,有木有( 写了一大半的时候,发现其实有的登陆页面不需要验证码),只好加载文档再提取验证码,这个借用了网上的代码,不过我发现对于有javascript效果的验证码,抓不出来,提取出来的标签是空的,这个一直没搞明白js的验证码怎么提取。


2 webbrowser 同步问题

我懒得去纠结这个问题了,由于我抓取的红心页面不直一张,我必须找出所有的链接,一张张加载,如何同步呢,用的定时器,设置个标志位进行同步就好了,文档的处理要放在documentcomplet,事实证明效果还不错哈。。上图。

   private void DocumentComplet(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

            if (e.Url.ToString().CompareTo(loginpage) >= 0)
            {
                pictureBox1.Image = GetRegCodePic(webBrowser1, "", "", "captcha");
                label6.Text = CheckLogin(webBrowser1.Document);
                return;
            }
            if (e.Url.ToString() == mainpage)//主页跳转到信息页
            {
                webBrowser1.Navigate(infopage);
                label6.Text = "登陆成功,正在获取信息";
                bSubmit.Enabled = false;
                return;
            }
            if (e.Url.ToString() == infopage)
            {
                webBrowser1.Navigate("http://douban.fm/mine?start=0&type=liked");
                return;
            }
            else
            {
                if (e.Url.ToString() != loginpage)
                {

                    if (pageget == 0)// 获取红心表单网页信息
                    {
                        GetInfo(webBrowser1.Document);
                        pageget = 1;//关闭此条件
                        timer1.Interval = 50;
                        timer1.Start();
                    }
                    else
                    {

                        HtmlDocument docu = webBrowser1.Document;
                        HtmlElementCollection coll = docu.GetElementsByTagName("p");//得到所有p标签
                        for (int j = 0; j < coll.Count; j++)
                        {
                            if (coll[j].GetAttribute("classname") == "song_title")
                            {
                                listBox1.Items.Add(coll[j++].InnerText + " - " + coll[j].InnerText);
                            }
                        }
                        ready = false;

                    }
                }

            }




        }
private void timer1_Tick(object sender, EventArgs e)
        {
            if (ready == false)
            {
                if (index < count)
                {
                    webBrowser1.Navigate(pageinfo[index++]);
                    ready = true;
                }
                else
                {
                    timer1.Stop();
                    label4.Text += listBox1.Items.Count.ToString();
                    status = true;
                    progressBar1.Maximum = listBox1.Items.Count;
                }

            }
        }

3.歌曲列表已经提取出来了。剩下的就是要获取歌曲的链接。

   应该可以直接抓到豆瓣的歌曲链接吧。不过我没研究过,直接抓百度吧

   首先要解决的是表单提交问题<未完待续>

原文地址:https://www.cnblogs.com/doutu/p/3000687.html