Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 爬虫(四):Selenium 框架

Python 爬虫(四):Selenium 框架

作者头像
Python小二
发布于 2020-08-18 01:29:31
发布于 2020-08-18 01:29:31
1.3K00
代码可运行
举报
文章被收录于专栏:Python小二Python小二
运行总次数:0
代码可运行

Selenium 是一个用于测试 Web 应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样。它支持多种平台:Windows、Linux、Mac,支持多种语言:Python、Perl、PHP、C# 等,支持多种浏览器:Chrome、IE、Firefox、Safari 等。

1 安装

1)安装 Selenium

pip install selenium

2)安装 WebDriver

主要浏览器 WebDriver 地址如下:

Chrome:http://chromedriver.storage.googleapis.com/index.html

Firefox:https://github.com/mozilla/geckodriver/releases/

IE:http://selenium-release.storage.googleapis.com/index.html

本文以 Chrome 为例,本机为 Windows 系统,WebDriver 使用版本 78.0.3904.11,Chrome 浏览器版本为 78.0.3880.4 驱动程序下载好后解压,将 chromedriver.exe 放到 Python 安装目录下即可。

2 操作浏览器

2.1 打开浏览器

1)普通方式

以打开去 163 邮箱为例,使用 Chrome 浏览器

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

browser = webdriver.Chrome()
browser.get('https://mail.163.com/')

使用 Firefox 浏览器

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

browser = webdriver.Firefox()
browser.get('https://mail.163.com/')

使用 IE 浏览器

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

browser = webdriver.Ie()
browser.get('https://mail.163.com/')

2)加载配置方式

以 Chrome 为例,在 Chrome 浏览器地址栏输入 chrome://version/ 打开,如图所示:

我们可以看到个人资料路径这一项,取到路径:C:\Users\admin\AppData\Local\Google\Chrome\User Data,取到 User Data 使用自己设置的配置,取到 Default 使用默认配置。看下示例:

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

option = webdriver.ChromeOptions()
# 自己的数据目录(需要将复制的路径中的 \ 替换成 / 或进行转义 \\)
# option.add_argument('--user-data-dir=C:/Users/admin/AppData/Local/Google/Chrome/User Data')
option.add_argument('--user-data-dir=C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\User Data')
browser = webdriver.Chrome(chrome_options=option)
browser.get('https://mail.163.com/')
# 关闭
browser.quit()

如果执行时报错没有打开指定页面,可先将浏览器关闭再执行。

3)Headless 方式

前两种方式都是有浏览器界面的方式,Headless 模式是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行我们的程序。这种方式更加方便测试 Web 应用、获得网站的截图、做爬虫抓取信息等。看下示例:

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

chrome_options = webdriver.ChromeOptions()
# 使用 headless 无界面浏览器模式
chrome_options.add_argument('--headless')
# 禁用 gpu 加速
chrome_options.add_argument('--disable-gpu')

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://mail.163.com/'
browser.get(url)
print('browser text = ',browser.page_source)
browser.quit()

2.2 设置浏览器窗口

最大化显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
browser.maximize_window()

最小化显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
browser.minimize_window()

自定义大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 宽 500,高 800
browser.set_window_size(500,800)

2.3 前进后退

前进

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
browser.forward()

后退

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
browser.back()

3 元素定位

当我们想要操作一个元素时,首先需要找到它,Selenium 提供了多种元素定位方式,我们以 Chrome 浏览器 Headless 方式为例。看下示例:

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

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') 
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://xxx.xxx.com/'
browser.get(url)
data = browser.page_source

假设访问地址 https://xxx.xxx.com/,返回 data 为如下内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
 <body>
  <form>
   <input id="fid" name="fid" type="text" />
   <input id="firstName" name="fname" class="fname" type="text" />
   <input id="lastName" name="fname" class="fname" type="text" />
   <a href="index.html">index</a>
  </form>
 </body>
<html>

1)根据 id 定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
browser.find_element_by_id('fid')

2)根据 name 定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回第一个元素
browser.find_element_by_name('fname')
# 返回所有元素
browser.find_elements_by_name('fname')

3)根据 class 定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回第一个元素
browser.find_element_by_class_name('fname')
# 返回所有元素
browser.find_elements_by_class_name('fname')

4)根据标签名定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回第一个元素
browser.find_element_by_tag_name('input')
# 返回所有元素
browser.find_elements_by_tag_name('input')

5)使用 CSS 定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回第一个元素
browser.find_element_by_css_selector('.fname')
# 返回所有元素
browser.find_elements_by_css_selector('.fname')

6)使用链接文本定位超链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回第一个元素
browser.find_element_by_link_text('index')
# 返回所有元素
browser.find_elements_by_link_text('index')

# 返回第一个元素
browser.find_element_by_partial_link_text('index')
# 返回所有元素
browser.find_elements_by_partial_link_text('index')

7)使用 xpath 定位

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回第一个元素
browser.find_elements_by_xpath("//input[@id='fid']")
# 返回所有元素
browser.find_elements_by_xpath("//input[@name='fname']")

4 等待事件

Web 应用大多都使用 AJAX 技术进行加载,浏览器载入一个页面时,页面内的元素可能会在不同的时间载入,这会加大定位元素的困难程度,因为元素不在 DOM 里,会抛出 ElementNotVisibleException 异常,使用 Waits,我们就可以解决这个问题。

Selenium WebDriver 提供了显式和隐式两种 Waits 方式,显式的 Waits 会让 WebDriver 在更深一步的执行前等待一个确定的条件触发,隐式的 Waits 则会让 WebDriver 试图定位元素的时候对 DOM 进行指定次数的轮询。

4.1 显示等待

WebDriverWait 配合该类的 until()until_not() 方法,就能够根据判断条件而进行灵活地等待了。它主要流程是:程序每隔 x 秒检查一下,如果条件成立了,则执行下一步操作,否则继续等待,直到超过设置的最长时间,然后抛出 TimeoutException 异常。先看一下方法:

__init__(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

  • driver: 传入 WebDriver 实例;
  • timeout: 超时时间,单位为秒;
  • poll_frequency: 调用 until 或 until_not 中方法的间隔时间,默认是 0.5 秒;
  • ignored_exceptions: 忽略的异常,如果在调用 until 或 until_not 的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有 NoSuchElementException。

until(method, message='')

  • method: 在等待期间,每隔一段时间(init 中的 poll_frequency)调用这个方法,直到返回值不是 False;
  • message: 如果超时,抛出 TimeoutException,将 message 传入异常。

until_not(method, message='')

until 方法是当某条件成立则继续执行,until_not 方法与之相反,它是当某条件不成立则继续执行,参数与 until 方法相同。

以去 163 邮箱为例,看一下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://mail.163.com/')
try:
    # 超时时间为 5 秒
    data = WebDriverWait(browser,5).until(
        EC.presence_of_element_located((By.ID,'lbNormal'))
    )
    print(data)
finally:
    browser.quit()

示例中代码会等待 5 秒,如果 5 秒内找到元素则立即返回,否则会抛出 TimeoutException 异常,WebDriverWait 默认每 0.5 秒调用一下 ExpectedCondition 直到它返回成功为止。

4.2 隐式等待

当我们要找一个或者一些不能立即可用的元素的时候,隐式 Waits 会告诉 WebDriver 轮询 DOM 指定的次数,默认设置是 0 次,一旦设定,WebDriver 对象实例的整个生命周期的隐式调用也就设定好了。看一下方法:

implicitly_wait(time_to_wait)

隐式等待是设置了一个最长等待时间 time_to_wait,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。看到了这里,我们会感觉有点像 time.sleep(),它们的区别是:time.sleep() 必须等待指定时间后才能继续执行, time_to_wait 是在指定的时间范围加载完成即执行,time_to_wait 比 time.sleep() 更灵活一些。

看下示例:

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

browser = webdriver.Chrome()
browser.implicitly_wait(5)
browser.get('https://mail.163.com/')
data = browser.find_element_by_id('lbNormal')
print(data)
browser.quit()

5 登录 163 邮箱

最后,我们用 Selenium 来做个登录 163 邮箱的实战例子。

5.1 方式一

我们通过地址 https://email2.163.com/ 登录,如图所示:

从图中我们发现直接进了 163 邮箱用户名、密码登录页,我们直接输入用户名、密码,点击登录按钮即可。示例如下:

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

browser = webdriver.Chrome()
browser.get('https://email2.163.com/')
browser.switch_to.frame(browser.find_element_by_xpath('//iframe[starts-with(@id,"x-URS")]'))
browser.implicitly_wait(2)
# 自己的用户名
browser.find_element_by_xpath('//input[@name="email"]').send_keys('xxx')
# 自己的密码
browser.find_element_by_xpath('//input[@name="password"]').send_keys('xxx')
browser.find_element_by_xpath('//*[@id="dologin"]').click()
browser.implicitly_wait(2)
print(browser.page_source)
browser.implicitly_wait(2)
# 关闭
browser.quit()

5.2 方式二

第二种方式我们使用地址 https://mail.163.com/,先手动打开看一下:

从图中我们会发现,登录页面首先展示的是二维码登录方式,因此我们需要先点击上图红框圈住的位置切换到用户名、密码的登录方式,如图所示:

此时,我们先输入用户名、密码,然后点击登录按钮即可。详细代码见如下 GitHub 仓库。

https://github.com/ityard/python-demo/tree/master/selenium-163-demo

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小二 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
爬虫篇 | 快速入门selenium(十一)
Selenium是一个用于web自动化测试的工具,Selenium测试直接运行在浏览器中,就好像一个真正的用户在操作一样。
润森
2019/08/29
1.9K0
爬虫篇 | 快速入门selenium(十一)
Selenium利用cookie免登陆音悦台
Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能
py3study
2020/01/07
1K0
Selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器,但是现在谷歌的无头比较火,下面展示谷歌的无头)
HammerZe
2022/05/11
3.3K0
Selenium
Python教程:selenium模块用法教程
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
Python学习者
2023/02/07
2.1K0
python爬虫之selenium记录
Chrome浏览器驱动下载地址:http://npm.taobao.org/mirrors/chromedriver/ 基础代码: browser = webdriver.Firefox() //选择浏览器 browser.find_element_by_id().send_keys() //寻找控件通过ID,且发送值selenium browser.find_element_by_id().click() //搜索的按钮的id 叫su ,且点击 browser.quit() //退出并关闭窗口的每一个相关
SingYi
2022/07/14
3780
Selenium自动化爬虫
Selenium 打开页面后,默认是在父级 Frame 里面操作,如果页面中还有子 Frame,Selenium 是不能获取到子 Frame 里面的节点的。这时就需要使用 switch_to.frame 方法来切换 Frame。
北山啦
2022/11/27
1.4K0
Selenium自动化爬虫
Python爬虫——Selenium
安装chromium 官方下载地址是http://chromedriver.chromium.org/downloads,注意需要和本地安装的Chrome浏览器版本相匹配。如当前ChoreDriver2.42支持的Chrome版本是v68到v70
羊羽shine
2019/05/29
9790
Python 爬虫之Selenium终极绝招
这里简单解释一下什么是Selenium,它其实是一个网站前端压力测试框架,更通俗的说,它能直接操作浏览器,试想一下,网页是在浏览器里面加载的,如果我们能用代码操控浏览器,那我们想要爬取什么数据不能通过浏览器获取?无所不爬!
arcticfox
2019/06/26
1.4K0
Python 爬虫之Selenium终极绝招
Selenium&Chrome实战:动态爬取51job招聘信息
Selenium3.8版本以后,已经不支持PhanTomJS了,可以使用谷歌,火狐的无头浏览器来代替PhanTomJS
py3study
2020/01/07
1.9K0
2万字带你了解Selenium全攻略
今天带大家一起学(复)习模拟浏览器运行的库Selenium,它是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera和Edge等。
可以叫我才哥
2021/12/28
3.5K0
2万字带你了解Selenium全攻略
08 Python爬虫之selenium
当获取一个网站的图片数据时,只能爬取到图片的名称,并不能获得链接,而且也不能获得xpath表达式。这是应用了图片懒加载技术。
py3study
2020/01/15
1.2K0
Selenium 动态爬取51job招聘信息
通过selenium的find_element_by_id 找到 id = 'kwdselectid',然后send_keys('关键字')即可模拟用户输入
py3study
2020/11/03
1.4K1
Selenium 动态爬取51job招聘信息
Selenium
元素定位可以根据id,class等属性定位,也可以根据标签名等信息进行定位。使用定位函数后会返回一个WebElement类或一个WebElement类的列表,用于接下来的操作。
TomatoCool
2023/07/31
3230
四、请求库之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
Python+Selenium详解(超全)
selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比 QTP 有诸多有点:
用户8449980
2021/07/11
1.6K0
爬虫selenium+chromdriver
由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;
菲宇
2019/06/11
2.6K0
《手把手带你学爬虫──初级篇》第5课 Selenium WebDriver的用法
Selenium 是一个自动化测试工具,WebDriver是它提供的一套操作浏览器的API,由于WebDriver针对多种编程语言都实现了这些API,因此它可以支持多种编程语言。
GitOPEN
2019/01/29
2.9K0
《手把手带你学爬虫──初级篇》第5课  Selenium WebDriver的用法
基于Selenium写的Python天气爬虫
天气如此炎热! 写个爬虫降降温??? 看完天气预报,嗯瞬间感觉热了好多! 学习还是要继续! 昨天没有说明XPath 今天现给补充点常用规则 XPath常用规则 表达式 描述 nodename 选取
萌海无涯
2019/08/03
7550
django+selenium 12306接口车票查询
还需要下载一个谷歌浏览器对应的chromedriver,下载地址:https://npm.taobao.org/mirrors/chromedriver/
py3study
2020/01/17
1.3K0
python爬虫从入门到放弃(八)之 Selenium库的使用
本文主要介绍了如何通过Python的Selenium库来自动化操作浏览器,包括打开浏览器、输入网址、获取页面元素、模拟用户操作等。同时,还介绍了如何通过调用JavaScript来实现更复杂的操作。
coders
2018/01/04
3.2K0
python爬虫从入门到放弃(八)之 Selenium库的使用
相关推荐
爬虫篇 | 快速入门selenium(十一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验