Selenium库的基本使用
selenium库是用来爬取动态网页的一个工具。什么是动态网页?凡是能交互的网页,都是动态网页。比如有搜索框,能发表评论,能点赞,拉黑等等,因此现在很大部分网站都是动态网页。它与静态网页不同的是,它不需要修改网页源码,就可以改变网页展示的内容。它只需要修改服务器的数据库等它关联的数据即可。
一、什么是selenium库?
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),[Mozilla Firefox](https://baike.baidu.com/item/Mozilla Firefox/3504923),Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
总的来说,selenium库就是用来模拟浏览器操作的。比如我们日常看视频,需要先打开浏览器,输入网址,在搜索框输入关键字,然后回车,进入到新网页,再点击想要看的视频。如果想查资料,操作基本上也差不多。
因此,想要用selenium库写爬虫,需要先量化对浏览器的使用,要将打开浏览器,找到输入框,打字,搜索,点击新网页等等这些操作看做一个个小模块。分别掌握这些小模块的语法操作。最后将这些步骤按顺序放在一起就可以完成了。
二、准备工作
1、安装Selenium库(两种方法)
①在Pycharm中用鼠标操作
②在命令提示符窗口安装
2、准备浏览器和浏览器插件
推荐用谷歌和火狐。我使用的是谷歌浏览器
然后,打开这个chromedriver插件的下载网址
https://chromedriver.chromium.org/downloads
由于我的谷歌浏览器版本是92.0.4515版本,所以我下载如图所示的这个版本的插件
下载后解压,里面只有一个文件chromedriver.exe,将它放入python的安装目录下,即和python.exe文件一个目录下即可。
如果你装了Anaconda,还要将这个插件放到Anaconda自带的python文件夹下,位置同上
三、基本操作
1、一个简单的例子
# 打开清华大学出版社官网,搜索关键字python,将首页的书本名和价格提取出来,并形成一个表格
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import pandas as pd
driver = webdriver.Chrome() # 生成一个浏览器对象
url = "http://www.tup.tsinghua.edu.cn/index.html" # 设置url
driver.get(url) # 将url传给driver对象
input_tag = driver.find_element(By.CSS_SELECTOR, '#input_key') # 使用selector来定位输入框
input_tag.send_keys("python") # 往输入框中传递值
input_tag.send_keys(Keys.ENTER) # 模拟键盘的回车键
windows = driver.window_handles # 将目前已经打开的两个网页地址保存在windows列表中
driver.switch_to.window(windows[1]) # 将driver关联的网页切换到刚刚新打开的页面
html = driver.page_source # 获取driver当前页面的网页源码,存储在html变量中
soup = BeautifulSoup(html, 'lxml') # 新建一个BeautifulSoup对象,以lxml的形式解析html源码,并存到soup变量中
book_name = [i.text for i in soup.select('#csproduct a span')] # 从soup中提取书名
editor = [i.text for i in soup.select('#csproduct a p')[::3]] # 从soup中提取作者姓名
p = [i.text for i in soup.select('#csproduct a p')[2::3]] # 从soup中提取书本价格
price = [] # 书本价格列表
for i in p: # 对于每一个在i,i的格式都形如“价格:83”,“价格:90“。为了后面方便生成表格,要去除数字以外的字符
i = i.replace('定价:', '') # 将每个元素中的‘定价:’删除
price.append(i) # 将每一个修改过的i,加入提前准备的price列表中
table = pd.DataFrame({'书名': book_name, '价格': price}) # 生成两列的表格,列名为书名和价格
print(table)
2、selenium库的基础操作
①选择浏览器类型
from selenium import webdriver
# 选择什么类型的浏览器,就在webdriver的方法中找对应的浏览器就行,这里就举两个例子,一个火狐一个谷歌
a = webdriver.Chrome()
b = webdriver.Firefox()
......
首字母大写!是Chrome,不是chrome,小写会报错!
②给浏览器传递url
这里简单说一下url和我们日常说的网址有什么区别?
(https://zhidao.baidu.com/question/1452275666155100260.html)
网址:我们日常输入的,形如“www.baidu.com”,"www.4399.com"这样的就是网址
url:url由三部分组成。协议,ip地址,资源地址。和网址相比,主要就是多了协议一栏。即类似"http://","https://"这样的协议。
因此可以这么认为,开头有协议的就是url,没有协议的就是网址。
from selenium import webdriver
# 第一种方法
a = webdriver.Chrome()
a.get("https://www.baidu.com/")
# 第二种方法
url="https://www.baidu.com/"
a.get(url)
# 执行过后,浏览器就会自动跳转到输入的页面
③定位输入框并传值
selenium一共有8种定位方法
定位方法 | 个体形式 | 复数形式 |
---|---|---|
id定位 | driver.find_element(By.ID, 'xxx') | driver.find_elements(By.ID, 'xxx') |
name定位 | driver.find_element(By.NAME, 'xxx') | driver.find_elements(By.NAME, 'xxx') |
class定位 | driver.find_element(By.CLASS_NAME, 'xxx') | driver.find_element(By.CLASS_NAME, 'xxx') |
tag定位 | driver.find_element(By.TAG_NAME, 'xxx') | driver.find_elements(By.TAG_NAME, 'xxx') |
link定位 | driver.find_element(By.LINK_TEXT, 'xxx') | driver.find_element(By.LINK_TEXT, 'xxx') |
partial_link定位 | driver.find_element(By.PARTIAL_LINK_TEXT, 'xxx') | driver.find_elements(By.PARTIAL_LINK_TEXT, 'xxx') |
xpath定位 | driver.find_element(By.XPATH, 'xxx') | driver.find_element(By.XPATH, 'xxx') |
css定位 | driver.find_element(By.CSS_SELECTOR, 'xxx') | driver.find_elements(By.CSS_SELECTOR, 'xxx') |
在这里我简单介绍一下XPATH的语法。
XPATH
//全局选取,选子孙节点
/选取子节点
例如:
//div[@class='xxxxx']
//table[contains(@id,'xxxxxx')]
//*[@id='xxxx']
语法格式:
//节点名[@属性名='属性值']
//属性名[contains(@属性名,'属性值')]
//*[@name='xxxx']
在网页中按F12,检查源码,左键点击快捷查找图标,再点击搜索框,即可定位到源码中的具体位置
# 将这些方法导入
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome() # 生成一个浏览器对象
url = "http://www.tup.tsinghua.edu.cn/index.html" # 设置url
driver.get(url) # 将url传给driver对象
input_tag = driver.find_element(By.CSS_SELECTOR, '#input_key') # 使用selector来定位输入框
input_tag.send_keys("python") # 往输入框中传递值
# 传值这一步代码执行后,我们会看到搜索框中多了python字眼
④点击网页元素
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome() # 生成一个浏览器对象
url = "http://www.tup.tsinghua.edu.cn/index.html" # 设置url
driver.get(url) # 将url传给driver对象
input_tag = driver.find_element(By.CSS_SELECTOR, '#input_key') # 使用selector来定位输入框
input_tag.send_keys("python") # 往输入框中传递值
# 下面提供两种传值后进入新网页的操作
# 1、模拟键盘的回车键
input_tag.send_keys(Keys.ENTER)
# 2、定位搜索标签,并点击,这里以通过XPATH定位为例
button = driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[2]/div[2]/div[4]')
button.click()
⑤切换当前关联的网址
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome() # 生成一个浏览器对象
url = "http://www.tup.tsinghua.edu.cn/index.html" # 设置url
driver.get(url) # 将url传给driver对象
input_tag = driver.find_element(By.CSS_SELECTOR, '#input_key') # 使用selector来定位输入框
input_tag.send_keys("python") # 往输入框中传递值
input_tag.send_keys(Keys.ENTER) # 模拟键盘的回车键
windows = driver.window_handles # 将目前已经打开的两个网页地址保存在windows列表中
print("当前页面:" + driver.current_window_handle + "\n")
print("现在一共有这些页面:")
print(windows)
driver.switch_to.window(windows[1]) # 将driver关联的网页切换到刚刚新打开的页面
print("\n切换后,现在的页面:" + driver.current_window_handle)
'''
由于windows是一个列表,因此所有列表操作对windows也适用
比如
打开了很多网页,想直接切换到最后一个,可以用windows[-1]来索引,同理[-2]是倒数第二个,[-3]是倒数第三个
'''
切换网址这个操作,就像C语言中改变指针类似,我一开始控制的是第一个网址,切换后我就可以控制新的网址了。
⑥提取目标网址的目标信息
# 导入BeautifulSoup库
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
driver = webdriver.Chrome() # 生成一个浏览器对象
url = "http://www.tup.tsinghua.edu.cn/index.html" # 设置url
driver.get(url) # 将url传给driver对象
input_tag = driver.find_element(By.CSS_SELECTOR, '#input_key') # 使用selector来定位输入框
input_tag.send_keys("python") # 往输入框中传递值
input_tag.send_keys(Keys.ENTER) # 模拟键盘的回车键
windows = driver.window_handles # 将目前已经打开的两个网页地址保存在windows列表中
driver.switch_to.window(windows[1]) # 将driver关联的网页切换到刚刚新打开的页面
html = driver.page_source # 获取driver当前页面的网页源码,存储在html变量中
soup = BeautifulSoup(html, 'lxml') # 新建一个BeautifulSoup对象,以lxml的形式解析html源码,并存到soup变量中
book_name = [i.text for i in soup.select('#csproduct a span')] # 从soup中提取书名
editor = [i.text for i in soup.select('#csproduct a p')[::3]] # 从soup中提取作者姓名
p = [i.text for i in soup.select('#csproduct a p')[2::3]] # 从soup中提取书本价格
price = [] # 书本价格列表
for i in p: # 对于每一个在i,i的格式都形如“价格:83”,“价格:90“。为了后面方便生成表格,要去除数字以外的字符
i = i.replace('定价:', '') # 将每个元素中的‘定价:’删除
price.append(i) # 将每一个修改过的i,加入提前准备的price列表中
print(str(book_name) + '\n')
print(str(editor) + '\n')
print(str(price))
⑦数据处理
四、总结
selenium库的基本操作,是有一定的操作难度的,主要集中在如何准确定位网页元素,如何获取网页源码并提取出有效数据两方面
但其实这两方面,在静态网页爬取中也是核心步骤,因此两者的知识是共通的,不需要学两遍。本教程只是很简单的举了一个例子,还有很多工具没有介绍到,因为我自己也没学这么多,不方便讲。剩下的就看各位自己去深造了。