selenium库


Selenium库的基本使用

selenium库是用来爬取动态网页的一个工具。什么是动态网页?凡是能交互的网页,都是动态网页。比如有搜索框,能发表评论,能点赞,拉黑等等,因此现在很大部分网站都是动态网页。它与静态网页不同的是,它不需要修改网页源码,就可以改变网页展示的内容。它只需要修改服务器的数据库等它关联的数据即可。

一、什么是selenium库?

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),[Mozilla Firefox](https://baike.baidu.com/item/Mozilla Firefox/3504923),SafariGoogle ChromeOpera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、JavaPerl等不同语言的测试脚本。

总的来说,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库的基本操作,是有一定的操作难度的,主要集中在如何准确定位网页元素如何获取网页源码并提取出有效数据两方面

但其实这两方面,在静态网页爬取中也是核心步骤,因此两者的知识是共通的,不需要学两遍。本教程只是很简单的举了一个例子,还有很多工具没有介绍到,因为我自己也没学这么多,不方便讲。剩下的就看各位自己去深造了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM