zoukankan      html  css  js  c++  java
  • 最近写的豆瓣红心音乐下载器分析和总结 (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.歌曲列表已经提取出来了。剩下的就是要获取歌曲的链接。

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

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

  • 相关阅读:
    盒子垂直水平居中
    Sahi (2) —— https/SSL配置(102 Tutorial)
    Sahi (1) —— 快速入门(101 Tutorial)
    组织分析(1)——介绍
    Java Servlet (1) —— Filter过滤请求与响应
    CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
    JBoss Wildfly (1) —— 7.2.0.Final编译
    CAS (7) —— Mac下配置CAS 4.x的JPATicketRegistry(服务端)
    CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解
    CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  • 原文地址:https://www.cnblogs.com/doutu/p/3000687.html
Copyright © 2011-2022 走看看