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.歌曲列表已经提取出来了。剩下的就是要获取歌曲的链接。

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

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

  • 相关阅读:
    使用命令安装laravel 项目
    laravel如何输出最后一条执行的SQL
    Laravel5.4 队列简单配置与使用
    PHP使用RabbitMQ实例
    初识RabbitMQ,附RabbitMQ+PHP演示实例
    Laravel 5.3 单用户登录的简单实现
    redis+thinkphp5的注册、登陆、关注基础例子
    Laravel 5.3 单用户登录的简单实现
    php面试题汇总
    (转)php读取文件使用redis的pipeline导入大批量数据
  • 原文地址:https://www.cnblogs.com/doutu/p/3000687.html
Copyright © 2011-2022 走看看