BeautifulSoup是用Python编写的第三方库,主要用于解析HTML、XML等。在用Python编写爬虫程序的时候,最直观的方法就是用正则表达式匹配想要的信息,然后逐一提取出来,但是在较为复杂的爬虫程序中,往往会发现有些信息用纯粹的正则表达式匹配很困难,或则说书写的正则表达式较为繁琐,程序常常因为正则表达式写得不够健壮而挂掉。而正是BeautifulSoup正是要解决的问题。
对于上述的问题,用BeautifulSoup帮助编写爬虫会带来很大的帮助,一方面可以省去编写繁琐的正则表达式,另一方面,可以很大程度上避免程序由于正则表达式写得不够健壮造成的中断。网上有很多关于BeautifulSoup的教程,也可以通过官方文档获取到更详细的使用说明。在此,笔者将结合一个小爬虫和大家分享一下BeautifulSoup在实际爬虫中的运用。
先介绍下爬虫的流程,程序首先打开百度音乐歌手页面,然后依据标签解析歌手的信息,最后把这些信息打印在控制台上。再来看看页面上的歌手,程序要做的就是把这些歌手的信息打印出来。
再啰嗦下,关于BeautifulSoup的使用,笔者不在此作详细介绍,需要帮助的请直接查看Bs4文档。
OK,进入程序:
想要解析页面文档,首先要获得这个页面的源代码,简单的方法可这样:
def getHtml(url):
request = urllib2.Request(url)
res = urllib2.urlopen(request, timeout = 6000)
html = res.read()
res.close()
return html
当然,可以把这个方法写得更详细些,具体分析下请求链接时的异常等,在此不深究。这样,就可以获取网页的源代码,接下来就是BeautifulSoup的用武之地了。
#_*_encoding:utf8_*_
'''
使用BeautifulSoup爬取歌手信息
'''
from bs4 import BeautifulSoup
from demo.http.HttpUtil import getHtml
#HttpUtil.getHtml是一个打开url地址的方法,如上面的方法
def bs4Demo():
html = getHtml("http://music.baidu.com/artist")
#打开百度音乐歌手的地址
soup = BeautifulSoup(html)
#具体BeautifulSoup的使用请参考BeautifulSoup文档
singerul = soup.find_all("ul", attrs={"class":"container"})
for i in range(len(singerul)):
singerli = singerul[i]
clearfix = singerli.find_all('ul',recursive=True,attrs={"class","clearfix"})
for liItem in clearfix:
for li in liItem.find_all("li"):
# tagA = li.find("a")
# print tagA
if li.a:
name = li.a.string
# print name
url = li.a["href"]
singerdetail = getHtml("http://music.baidu.com" + url)
detailsoup = BeautifulSoup(singerdetail)
singerinfo = detailsoup.find(id="baseInfo")
if singerinfo:
spanimg = singerinfo.find("span",attrs = {"class","cover"})
img = spanimg.img["src"]
spanhot = singerinfo.find("span",attrs = {"class":"num"})
hot = spanhot.string
print name,url,hot,img
#歌手类型
# path_list = detailsoup.find("ul","path-list clearfix")
# if path_list:
# singertype = path_list.contents[3]
# if singertype:
# sort = singertype.a.string
# print sort.strip()
if __name__ == "__main__":
bs4Demo()
代码很精简,赞一下BeautifulSoup,比用正则表达式抓取这些信息简单多了吧。看看效果:
小案例演示结束。分享,让成长的脚步从此不孤独……