获得豆瓣FM加心歌曲信息的py脚本

2011年4月13日 18:37

update at 2012.2.29: 传送门 to isnowfy大牛的方法

参考各种资料写的,有个小缺点是需要输入有多少页加心歌曲
改改输出格式应该可以用小众软件里介绍的E音乐盒批量下载吧
当时不知道这个软件,只好又写个爬谷歌音乐的,然后手动下载,真是蛋疼

python 2.7 + BeautifulSoupct

# coding: utf-8

from BeautifulSoup import BeautifulSoup
import urllib,urllib2,cookielib

loginurl='http://www.douban.com/accounts/login'
url='http://douban.fm/mine?start=%d&type=liked'
captchaurl='http://www.douban.com/misc/captcha?id=%s&size=s'
email=raw_input('email:')
passwd=raw_input('passwd:')
pages=int(raw_input('pages:'))

cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)

content=urllib2.urlopen(loginurl).read()

postdata=urllib.urlencode({
    'source':'simple',
    'form_email':email,
    'form_password':passwd,
    #'captcha-id':captchaid,
    #'captcha-solution':raw_input('code in pic:'),
    #'user_login':'登录',
})

req = urllib2.Request( url = loginurl, data = postdata)
content=urllib2.urlopen(req).read()

if opener.open(req).geturl() == 'http://www.douban.com/':
    print 'login success!'
    for i in range(pages):
        content=urllib2.urlopen(url % (i*9,)).read()
        soup=BeautifulSoup(str(content))
        for tr in soup.findAll('tr')[1:]:
            td=tr.findAll('td')
            print td[0].string,td[1].span.string #,td[1].a.string # title artist album
else:
    print 'login fault'

 

update:登录方式有变化,douban现在会对频繁登录的ip加验证码,总之此代码有时效性,仅供参考

另附一个从baidu爬歌曲url的脚本,把上面脚本的结果保存成文件,再用这个脚本得到url,最后再用downthemall或迅雷批量下载,多么蛋疼

# coding: utf-8

import sys,os,urllib2,xml
from xml.dom import minidom

lc = sys.getfilesystemencoding()

baseurl0="http://box.zhangmen.baidu.com/x?op=7&mode=1&count=1&listid=&title=%s"
baseurl1="http://box.zhangmen.baidu.com/x?op=12&count=1&mtype=4&title=%s"

f=open('list.txt','r')
for eachline in f.readlines():
    song=eachline#raw_input('Song name:').decode(lc).encode('gbk')
    try:
        data=urllib2.urlopen(baseurl0 % urllib2.quote(song))
        data=data.read().replace('gb2312','utf-8').decode('gbk').encode('utf8')
    except:
        print 'failed on '+eachline
        continue
    doc=minidom.parseString(data) # 丫真挑剔
    names=doc.getElementsByTagName('name')
    if not names:
        print 'failed on '+eachline
        continue
    count=0
   #for i in names:
       #print count,i.firstChild.nodeValue.replace('$',' ').encode(lc)
       #count+=1

    choice=0#int(raw_input('\nyour choice:'))
    data=urllib2.urlopen(baseurl1 % urllib2.quote(names[choice].firstChild.nodeValue.encode('gbk')))
    data=data.read().replace('gb2312','utf-8').decode('gbk').encode('utf8')
    doc=minidom.parseString(data)
    urls=doc.getElementsByTagName('url')

   #print '\n song urls:'
   #for i in urls:
    i=urls[0]
    try:
        t=i.childNodes
        pos=t[0].firstChild.nodeValue.rfind('/')
        prefix=t[0].firstChild.nodeValue[0:pos+1]
        suffix=t[1].firstChild.nodeValue
        print prefix+suffix
    except:
        print 'failed on '+eachline

raw_input('\nEnter to exit ...')

 

评论(3) 阅读(3487)

django中使用css静态文件

2011年4月06日 16:21

使用的是django 1.3

编辑settings.py,设置static路径,静态文件会被收集到这里:

STATIC_ROOT = 'static'

设置static_url,预设了,不用动:

STATIC_URL = '/static/'

设置静态文件路径,静态文件会从这里收集:

STATICFILES_DIRS = (
    'MYAPP/static',
)

在MYAPP下递归建立static/css/foo.css文件和文件夹

模板中可写成: <link href="/static/css/foo.css" rel="stylesheet" type="text/css">

运行manage.py collectstatic进行收集就可以了

ref:http://docs.djangoproject.com/en/dev/howto/static-files/

评论(0) 阅读(3755)

tkinter 小计时器

2011年3月30日 19:48

为了学英语,还是自己写个计时器吧,可以正计时和倒计时.

翻出来以前的tkinter的笔记,又从网上搜了搜Thread的资料,没想到做着做着就花了好几个小时,居然还写得这么长......不过挺好玩儿的,那就贴出来吧

update:

在线程里使用tkMessageBox一直失败,在这里找到了解决方案,现在时间到了可以有弹出窗了

# coding: utf-8
from Tkinter import *
from threading import Thread
from tkMessageBox import showinfo
import time,tkMessageBox

class Timer(Thread):
    over=False
    pause=False
    def __init__(self,func):
        Thread.__init__(self)
        self.func=func
        #self.setDaemon(True)
    def run(self):
        global t,root
        time.sleep(1)
        finish=False
        while not self.over and not finish:
            if not self.pause:
                finish=self.func()
            time.sleep(1)
        if finish:
            #root.focus_force()
            root.event_generate('<<pop>>',when='tail')
        t=None
    def kill(self): self.over=True
    def paus(self): self.pause=True
    def cont(self): self.pause=False

t=None
sec=None
root=Tk()
root.bind('<<pop>>',lambda event=None: showinfo('Oh!','Time is over!'))
e1=StringVar()
e2=StringVar()

def show():
    global e1,e2,sec
    e1.set('%.2d'%(sec/60))
    e2.set('%.2d'%(sec%60))
def down():
    global sec
    if sec:
        sec-=1;show()
        return False
    else: return True
def up():
    global sec
    sec+=1;show()
    return False
    
def st():
    global sec,t
    if t:t.cont();return
    sec=0;show()
    t=Timer(up)
    t.start()

def cd():
    global sec,t
    if t:t.cont();return
    sec=0
    try: sec=int(e1.get())*60
    except Exception:pass
    try: sec+=int(e2.get())
    except Exception:pass
    if not sec: return
    show()
    t=Timer(down)
    t.start()

    pass
def pus():
    global t
    t.paus()

def stp():
    global t,sec
    sec=0;show()
    if t: t.kill()
    t=None

en1 = Entry (root, textvariable = e1 ,width=10 ,justify=RIGHT)
en2 = Entry (root, textvariable = e2 ,width=10)
lb = Label (root, text = ':' )
stbtn = Button(root ,width=10,text= 'start',command =st)
cdbtn = Button(root ,width=10,text= 'countdown',command =cd)
pusbtn = Button(root ,width=10,text= 'pause',command =pus)
stpbtn = Button(root ,width=10,text= 'stop',command =stp)

en1.grid(row = 0 ,column = 0,)
lb .grid(row = 0 ,column = 1)
en2.grid(row = 0 ,column = 2)
stbtn.grid(row = 1 ,column = 0)
cdbtn.grid(row = 1 ,column = 2)
pusbtn.grid(row = 2 ,column = 0)
stpbtn.grid(row = 2 ,column = 2)

root.geometry('+500+400')
root.mainloop ()

 

评论(0) 阅读(2482)

opengl 鼠标3D旋转简单实现

2011年3月27日 22:45

渣代码,就不解释了

update:整理了一下渣代码

update: 加了些解释

#include <GL/glut.h>
#include <math.h>
#include <stdio.h>

static float c=M_PI/180.0f; //弧度和角度转换参数
static int du=90,oldmy=-1,oldmx=-1; //du是视点绕y轴的角度,opengl里默认y轴是上方向
static float r=1.5f,h=0.0f; //r是视点绕y轴的半径,h是视点高度即在y轴上的坐标

void display(void) 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //printf("At:%.2f %.2f %.2f\n",r*cos(c*du),h,r*sin(c*du)); //这就是视点的坐标
    glLoadIdentity();
    gluLookAt(r*cos(c*du), h, r*sin(c*du), 0, 0, 0, 0, 1, 0); //从视点看远点,y轴方向(0,1,0)是上方向

    glColor3f(1.0f, 0.0f, 0.0f);
    glutWireTeapot(0.5f);

    glFlush();
    glutSwapBuffers();
}
void Mouse(int button, int state, int x, int y) //处理鼠标点击
{
    if(state==GLUT_DOWN) //第一次鼠标按下时,记录鼠标在窗口中的初始坐标
        oldmx=x,oldmy=y;
}
void onMouseMove(int x,int y) //处理鼠标拖动
{
    //printf("%d\n",du);
    du+=x-oldmx; //鼠标在窗口x轴方向上的增量加到视点绕y轴的角度上,这样就左右转了
    h +=0.03f*(y-oldmy); //鼠标在窗口y轴方向上的改变加到视点的y坐标上,就上下转了
    if(h>1.0f) h=1.0f; //视点y坐标作一些限制,不会使视点太奇怪
    else if(h<-1.0f) h=-1.0f;
    oldmx=x,oldmy=y; //把此时的鼠标坐标作为旧值,为下一次计算增量做准备
}
void init()
{
    glEnable(GL_DEPTH_TEST);
}
void reshape(int w,int h)
{
    glViewport( 0, 0, w, h );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(75.0f, (float)w/h, 1.0f, 1000.0f);
    glMatrixMode( GL_MODELVIEW );
}
int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(400, 400); 
    glutCreateWindow("OpenGL"); 
    init();
    glutReshapeFunc( reshape );
    glutDisplayFunc(display); 
    glutIdleFunc(display);  //设置不断调用显示函数
    glutMouseFunc(Mouse);
    glutMotionFunc(onMouseMove);
    glutMainLoop(); 
    return 0; 
}  

 

评论(3) 阅读(9607)

poj 2762 半连通图判断

2011年3月22日 19:59

昨天算法课讲了强连通kosaraju算法,今天做课后题看到半连通问题,好久没做题了,就想写一写,证明自己的一些想法,结果悲剧了,各种无语的小错误......

题意其实就是判断图是否是半连通的,强连通缩点后:

1.拓扑排序判断每次队列中是否只有一个元素,看来的

#include <cstdio>
#include <cstring>
#include <vector>
#include <deque>
#include <cstdlib>
using namespace std;

int T,n,m;
bool vit[1001];
int ind[1001];
int mark[1001],scc;
deque<int> f;
vector<int> g[1001];
vector<int> gt[1001];
bool chong[1001][1001];
vector<int> *gs=gt;
void dfs(int s);
void dfsmain()
{
    memset(vit,false,sizeof(vit));
    f.clear();
    for(int i=1;i<=n;i++)
        if(!vit[i]) dfs(i);
}
void dfs(int s)
{
    vit[s]=1;
    for(unsigned i=0;i<g[s].size();i++)
        if(!vit[g[s][i]]) dfs(g[s][i]);
    f.push_front(s);
}
void tdfs(int s);
void tdfsmain()
{
    memset(mark,0,sizeof(mark));scc=0;
    memset(vit,0,sizeof(vit));
    while(!f.empty())
    {
        int u=f.front();f.pop_front();
        if(!vit[u])
            ++scc,tdfs(u);
    }
}
void tdfs(int s)
{
    vit[s]=1;mark[s]=scc;
    for(unsigned i=0;i<gt[s].size();i++)
        if(!vit[gt[s][i]]) tdfs(gt[s][i]);
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in","r",stdin);
    freopen("out","w",stdout);
#endif
    int u,v;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            g[i].clear(),gt[i].clear();
        while(m--)
        {
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            gt[v].push_back(u);
        }
        dfsmain();
        tdfsmain();
        //for(int i=1;i<=n;i++)
            //printf("%d ",mark[i]);
        //puts("");

        memset(ind,0,sizeof(ind));
        memset(chong,0,sizeof(chong));
        for(int i=1;i<=scc;i++)
            gs[i].clear();
        for(u=1;u<=n;u++)
            for(unsigned i=0;i<g[u].size();i++)
            {
                v=g[u][i];
                if(mark[u]!=mark[v] && !chong[mark[u]][mark[v]])
                    gs[mark[u]].push_back(mark[v]),
                        ind[mark[v]]++, chong[mark[u]][mark[v]]=1;
            }
        deque<int> q;
        for(int i=1;i<=scc;i++)
            if(!ind[i])
                q.push_back(i);
        bool failed=0;
        while(!q.empty())
        {
            if(q.size()!=1)
            {failed=1; break;}
            int u=q.front();q.pop_front();
            for(unsigned i=0;i<gs[u].size();i++)
            {
                int v=gs[u][i];
                if(--ind[v]==0)
                    q.push_back(v);
            }
        }
        if(failed)
            puts("No");
        else
            puts("Yes");
    }
}

2.或者直接dfs狂搜(不管是否已vit),得到dfs的最大深度,是否等于点数,看所有点是否能在一条路上,代码好写.

#include <cstdio>
#include <cstring>
#include <vector>
#include <deque>
#include <cstdlib>
using namespace std;

int T,n,m;
bool vit[1001];
int ind[1001];
int mark[1001],scc;
deque<int> f;
vector<int> g[1001];
vector<int> gt[1001];
bool chong[1001][1001];
vector<int> *gs=gt;
void dfs(int s);
void dfsmain()
{
    memset(vit,false,sizeof(vit));
    f.clear();
    for(int i=1;i<=n;i++)
        if(!vit[i]) dfs(i);
}
void dfs(int s)
{
    vit[s]=1;
    for(unsigned i=0;i<g[s].size();i++)
        if(!vit[g[s][i]]) dfs(g[s][i]);
    f.push_front(s);
}
void tdfs(int s);
void tdfsmain()
{
    memset(mark,0,sizeof(mark));scc=0;
    memset(vit,0,sizeof(vit));
    while(!f.empty())
    {
        int u=f.front();f.pop_front();
        if(!vit[u])
            ++scc,tdfs(u);
    }
}
void tdfs(int s)
{
    vit[s]=1;mark[s]=scc;
    for(unsigned i=0;i<gt[s].size();i++)
        if(!vit[gt[s][i]]) tdfs(gt[s][i]);
}
int maxl;
void finaldfs(int s,int l)
{
    if(l>maxl) maxl=l;
    for(unsigned i=0;i<gs[s].size();i++)
        finaldfs(gs[s][i],l+1);
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in","r",stdin);
    freopen("out","w",stdout);
#endif
    int u,v;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            g[i].clear(),gt[i].clear();
        while(m--)
        {
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            gt[v].push_back(u);
        }
        dfsmain();
        tdfsmain();
        //for(int i=1;i<=n;i++)
            //printf("%d ",mark[i]);
        //puts("");

        memset(ind,0,sizeof(ind));
        memset(chong,0,sizeof(chong));
        for(int i=1;i<=scc;i++)
            gs[i].clear();
        for(u=1;u<=n;u++)
            for(unsigned i=0;i<g[u].size();i++)
            {
                v=g[u][i];
                if(mark[u]!=mark[v] && !chong[mark[u]][mark[v]])
                    gs[mark[u]].push_back(mark[v]),
                        ind[mark[v]]++, chong[mark[u]][mark[v]]=1;
            }
        maxl=0;
        for(int i=1;i<=scc;i++)
            if(!ind[i])
                finaldfs(i,1);
        if(maxl==scc)
            puts("Yes");
        else
            puts("No");
    }
}

 

评论(0) 阅读(2536)