总结:
1、认识 selenium 库:
- 通过selenium 提供的API 用代码操纵浏览器,来模拟浏览器的各种操作,起到自动化测试的作用,本章仅仅利用此来写爬虫。
2、认识无头浏览器(headless browser):
- 无头浏览器是运行在正常浏览器内核中,而浏览器界面并没有任何可见的变化(不用频繁的刷新),仅在内部执行各种正常的操作,因此广泛应用于自动化测试中。
- PhantomJS 本是一款流行的通用的headless browser ,可惜已经被废弃,必须安装各种浏览器专用的 无头版本 才能实现想要的效果。(增加了测试难度 及 编写爬虫的难度)
- browser 版本必须与 headless browser 版本匹配,练习过程中因不匹配报错,因为chromedriver安装的最新版本,所以直接将chrome更新到最新,解决问题
3、查看源码:
由于对 webdriver 模块不熟悉,因此查看源码,了解webdriver 提供的各种API,查看源码的方法:
方法一:浏览器查看 首先
在浏览器中输入:http://localhost:4567/index.html 在浏览器中查看
方法二:直接查看安装的源文件
打开:查看 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()
运行结果:
为了能肉眼看到浏览器的变化,将代码做一点修改,直接驱动 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()
结果相同。