因为觉得豆瓣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.歌曲列表已经提取出来了。剩下的就是要获取歌曲的链接。
应该可以直接抓到豆瓣的歌曲链接吧。不过我没研究过,直接抓百度吧
首先要解决的是表单提交问题<未完待续>