selenium和phantomjs,完成豆瓣音乐排行榜的内容爬取
代码要多敲 注释要清晰 哪怕再简单
#使用selenium和phantomjs,完成豆瓣音乐排行榜的内容爬取 #地址:https://music.douban.com/chart #导入需要的模块 from selenium import webdriver import os from lxml import etree import time from bs4 import BeautifulSoup #生成浏览器对象 driver = webdriver.PhantomJS() #创建文件夹存储music信息 root_dir = 'douban_music' if not os.path.exists(root_dir): os.mkdir(root_dir) #抓取页面函数 def spider(): base_url = 'https://music.douban.com/chart' #用浏览器获取网页 driver.get(base_url) #等待页面加载 time.sleep(4) # 获取页面资源 content = driver.page_source # print(content) #在解析函数中解析页面元素 content_parser(content) def content_parser(content): # 用xpath解析得到的页面资源 将content生成树结构 tree = etree.HTML(content) # print(tree) #拿取所有的歌曲列表 music_list = tree.xpath('//ul[@class="col5"]/li[@class="clearfix"]') #遍历所有的歌曲列表 for music in music_list: #拿取歌曲排名 music_ranking = music.xpath('.//span[@class="green-num-box"]') #判断歌曲排名是否是非空 if music_ranking != []: #获取歌曲排名文本信息 music_ranking = music_ranking[0].text #拿取图片信息链接 music_src = music.xpath('./a/img/@src') if music_src != []: music_src = music_src[0] #拿取歌曲名称 music_name = music.xpath('./div/h3/a') if music_name != []: music_name = music_name[0].text else: #有一部分歌曲名的xpath路径不一样 music_name = music.xpath('./div/p/a')[0].text #拿取singer歌手名称以及播放次数 singer = music.xpath('./div/p') # print(list(singer)) if singer != []: #歌手没有全部拿取 singer = singer[0].text #拿取上榜天数 music_days = music.xpath('./span') # 趋势 music_trend = music_days[2].text if music_days != []: music_days = music_days[1].text #打印所有拿取到的歌曲信息 print(music_ranking,music_src,music_name,singer,music_days,music_trend) #主进程 if __name__ == '__main__': spider() ''' music: <ul class="col5"> <li class="clearfix"> <span class="green-num-box">1</span> <a class="face" href="https://site.douban.com/baishui/" target="_blank"> <img src="https://img3.doubanio.com/view/site/small/public/1aa014ef81b271d.jpg"> </a> <div class="intro"> <h3 class="icon-play" data-sid="721211"> <a href="javascript:;">另一首情歌 (feat. 袁田)</a> </h3> <p>白水 / 5748次播放</p> </div> <span class="days">(上榜11天)</span> <span class="trend arrow-stay"> 0 </span> </li> </ul> '''