Selenium Python爬虫
一. Selenium介绍
-
简介
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
简单来说,就是模仿我们去访问网页. -
优点
现在越来越多网页使用Ajax来加载网页,通常我们使用requests库获取这样的页面获取的源码与实际并不相符。这时我们可以使用Selenium更加方便。 -
缺点
因为通过模仿用户使用浏览器,所以费时,效率低. -
安装
直接在cmd中输入:
pip install selenium
即可. 但我们还需要一个webdriver来配合selenium使用,这里以Chrome浏览器为例(需已经安装过Chrome浏览器).
可以通过访问:chormedriver
进行下载,进入后根据自己安装的Chrome浏览器版本对应下载即可.
windows系统可以直接将chromedriver.exe拖到Python的Scripts目录下.
安装完成后,可以用程序测试:
from selenium import webdriver
browser = webdriver.Chrome()
如果弹出一个空白的Chrome浏览器,即配置成功.
如果弹出后闪退,可能是ChromeDriver版本和Chrome版本不兼容.
二. 应用实例
我们以访问wyy音乐随便爬取一个用户的听歌排行为例。
我们首先要获取一个浏览器对象browser,并使用get方法获取到网页页面,这时启动程序便会看到弹出Chrome浏览器,并访问到了页面,这时我们请求一个用户的名称赋给变量username,而option.binary_location变量可以直接右键自己桌面上的Chrome浏览器图标找到属性中的目标路径复制过来即可。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
def getChrome():
option = webdriver.ChromeOptions()
option.binary_location = '' #这里需要填写你自己Chrome浏览器启动程序位置
browser = webdriver.Chrome(chrome_options=option)
return browser
browser = getChrome()
url = 'https://music.163.com/'
browser.get(url)
username = input("请输入查找用户名\n")
现在显然我们要完成搜索操作,正常我们只需找到页面上的搜索框,并在里面输入名称即可,但程序显然不能直接看到搜索框的所在,他看到的只是一堆代码,所以现在我们需要调用一些方法,来帮助程序找到搜索框。
#找到搜索框
text_input = browser.find_element_by_id('srch')
text_input.send_keys(username)
text_input.send_keys(Keys.ENTER)
我们看到这里调用了 browser的find_element_by_id函数,该函数通过一个id参数找到指定id的元素对象并返回。(id参数每个网站一般都是不同的,我们可以通过打开网页后使用开发者工具通过指针(开发者工具页面左上角箭头)点击搜索框查看源代码找到id。)然后调用send_keys函数把要搜索的用户名传递给他。并在调用一次传递一个ENTER代表输入完成开始搜索。
上述代码执行完毕后我们进入了一个新页面。
接下来我们点击上述信息栏中的用户,然后在里面找到我们需要的用户
这里我们打开开发者工具分析,发现<用户>这个元素在一个iframe里面,此时我们需要切换到iframe里才能实现接下来的操作。
#找到子页面
browser.switch_to.frame('contentFrame') #该函数接受iframe的id和name作为参数
browser.implicitly_wait(1)
这里调用了一个implicitly_wait隐式等待函数,等待frame切换完成。
切换到iframe后,我们找到 用户 这个元素位置:
#找到用户栏
button = browser.find_element_by_xpath('//*[@data-type=1002]') #该函数参数较复杂,此处略去
button.click()
找到用户元素直接调用click()函数便可以模仿鼠标点击。切换到用户栏内容。
此时浏览器在用户栏显示了你搜索的那个用户
我们使用用户名构造出find_element_by_xpath参数格式的一个字符串,并搜索这个元素。
#找到目标用户
s = '//*[@title="' + username + '"]'
target_user =browser.find_element_by_xpath(s)
target_user.click()
browser.implicitly_wait(1)
完成点击操作,并隐式等待页面加载完成后,我们便已经进入到我们要搜索的用户的页面。
此时,我们只需以同样的方法获取听歌排行歌曲名称并保存下来即可。
#找到目标用户听歌记录
songs = browser.find_elements_by_xpath('//*[@class="song"]/div/div/span/a/b')
#将目标用户听歌记录在本地记录
with open('songs_record.html', 'w', encoding='utf-8') as file:
i = 1
for song in songs:
s = str(i) + ' ' + song.text + '\n'
file.write(s)
print(s, end='')
i += 1
#关闭浏览器
browser.close()
程序结束后,我们便可在程序目录下找到名为songs_record.html的文件,打开后里面记载了指定用户的听歌排行。
三. 总结
以上,就是Selenium的一些介绍和简单用法。
Selenium是当今最流行的web自动化测试工具。在Selenium爬虫里,我们可以简单地通过模拟网页下拉,来加载Ajax请求。而使用其他库可能需要更复杂的操作来实现。而它的缺点显然是必须调用浏览器,且模拟操作更加耗时。