通过爬网易云音乐认识 selenium 及 webdriver

 

参考文章:手把手教你写网络爬虫(1):网易云音乐歌单

总结:

1、认识 selenium 库:

  •       通过selenium 提供的API 用代码操纵浏览器,来模拟浏览器的各种操作,起到自动化测试的作用,本章仅仅利用此来写爬虫。

2、认识无头浏览器(headless browser):

  •        无头浏览器是运行在正常浏览器内核中,而浏览器界面并没有任何可见的变化(不用频繁的刷新),仅在内部执行各种正常的操作,因此广泛应用于自动化测试中。
  •        PhantomJS 本是一款流行的通用的headless browser ,可惜已经被废弃,必须安装各种浏览器专用的 无头版本 才能实现想要的效果。(增加了测试难度 及 编写爬虫的难度)
  •         browser 版本必须与 headless browser 版本匹配,练习过程中因不匹配报错,因为chromedriver安装的最新版本,所以直接将chrome更新到最新,解决问题

3、查看源码:

              由于对 webdriver 模块不熟悉,因此查看源码,了解webdriver 提供的各种API,查看源码的方法:

方法一:浏览器查看  首先

通过爬网易云音乐认识 selenium 及 webdriver_第1张图片

在浏览器中输入:http://localhost:4567/index.html  在浏览器中查看

通过爬网易云音乐认识 selenium 及 webdriver_第2张图片

方法二:直接查看安装的源文件

通过爬网易云音乐认识 selenium 及 webdriver_第3张图片

       打开:查看 WebDriver 提供的API接口

       查看 WebElement 对象接口:

经过以上各种折腾后,正常运行了代码如下:各部分代码的作用都已经注释。

from selenium import webdriver
# import 浏览器的参数对象
from selenium.webdriver.chrome.options import Options
import csv

url = "http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0"

# 设置Chrome的参数对象Options,将浏览器设置成无头模式
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
# 驱动Chromedriver(无头浏览器)
# executable_path  --Chromedriver的路径
driver = webdriver.Chrome(executable_path = r"C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chromedriver", 
							chrome_options = options)

# 准备好储存歌单的csv文件
csv_file = open("playlist.csv", "w", newline='')
writer = csv.writer(csv_file)
writer.writerow(['标题', '播放数', '链接'])

# 解析每一页,直到‘下一页’为空
while url != 'javascript:void(0)':
	# 用WebDriver加载页面
	driver.get(url)
	# 切换到内容的iframe
	driver.switch_to.frame("contentFrame")
	# 定位歌单标签
	data = driver.find_element_by_id("m-pl-container").\
		find_elements_by_tag_name("li")
	# 解析一页中的所有歌单
	for i in range(len(data)):
		# 获取播放数
		nb = data[i].find_element_by_class_name("nb").text
		if '万' in nb and int(nb.split("万")[0]) > 500:
			# 获取播放数大于500万的歌单的封面
			msk = data[i].find_element_by_css_selector("a.msk")
			# 把封面上的标题和链接连同播放数一起写到文件中
			writer.writerow([msk.get_attribute('title'),
							nb, msk.get_attribute('href')])
	# 定位'下一页'的url
	url = driver.find_element_by_css_selector("a.zbtn.znxt").\
		get_attribute('href')
csv_file.close()

运行结果:

通过爬网易云音乐认识 selenium 及 webdriver_第4张图片

为了能肉眼看到浏览器的变化,将代码做一点修改,直接驱动 chrome 而不是   无头模式 如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import csv
import time

url = "http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0"

'''
# 设置Chromedriver的参数对象Options
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
# 驱动Chromedriver(无头浏览器)
# executable_path  --Chromedriver的路径
driver = webdriver.Chrome(executable_path = r"C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver", 
							chrome_options = options)

'''
# 驱动 Chrome 浏览器
driver = webdriver.Chrome()
# 准备好储存歌单的csv文件
csv_file = open("playlist.csv", "w", newline='')
writer = csv.writer(csv_file)
writer.writerow(['标题', '播放数', '链接'])

# 解析每一页,直到‘下一页’为空
while url != 'javascript:void(0)':
	# 用WebDriver加载页面
	driver.get(url)
	print(driver.title)
	time.sleep(3)
	# 切换到内容的iframe
	driver.switch_to.frame("contentFrame")
	# 定位歌单标签
	data = driver.find_element_by_id("m-pl-container").\
		find_elements_by_tag_name("li")
	# 解析一页中的所有歌单
	for i in range(len(data)):
		# 获取播放数
		nb = data[i].find_element_by_class_name("nb").text
		if '万' in nb and int(nb.split("万")[0]) > 500:
			# 获取播放数大于500万的歌单的封面
			msk = data[i].find_element_by_css_selector("a.msk")
			# 把封面上的标题和链接连同播放数一起写到文件中
			writer.writerow([msk.get_attribute('title'),
							nb, msk.get_attribute('href')])
	# 定位'下一页'的url
	url = driver.find_element_by_css_selector("a.zbtn.znxt").\
		get_attribute('href')
	print("下一页")
	time.sleep(3)
csv_file.close()

结果相同。

你可能感兴趣的:(python爬虫练习)