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

13 # 扇贝编程

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 标签中链接和内容的例⼦:

1 # 扇贝编程

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 ()

seleniumBeautifulSoup结合

最后,我们还学习了 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 爬取数据