使用Selenium爬取动态网页

一、实验介绍

  1. 实验目的
    • 了解Selenium的原理;

• 掌握Selenium如何获取动态页面数据。

  1. 实验内容
    本实验通过Selenium爬取动态数据,通过实验,让学生更深入的了解Selenium的原理及使用,掌握通过使用Selenium方法爬取动态页面。

  2. 实验知识点
    • 在Anaconda中创建Python程序;

• 使用Selenium爬取动态网页。

  1. 实验时长
    建议总学时:2学时

  2. 实验环境

名称

版本

系统环境 Windows 系统 Windows 10
开发环境 Spyder Spyder 3
运行环境 Python Python 3.8
二、实验分析
前置课程:
• 掌握 Python语言

实现思路:
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。本实验中针对网易云音乐上歌手周杰伦的热门50首歌曲的评论进行爬取。

本实验使用Selenium爬取动态页面,本实验可以分为以下3个步骤:

  1. 在Anaconda中创建MusicCrawl脚本;

  2. 编写Python程序;

  3. 运行MusicCrawl程序。

三、实验步骤
在Anaconda中创建MusicCrawl脚本
1、创建新脚本

创建一个新的Python脚本,命名为MusicCrawl。

打开桌面的Spyder(anaconda3)后,新建项目依次选择菜单 File->New File,即可创建一个脚本,如下图所示:

图1 创建脚本

编写Python程序
现在使用Selenium动态爬取网易云音乐,具体实现流程如下:

1、 获取歌曲链接

本实例解析动态网页是:https://music.163.com/#/artist?id=6452,本网页的页面内容如下:

图2 网站页面

现在创建一个musicSpider类,在它的__init__方法里,完成了浏览器对象的初始化并将其赋值为browser对象,并把滚动条拉到翻页按钮处模仿用户操作,具体的代码如下:

from selenium import webdriver
import time
class musicSpider():
def init(self):
self.song_urls = []
driverPath="C:/chromedriver.exe"
# 浏览器对象的初始化并将其赋值为browser对象
self.browser = webdriver.Chrome(executable_path=driverPath)
# 等待5秒,网页缓冲
time.sleep(5)
# 滑轮到页面底部模拟用户动作
self.browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
要爬取此网页上的热门作品下的歌曲链接,打开自己电脑上的Chrome浏览器或者Firefox浏览器,输入以上网页地址回车后,会显示的上图,按下F12键打开浏览器的调试工具,选择Elements,点击最左边的按钮,然后在页面上选中上图中的任一歌曲不点击,如下图所示:

图3 网页源代码

分析网页后,可以获取热门作品下所有的歌曲链接:

browser.find_elements_by_xpath('//table[@class = "m-table m-table-1 m-table-4"]/tbody/tr//span[@class = "txt"]/a')
在musicSpider类增加get_music_url方法,browser.get()方法获取请求网页,参数传入链接URL(https://music.163.com/#/artist?id=6452),在网站中包含frame,切换到frame,具体的代码如下:

def get_music_url(self,artistUrl):
# get方法请求网页
self.browser.get(artistUrl)
# 切换到内嵌iframe中
self.browser.switch_to.frame('g_iframe')
# 获取所有歌曲链接
items = self.browser.find_elements_by_xpath('//table[@class = "m-table m-table-1 m-table-4"]/tbody/tr//span[@class = "txt"]/a')
for item in items:
href = item.get_attribute('href')
self.song_urls.append(href)
2、 根据歌曲链接获取评论

在musicSpider类增加方法get_comment方法,根据获取到的歌曲链接URL,访问此网页,并获取歌曲名字及当前页的评价,保存到txt文件中,在控制台打印出下载过程。获取歌曲名字及当前页评论的方式可以参考上面获取歌曲链接的方式,此处不再赘述。

关于网页解析,可以使用xpath的方式,也可使用css的方式。
例如获取歌曲名字,使用xpath的方式:
self.browser.find_element_by_xpath('//div[@class = "tit"]/em')
使用css的方式:
self.browser.find_element_by_css_selector('div[class = "tit"]>em')
具体代码如下:
def get_comment(self):
# 抓取进度计数
count = 0
for url in self.song_urls:
self.browser.get(url)
time.sleep(1)
try:
self.browser.switch_to.frame('g_iframe')
except:
pass
# 获取歌曲名字
song_name = self.browser.find_element_by_xpath('//div[@class = "tit"]/em')
# 获取当前页评论
items = self.browser.find_elements_by_xpath('//div[@class = "cmmts j-flag"]//div[@class = "cntwrap"]/div/div[@class = "cnt f-brk"]')
# 以歌曲名字命名txt文件,将此歌曲的评论保存到此文件中
with open(song_name.text + '.txt', 'a+', encoding = 'utf-8') as f:
for item in items:
f.writelines(item.text + '\n')
print('Now,music name:{}'.format(song_name.text))
print('commpleted:%{}'.format(count/len(self.song_urls)*100))
count += 1
3、生成main()方法

在musicSpider类中增加main方法调用上述get_music_url()和get_comment()方法,并传入相应的参数,具体代码如下:

def main(self):
try:
url = 'https://music.163.com/#/artist?id=6452'
self.get_music_url(url)
self.get_comment()
print('download end')
except:
pass
finally:
self.browser.quit()
4、musicSpider类实例化

实例化musicSpider类,并调用其main方法,具体代码如下:

if name == 'main':
# 实例化musicSpider类
spider=musicSpider()
spider.main()
5、完整代码

本实验完整的代码如下:

from selenium import webdriver
import time
class musicSpider():
def init(self):
self.song_urls = []
driverPath="C:/chromedriver.exe"
# 浏览器对象的初始化并将其赋值为browser对象
self.browser = webdriver.Chrome(executable_path=driverPath)
# 等待5秒,网页缓冲
time.sleep(5)
# 滑轮到页面底部模拟用户动作
self.browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
# 获取歌曲链接
def get_music_url(self,artistUrl):
# get方法请求网页
self.browser.get(artistUrl)
# 切换到内嵌iframe中
self.browser.switch_to.frame('g_iframe')
# 获取所有歌曲链接
items = self.browser.find_elements_by_xpath('//table[@class = "m-table m-table-1 m-table-4"]/tbody/tr//span[@class = "txt"]/a')
for item in items:
href = item.get_attribute('href')
self.song_urls.append(href)
# 获取相应歌曲的当前页评论
def get_comment(self):
# 抓取进度计数
count = 0
for url in self.song_urls:
self.browser.get(url)
time.sleep(1)
try:
self.browser.switch_to.frame('g_iframe')
except:
pass
# 获取歌曲名字
song_name = self.browser.find_element_by_xpath('//div[@class = "tit"]/em')
# 获取当前页评论
items = self.browser.find_elements_by_xpath('//div[@class = "cmmts j-flag"]//div[@class = "cntwrap"]/div/div[@class = "cnt f-brk"]')
# 以歌曲名字命名txt文件,将此歌曲的评论保存到此文件中
with open(song_name.text + '.txt', 'a+', encoding = 'utf-8') as f:
for item in items:
f.writelines(item.text + '\n')
print('Now,music name:{}'.format(song_name.text))
print('commpleted:%{}'.format(count/len(self.song_urls)*100))
count += 1
# 主函数调用相应方法
def main(self):
try:
url = 'https://music.163.com/#/artist?id=6452'
self.get_music_url(url)
self.get_comment()
print('download end')
except:
pass
finally:
self.browser.quit()
if name == 'main':
# 实例化musicSpider类
spider=musicSpider()
spider.main()
6、脚本重命名

保存新建的Python文本,出现Editor,然后选择Yes,出现一下界面:

图4 脚本重命名

在文件名:处修改成MusicCrawl.py名字。

运行MusicCrawl
1、运行MusicCrawl脚本

点击Run按钮即可运行脚本:

图5 运行Python脚本

2、显示结果

在Console中运行结果如下图所示:

具体结果如下图所示:

图6 运行结果

在项目目录(MusicCrawl.py所在目录)下会看到以歌名命名的文件,每个文件中有评论数据,具体结果如下图所示:

图7 爬取数据
注意:如Chrome版本更换或是发生版本报错,请自行下载对应版本的ChromeDriver:https://npm.taobao.org/mirrors/chromedriver/

posted @ 2025-02-08 02:01  老猫1688  阅读(76)  评论(0)    收藏  举报