Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python无头爬虫Selenium系列(01):像手工一样操作浏览器

Python无头爬虫Selenium系列(01):像手工一样操作浏览器

作者头像
咋咋
发布于 2021-09-01 06:44:39
发布于 2021-09-01 06:44:39
2.5K00
代码可运行
举报
文章被收录于专栏:数据大宇宙数据大宇宙
运行总次数:0
代码可运行

自动化爬虫虽然方便,但希望大家能顾及网站服务器的承受能力,不要高频率访问网站。并且千万不要采集敏感数据!!否则很容易"从入门到入狱"

本系列大部分案例同时采用 selenium 与 pyppeteer 库讲解,并且有 Python 和 C# 2门语言的实现文章,详细请到公众号目录中找到。

前言

学习任何一个库,必须先了解这个库的机制与流程,今天先从一个小例子开始我们的学习之旅。

搜索并采集结果的标题

需求如下:

  • 打开百度搜索主页
  • 在输入框输入搜索内容(比如"爬虫")
  • 点击"百度一下"按钮,进行搜索
  • 把结果页面中的第一页的各个结果的主标题抓取下来

Selenium 的麻烦之处

本系列始终围绕一点开展:"用代码操作浏览器",下面看看整个流程:

  • Python 代码通过 selenium 库,控制"浏览器驱动"程序(一个 exe 文件)
  • "浏览器驱动"程序则发送指令操控"浏览器"

但是,市面上存在各种浏览器,而且就算只是一个厂商的浏览器也有不同的版本。怎么能保证我们的代码只需要写一次,就能控制不同的浏览器?

深入一点的流程图如下:

  • 不同厂商不同版本的浏览器,都需要一个对应版本的"浏览器驱动"

"怎么案例都没开始,就在说 selenium 的不是呢?我到底还学不学?"

他有如下优点:

  • selenium 库已经开发很久,相对来说比较稳定
  • selenium 在各个语言的库都是有 google 开发维护,因此不会出有些问题只在 Python 版本出现
  • selenium 相比 pyppeteer 容易学一些
  • 有一个 selenium-ide 工具,能够把手工操作过程直接转换为 selenium 的代码

缺点:

  • 不同版本不同厂商的浏览器需要不同的驱动程序
  • 无法精细控制请求过程的各种处理,如下
  • 无法在执行网站 js 代码之前,执行自己的 js 代码
  • 无法在登录阶段控制浏览器让人工登录获得 cookies,后续直接请求获得数据

如果你认为无法接受 selenium 的缺点,可以查看 pyppeteer 的相关文章(公众号:数据大宇宙 > py爬虫 > pyppeteer)


获得驱动

现在让我们来开始使用 selenium 解决我们的需求。

首先,使用 pip 安装 selenium

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install selenium
  • 你可以在 jupyter notebook 的 cell 中执行 "!pip install selenium"
  • 也可以在 cmd 中执行 "pip install selenium"

由于我本机安装了 Google Chrome 浏览器,打开浏览器,看看浏览器的版本:

  • 版本为 78.0.3904.70

接着到相关网站(公众号发送"爬虫")下载对应的驱动:

  • 点击进入浏览器版本号对应的目录
  • 下载 win32 版本压缩包
  • 解压后,里面有一个 chromedriver.exe ,这个就是"浏览器驱动"

万事俱备

看过我的相关教学文章的小伙伴都知道,我很喜欢从语义角度去理解学习一个库。

selenium 本质上是控制浏览器,因此当我们使用它的时候,代码的语义应该与手工操作浏览器的过程大同小异才合理。

首先导入一些包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from selenium import webdriver
import selenium.webdriver.support.wait as WA

下面来看看怎么用代码来描述我们的手工操作。


打开浏览器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wd = webdriver.Chrome()
  • 行1:webdriver.Chrome() ,实例化一个 Chrome 对象,如果你是其他浏览器,那么就要实例化对应浏览器的对象
  • 这代码相当于我们手工启动浏览器一样
  • 但是,代码报错了。他的意思是,他找不到"浏览器驱动"

的确,刚刚我们把驱动下载下来,但是 Python 怎么可能会知道去哪里找到那个驱动程序呢。

我们可以在实例化浏览器对象时,传入一个文件路径,告诉他程序的具体位置:

  • 注意,要传入完整的文件路径
  • 我们也可以直接把"驱动程序"放置在代码所在目录
  • 此时可以看到浏览器被启动,默认开启一个空白页面,并且下方出现一行文字说,"此浏览器被控制"

输入百度搜索的网址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wd = webdriver.Chrome()
wd.get('https://www.baidu.com/')
  • 行2:wd.get() ,传入网址即可
  • 注意,每次重复执行 webdriver.Chrome() 都会启动一个新的浏览器

鼠标移到输入框,点击一下,然后输入内容"爬虫"

这里的问题是,怎么用代码表达"鼠标移到输入框,点击一下"?

事实上,selenium 真可以模拟鼠标移动等操作(有些网站的登录验证码需要用鼠标拉动拼图都可以模拟),但是现在的情况我们不应该模拟鼠标,而是根据 html 标签定位即可。

此时我们使用浏览器的"开发者功能",进行定位即可。

由于篇幅关系,本文不详细讲解"开发者功能"的所有操作,详细讲解将放在公众号目录:数据大宇宙 > 爬虫工具 > 系列文章

  • 也可以按快捷键 F12 启动此功能(大部分浏览器都可以)

下面用一个动态图展示操作过程:

  • 点击功能区(右区)的左上角的小标签,开启定位模式
  • 此时鼠标移到页面区(左区),鼠标移到的地方,右区会显示此元素在 html 的位置
  • 我们看到,输入框是一个 input 标签,我们要在代码中告诉 selenium 找到这个 input 标签即可
  • 那么用啥"暗号"表示这个 input 标签呢?有2种常见的方式,css 选择器 或者 xpath
  • selenium 文档中强烈推荐你使用 css 选择器
  • 我们选用 css 选择器,因此,在右区的 input 标签上,按鼠标右键,选 "copy" ,然后选择"copy selector" ,此时已经把"暗号"复制到剪切板上

看看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wd = webdriver.Chrome()
wd.get('https://www.baidu.com/')
input_box = wd.find_element_by_css_selector('#kw')
  • 行3:wd.find_element_by_css_selector ,使用 css 选择器找到元素,方法中传入刚刚复制的"暗号"(按 ctor + v ,粘贴即可)。注意是字符串,因此要用单引号包围
  • 此时,变量 input_box 则表示输入框

接着,输入内容"爬虫"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wd = webdriver.Chrome()
wd.get('https://www.baidu.com/')
input_box = wd.find_element_by_css_selector('#kw')
input_box.send_keys('爬虫')
  • 行4:input_box.send_keys ,往该元素发送按键,这个方法不仅仅能发送键盘的按键,还能往可输入的元素发送文本
  • 此时可以看到,浏览器已经输入了内容"爬虫",并且还可以看到下方已经出现搜索结果(这是因为现在的搜索引擎都提供这种边输入边查询的功能)

我们继续模拟点击输入框右边的"百度一下"这个按钮。

同样用"开发者功能",定位该元素,并复制 css 选择器表达字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wd = webdriver.Chrome()
wd.get('https://www.baidu.com/')
# 输入框
input_box = wd.find_element_by_css_selector('#kw')
input_box.send_keys('爬虫')
#百度一下按钮
act_btn = wd.find_element_by_css_selector('#su')
act_btn.click()
  • 行7:用 css 选择器找到按钮
  • 行8:act_btn.click() 方法,对元素模拟点击
  • 现在浏览器显示的页面,就有我们需要的所有的内容

所有结果的主标题:

这个可能对初学者有点难度,因为我们这次需要一次选择多个元素(多个搜索结果的主标题),看看定位到的标签:

  • 每个搜索结果,都是一个 div标签(上图右区下方红框)
  • 而所有的搜索结果的 div,都被包在一个 id='content_left' 的 div 标签里面(上图右区上方红框)

进一步看看我们需要的主标题在哪里:

  • 我们要的数据都在一个 a 标签下
  • 并且这个 a 标签被放在一个 h3 标签里面

那么,现在我们要用 css 选择器表达以下语义:在一个div(id=content_left)里面,h3 标签里面的 a 标签的文本。div 与 h3 之间可能嵌套了多层

得到的选择器表达式如下:

  • div[id=content_left] 表示 div 标签,他的 id 属性为 content_left
  • div 与 h3 之间用空格分开,表示他们是祖孙关系,就是 div 与 h3 之间有其他任意多的其他标签嵌套
  • h3 与 a 之间,用">" 分开,表示父子关系,就是 a 标签就是在 h3 标签包围

调用代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wd = webdriver.Chrome()
wd.get('https://www.baidu.com/')
# 输入框
input_box = wd.find_element_by_css_selector('#kw')
input_box.send_keys('爬虫')
#百度一下按钮
act_btn = wd.find_element_by_css_selector('#su')
act_btn.click()
#
titles = wd.find_elements_by_css_selector('div[id=content_left] h3 > a')
titles = [t.text for t in titles]
titles
  • 行10:wd.find_elements_by_css_selector ,查找符合选择器的多个元素,注意方法名字的单词 elements 是复数的,与 行4 和 行7 的方法是不一样
  • 此时,titles 其实是一个列表,里面全是符合条件的 a 标签,但是我们的目标是 a 标签里面的文本
  • 行11:调用 a 标签的文本属性,获得其文本
  • 但是,你会发现结果啥也没有!!!

代码执行太快了

上面的代码之所以拿不到任何结果,是因为当执行到第10行的代码时,页面上还没有加载任何的结果。

如果是一个人在操作浏览器,那么你应该跟他说:嘿,一直到你看到那些结果,你再去提取主标题啊。

怎么表达"一直到你看到那些结果"?,selenium 有专门用于等待元素出现的机制,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wd = webdriver.Chrome()
wd.get('https://www.baidu.com/')
# 输入框
input_box = wd.find_element_by_css_selector('#kw')
input_box.send_keys('爬虫')
#百度一下按钮
act_btn = wd.find_element_by_css_selector('#su')
act_btn.click()
# 等待对象
wait = WA.WebDriverWait(wd, timeout=3)
titles =wait.until(lambda w:w.find_elements_by_css_selector('div[id=content_left] h3 > a')) 
titles = [t.text for t in titles]
titles
  • 行10:实例化一个 WebDriverWait 对象,注意在一开始导入包的时候,我们导入了 import selenium.webdriver.support.wait as WA
  • 行11:调用 wait.until 方法,传入 lambda ,selenium 会定时执行里面的方法,直到里面的方法有返回对象
  • 此时可以见到,我们得到了结果
  • 关于更多等待机制的知识点,请关系本系列后续的文章

加上关闭浏览器的控制,完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with webdriver.Chrome() as wd:
    wd.get('https://www.baidu.com/')
    # 输入框
    input_box = wd.find_element_by_css_selector('#kw')
    input_box.send_keys('爬虫')
    #百度一下按钮
    act_btn = wd.find_element_by_css_selector('#su')
    act_btn.click()
    # 等待对象
    wait = WA.WebDriverWait(wd, timeout=3)
    titles =wait.until(lambda w:w.find_elements_by_css_selector('div[id=content_left] h3 > a')) 
    titles = [t.text for t in titles]
titles

总结

用代码控制 selenium 基本与人工操作一致,一般的流程:

  • 启动浏览器
  • 定位元素(必要时要等元素出现)
  • 操作元素(点击或其他)
  • 不断进行定位与操作过程,直到出现目标页面,爬取数据即可
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
selenium实现浏览器自动化
利用自动化在百度搜索需要的信息就需要学习一下基本的操控元素的方法,根据HTML的Id获取元素,获取百度的input输入框id
是小张啊喂
2022/08/18
4650
Python教程:selenium模块用法教程
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
Python学习者
2023/02/07
2K0
爬虫selenium+chromdriver
由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;
菲宇
2019/06/11
2.5K0
Python Selenium的使用(爬虫)
Selenium的使用 14 /10 周一阴 1 动态渲染页面爬取 对于访问Web时直接响应的数据(就是response内容可见),我们使用urllib、requests或Scrapy框架爬取。
Python知识大全
2020/02/13
3.6K0
Python Selenium的使用(爬虫)
Python Selenium 库使用技巧
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
王 瑞
2022/12/28
1.3K0
Python Selenium 库使用技巧
Selenium元素定位
find_element_by_id() find_element_by_name() find_element_by_class_name() find_element_by_tag_name() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_xpath() find_element_by_css_selector() 在这里将对各种元素定位方式统一使用百度首页进行示例,详细操作步骤有以下内容: 1.打开浏览器,进入百度首页(www.baidu.com); 2.百度页面输入关键字 www.testclass.cn 进行搜索; 3.关闭浏览器; 首先,通过前端工具(火狐浏览器的Firebug)或者直接按F12进入开发者模式查看具体前端代码:
Altumn
2019/10/21
1.3K0
Selenium元素定位
web自动化测试入门篇03——selenium使用教程
web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持,其整体的完整生态已经远远超过了C/S架构方面的测试价值。接上一篇文章,我们将继续深入探讨Selenium的相关使用方法与技巧。
Austin_zhai
2022/11/30
3.1K0
web自动化测试入门篇03——selenium使用教程
四、请求库之selenium模块
一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 from selenium import webdriver browser=webdriver.Chrome() browser=webdriver.Firefox() browser=webdriver.PhantomJS() b
用户1214487
2018/01/24
3.1K0
《手把手教你》系列基础篇之3-python+ selenium自动化测试-驱动浏览器和元素定位大法
上一篇中,只是简单地一带而过的说了一些驱动浏览器,这一篇继续说说驱动浏览器,然后再说一说元素定位的方法。
北京-宏哥
2021/07/20
1.1K0
10分钟教你如何自动化操控浏览器——Selenium测试工具
这几年,Selenium 确实挺火。作为一个 Web 应用程序自动化测试工具,Selenium 可以直接驱动浏览器,模拟真正的用户操作,解决回归测试和多浏览器兼容性测试问题;而且跟 Python 搭配,还能实现不少功能的自动化,切实提升了测试和业务效率。
天道Vax的时间宝藏
2021/08/11
6K0
彻底学会Selenium元素定位
最近收到不少初学UI自动化测试的小伙伴私信,对于元素的定位还是有些头疼,总是定位不到元素,以及不知道用哪种定位方式更好。
测试蔡坨坨
2022/12/21
8.3K0
彻底学会Selenium元素定位
一文搞懂浏览器自动化测试框架selenium!
1、selenium是什么? Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Per
石晓文
2018/04/11
1.7K0
软件测试|Selenium常见api
Selenium提供了八种定位方式:https://www.selenium.dev/documentation/webdriver/elements/locators/
霍格沃兹测试开发Muller老师
2023/01/31
7480
Python爬虫之Selenium库的使用方法
这篇文章主要介绍了Python爬虫之Selenium库的使用方法,帮助大家更好的理解和使用爬虫,感兴趣的朋友可以了解下
python学习教程
2021/01/29
7520
Python爬虫技术系列-04Selenium库的使用
针对119.0.x的版本驱动需要在 https://googlechromelabs.github.io/chrome-for-testing/ 中下载
IT从业者张某某
2023/11/07
1.5K0
Python爬虫技术系列-04Selenium库的使用
Python Selenium库的使用「建议收藏」
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
全栈程序员站长
2022/07/29
4.6K0
Python Selenium库的使用「建议收藏」
Python之Selenium模拟浏览器
模拟浏览器功能,自动执行网页中的js代码,实现动态加载。使请求更加真实(好像是真的浏览器在请求)
鱼找水需要时间
2023/02/16
1.7K0
Python之Selenium模拟浏览器
08 Python爬虫之selenium
当获取一个网站的图片数据时,只能爬取到图片的名称,并不能获得链接,而且也不能获得xpath表达式。这是应用了图片懒加载技术。
py3study
2020/01/15
1.1K0
python+selenium实现Web自动化
最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新!
conanma
2021/09/07
3.7K0
软件测试/测试开发|Python selenium CSS定位方法详解
CSS选择器是一种用于选择HTML元素的模式。它允许我们根据元素的标签名、类名、ID、属性等属性进行选择。CSS选择器的语法简单而灵活,是前端开发中常用的定位元素的方式。
霍格沃兹测试开发Muller老师
2023/12/26
5060
相关推荐
selenium实现浏览器自动化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档