2023年11月25日发(作者:)
浏览器⾃动化
什么是 selenium
selenium 是浏览器⾃动化测试框架,原本被⽤于⽹页测试。但到了爬⾍领域,它⼜成为了爬⾍的好帮⼿。selenium 可以控制你的浏览器,
模仿⼈浏览⽹页,从⽽获取数据,⾃动操作等。⼀图胜千⾔
安装 selenium
和其他 Python 第三⽅库的安装⼀样,我们要在命令⾏中使⽤ pip 命令安装 selenium:
1 pip install selenium -i https:///simple
selenium 还需要安装相应的浏览器驱动才能控制浏览器
chromedriver驱动下载⽹站:
将下载好的 chromedriver 解压缩,Windows 系统得到 ,MacOS 得到 chromedriver,这个就是我们需要的浏览器驱动。我
们要将它放到 Python 所在安装⽬录⾥。 如果你忘了 Python 的安装⽬录,可以根据下⾯的操作来找到。
1 import sys
2 print(able)
打开浏览器:
from selenium import webdriver
browser = ()
# 打开⽹页
browser.get('')
# 关闭浏览器
()
browser 是我们实例化的浏览器。我们将⽹址传给 browser 对象的 get() ⽅法,即可打开对应的⽹页。最后调⽤ quit() ⽅法将浏览器关闭。
我们的⽬的是获取数据,接下来让我们⽤ browser 对象的 page_source 属性来获取⽹页的源代码。值得注意的是,⽤ selenium 获取的⽹页
源代码是数据加载完毕后最终的源代码,也就是⽹页加载后通过 API 获取的数据也在这个源代码中。
因此,我们就不⽤再区分要爬取的⽹页是静态⽹页还是动态⽹页了,在 selenium 眼⾥统统都⼀样
⽤ selenium 打印出博客的⽹页源代码:
from selenium import webdriver
browser = ()
browser.get('')
# 打印出⽹页源代码
print(_source)
()
处理数据
我们之前掌握了⽤ BeautifulSoup 对获取的⽹页源代码进⾏处理,提取出我们需要的内容。selenium 也同样可以进⾏数据的处理,它俩原理
类似,只是语法上有所不同。
接下来,我们来看看如何⽤ selenium 处理数据。我们以获取博客的 h1 标签为例,代码可以这样写:
from selenium import webdriver
browser = ()
browser.get('')
h1 = _element_by_tag_name('h1')
print()
()
Selenium常⽤的查找元素的⽅法:
我们来看⼏个例⼦你就明⽩了,下⾯的例⼦中,注释内容是要找的 HTML 元素代码,下⾯是获取该元素的 Python 代码:
1 # 扇贝编程,带你打开编程世界的⼤门
2 _element_by_tag_name('p')
3
4 # class="slogan">扇贝编程,带你打开编程世界的⼤门
5 _element_by_class_name('slogan')
6
7 # "slogan">扇贝编程,带你打开编程世界的⼤门
8 _element_by_id('slogan')
9
10 # "slogan">扇贝编程,带你打开编程世界的⼤门
11 _element_by_name('slogan')
12
13 # "">扇贝编程
14 _element_by_link_text('扇贝编程')
15 _element_by_partial_link_text('扇贝')
新增了⼀种更统⼀的⽅法 ,⽽具体通过什么来查找(tag name, class name 等)放进了参数中。
seleniumfind_element()
1 # 扇贝编程,带你打开编程世界的⼤门
2 _element('tag name', 'p')
3
4 # 扇贝编程,带你打开编程世界的⼤门
5 _element('class name', 'slogan')
6
7 # 扇贝编程,带你打开编程世界的⼤门
8 _element('id', 'slogan')
9
10 # 扇贝编程,带你打开编程世界的⼤门
11 _element('name', 'slogan')
12
14 _element('link text', '扇贝编程')
15 _element('partial link text', '扇贝')
与上⾯例⼦对⽐
这些⽅法找到的元素(返回值)都是 WebElement 对象,它和 BeautifulSoup ⾥的 Tag 对象⼀样,也有⼀
个 text 属性,⼀样也是获取元素⾥的⽂本内容。
不同的是,Tag 对象通过字典取值的⽅式获取元素的属性值,⽽ WebElement 对象则使⽤ get_attribute() ⽅
法来获取。
我们来看个代码实例加深⼀下印象:
link = _element_by_link_text('扇贝编程')
print(_attribute('href'))
# 输出:
print()
# 输出:扇贝编程
如果想要查找所有符合条件的元素 只要把刚才介绍的那些⽅法名中的 改成 即可
elementelements
1 from selenium import webdriver
2
3 browser = ()
4 ('')
5 # 注意下⾯是 elements
6 a_tags = _elements_by_tag_name('a')
7 # 新版本写法:
8 # a_tags = _elements('tag name', 'a')
9
10 for tag in a_tags:
11 print()
12 ()
获取源代码中所有的a标签
控制浏览器
还记得我们上⼀关说的,登录博客并批量获取博客中的⽂章内容吗?我们可以使⽤ 进⾏同样的操作,代码的可读性更强,我们写起
selenium
来也更轻松。
要想做到这些,除了刚才学的那些查找元素的⽅法外,只要再学两个⽅法即可。这两个⽅法分别是 click() 和 send_keys(),我们来看看它俩
的作⽤:
⾃动登录博客并获取⽂章内容的代码如下,请仔细阅读注释内容:
提⽰:我们在下⾯的代码还⽤了⼀对新的查找元素的⽅法: 和 ,这就运⽤
find_element_by_css_selector()find_elements_by_css_selector()
了上⼀课所说的 css 选择器的知识,将 css 选择器以字符串的形式填⼊括号中,能帮我们更精准地查找元素。
from selenium import webdriver
import time
browser = ()
# 打开博客
('')
# 找到登录按钮
login_btn = _element_by_link_text('登录')
# 点击登录按钮
login_()
# 等待 2 秒钟,等页⾯加载完毕
(2)
# 找到⽤户名输⼊框
user_login = _element_by_id('user_login')
# 输⼊⽤户名
user__keys('codetime')
# 找到密码输⼊框
user_pass = _element_by_id('user_pass')
# 输⼊密码
user__keys('shanbay520')
# 找到登录按钮
wp_submit = _element_by_id('wp-submit')
# 点击登录按钮
wp_()
# 找到 Python 分类⽂章链接
python_cat = _element_by_css_selector('section#categories-2 ul li a')
# 上⼀句⽤新版本的写法如下
# python_cat = _element('css selector', 'section#categories-2 ul li a')
# 点击该分类
python_()
# 找到跳转的页⾯中的所有⽂章标题标签
titles = _elements_by_css_selector('-title a')
# 上⼀句⽤新版本的写法如下
# titles = _elements('css selector', '-title a')
# 找到标题标签中内含的链接
links = [_attribute('href') for i in titles]
# 依次打开 links 中的⽂章链接
for link in links:
(link)
# 获取⽂章正⽂内容
content = _element_by_class_name('entry-content')
print()
()
获取⽂章内容
复习与总结
我们是从安装浏览器驱动开始的,为了能让 selenium 控制浏览器,驱动是必需的。
驱动安装完成后,我们迫不及待地⽤代码控制打开了浏览器,代码是这样的:
1 # 从 selenium 中导⼊ webdriver(驱动)
2 from selenium import webdriver
3
4 # 选择 Chrome 浏览器并打开
5 browser = ()
打开浏览器
接着我们调⽤实例化后的浏览器对象(browser)的 get() ⽅法成功地打开了⼀个⽹页,并且通过其 page_source 属性拿到了⽹页的源
代码。注意,最后⼀定要调⽤ quit() ⽅法将浏览器关闭。
1 from selenium import webdriver
2
3 browser = ()
4 ('')
5 # 打印出⽹页源代码
6 print(_source)
7 # 关闭浏览器
8 ()
打开⽹页
有些⽹站数据较多,⽹页加载⽐较慢,打开⽹页后需要暂停⼏秒才能获取到完整的⽹页源代码。以上代码可以总结成下图:
光拿到⽹页源代码还不够,我们还要解析、处理它,从中提取出我们需要的数据。selenium 中解析与提取数据的⽅法如下:
上⾯是获取第⼀个符合条件的元素的⽅法,获取所有符合条件的元素的⽅法只需把 element 改成 elements 即可:
这些⽅法找到的元素(返回值)都是 WebElement 对象,它的常⽤属性和⽅法如下:’
举个获取 a 标签中链接和内容的例⼦:
2 link = _element_by_link_text('扇贝编程')
3 print(_attribute('href'))
4 # 输出:
5 print()
6 # 输出:扇贝编程
获取a标签
接着我们学会了将 selenium 与 BeautifulSoup 相结合,⽤ selenium 获取⽹页源代码,⽤ BeautifulSoup 解析、提取数据。
1 from selenium import webdriver
2 from bs4 import BeautifulSoup
3
4 browser = ()
5 ('')
6 # ⽤ BeautifulSoup 解析⽹页源代码
7 soup = BeautifulSoup(_source, '')
8 a_tags = _all('a')
9 for tag in a_tags:
10 print()
11 ()
selenium与BeautifulSoup结合
最后,我们还学习了 selenium 中操作浏览器的⽅法,
通过 selenium 查找元素的⽅法找到对应的元素后,调⽤其 click() ⽅法就可以模拟点击该元素,⼀般⽤于点击链接或按钮;调⽤
其 send_keys() ⽅法⽤于模拟按键输⼊,传⼊要输⼊的内容即可,常⽤于账号密码等输⼊框的表单填写。
selenium简单明了,使⽤起来⾮常的直观,和我们正常使⽤浏览器的步骤⼀样,不需要分析浏览器背后发⽣的逻辑。
但它的缺点也很明显,因为 selenium 需要真实的打开浏览器,等待⽹页加载等。在⼤规模获取数据时,使⽤ selenium 爬取数据将会
⾮常的低效。
为了提升爬取效率,我们可以将浏览器设置为静默模式,让浏览器不必真的打开,⽽是在后台默默地获取数据、操作页⾯。代码如
下:
1 from selenium import webdriver
2
3 # 初始化配置
4 options = Options()
5 # headless 为静默模式
6 _argument('--headless')
7 # 将配置传⼊浏览器
8 browser = (options=options)
9 # 打开⽹页
10 ('')
11 # 关闭浏览器
12 ()
设置静默模式
即使我们将浏览器配置成静默模式,在⼤规模爬取数据,selenium 的爬取速度和资源占⽤率都不太理想。所以,通常情况下,
我们还是会⽤ requests 和 BeautifulSoup 爬取数据
发布评论