最近写的豆瓣红心音乐下载器分析和总结 (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.歌曲列表已经提取出来了。剩下的就是要获取歌曲的链接。
应该可以直接抓到豆瓣的歌曲链接吧。不过我没研究过,直接抓百度吧
首先要解决的是表单提交问题<未完待续>