Python爬虫实践:从中文歌词库抓取歌词

来源:互联网 发布:考勤工资软件 编辑:程序博客网 时间:2024/05/21 22:25

利用BeautifulSoup库构建一个简单的网络爬虫,从中文歌词库网站抓取凤凰传奇所有曲目的歌词(http://www.cnlyric.com/geshou/1927.html)。

from urllib.request import urlopenfrom bs4 import BeautifulSoupimport reimport numpyimport csvstarturl="http://www.cnlyric.com/geshou/1927.html" # 凤凰传奇歌词地址第一页# 找出下一页的链接def findnextlinks(starturl,nextlinks):    """ 该函数用于从starturl页面开始,递归找出所有“下一页”的链接地址    要求nextlinks为一个空的列表"""    try:        html=urlopen(starturl)        bsobj=BeautifulSoup(html,"lxml")        nextpagelink=bsobj.find("div",{"class":"PageList"}).input.\        previous_sibling.previous_sibling.attrs["href"]        nextlink="http://www.cnlyric.com/geshou/"+nextpagelink        nextlinks.append(nextlink)        findnextlinks(nextlink,nextlinks)    except:        print("\n所有“下一页”的链接寻找完毕")    return nextlinksnextlinks=[]nextlinks=findnextlinks(starturl,nextlinks) # 所有“下一页”的链接列表# 找出存放歌词的链接列表def findlrclinks(urllists):    """ 该函数用于找出列表urllists中的链接页面上存放歌词的链接 """    Sites=[]    for urllist in urllists:        html=urlopen(urllist)        bsobj=BeautifulSoup(html,"lxml")        for link in bsobj.findAll(href=re.compile("^(../LrcXML/)")):            site="http://www.cnlyric.com"+link.attrs["href"].lstrip("..")            Sites.append(site)    return Sitesnextlinks.insert(0,starturl) # 将开始页面也加入链接列表中Sites=findlrclinks(nextlinks) # 找出所有存放歌词的链接print("\n所有曲目歌词所在的xml文件链接寻找完毕")def getlrc(lrclink):    """ 该函数用于找出歌词链接lrclink中的歌词,并以列表形式保存 """    LRC=[]    html=urlopen(lrclink)    bsobj=BeautifulSoup(html,"lxml")    lrcpre=bsobj.findAll("lrc")    for lrclabel in lrcpre:        lrc=lrclabel.get_text()        LRC.append(lrc)    return LRCcsvfile=open("凤凰传奇歌词集.csv","w+") # 创建csv文件用于保存数据try:    writer=csv.writer(csvfile)    rowindex=1    for lrcurl in Sites:        LRC=getlrc(lrcurl)        LRC.insert(0,str(rowindex).zfill(3))        writer.writerow(LRC) # 将每首哥编号并将歌词写入从中文件中        rowindex+=1finally:    csvfile.close() # 关闭csv文件

运行结果:

这里写图片描述

参考资料:Ryan Mitchell著,陶俊杰,陈小莉译《Python网络数据采集》

1 0