由于网易云音乐网站页面采用了js技术进行了异步加载,所以这里采用了selenium并采用PHantomJS工具抓取动态页面
废话不多说,直接上代码。这个代码也是要了小生2天时间啊
这是改进版的
# -*- coding: utf-8 -*-
#@Time :18-10-2 下午7:25
#@Author : LiMeng
#@Email : [email protected]
#@File : wangyiyun.py
#Software:PyCharm
import ppretty
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import csv
if __name__ == '__main__':
url='https://music.163.com/#/discover/toplist?id=3778678'
csv_file = open("wangyiyunyinyue.csv", "w", newline='')
writer = csv.writer(csv_file)
writer.writerow((['歌曲', '歌手']))
html=requests.get(url=url).content.decode('utf-8')
soup=BeautifulSoup(html,'lxml')
#由于网易云网站上是采用js异步加载网页的,所以这里采用selenium的driver模块进行加载
driver=webdriver.PhantomJS()
driver.get(url=url)
driver.switch_to.frame("contentFrame")
tr_list=driver.find_element_by_css_selector("tbody").find_elements_by_tag_name('tr')
for tr in tr_list:
tt_txt=tr.find_element_by_css_selector('b')
geshou_txt=tr.find_elements_by_tag_name('td')[3].find_element_by_css_selector('span').get_property('title')
writer.writerow([tt_txt.get_property('title'),geshou_txt])
writer.writerow('\n')
writer.writerow(['用户', '评论'])
#这里有一个诀窍,本来我是采用find_element_by_class_name函数调用的,但是class的属性值为cmmts j-flag,这里一直报 错,所以就采用find_element_by_css_selector这个函数了
for page in range(5):
#爬取5页的评论
div_list=driver.find_element_by_css_selector('.cmmts.j-flag').find_elements_by_class_name('itm')
for div_x in div_list:
pinglun=(div_x.find_element_by_class_name('cntwrap').find_elements_by_tag_name('div'[0]).find_element_by_css_selector('.cnt.f-brk').text
#获取评论区所有的文字,包括用户名和评论,然后采用split函数将用户名和评论进行分开。这里有一个坑,我一直采用的是split(":")调用,但是没成想到这里的冒号是中文的冒号,所以一开始硬是没有将两个元素分开
writer.writerow([str(pinglun).split(":")[0],str(pinglun).split(":")[1]])
driver.find_element_by_link_text(u'下一页').click()
csv_file.close()
这是运行结果的界面,可以看到,excel表里面存储了网易云的热门歌曲
这是抓取的评论界面