首页 > 编程语言 >Python3爬虫中Selenium的用法详解

Python3爬虫中Selenium的用法详解

时间:2022-10-17 15:13:32浏览次数:79  
标签:webdriver get selenium Selenium 爬虫 element find Python3 browser

Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效。本节中,就让我们来感受一下它的强大之处吧。

1. 准备工作

本节以Chrome为例来讲解Selenium的用法。在开始之前,请确保已经正确安装好了Chrome浏览器并配置好了ChromeDriver。另外,还需要正确安装好Python的Selenium库,详细的安装和配置过程可以参考第1章。

2. 基本使用

准备工作做好之后,首先来大体看一下Selenium有一些怎样的功能。示例如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() try:     browser.get('https://www.baidu.com')     input = browser.find_element_by_id('kw')     input.send_keys('Python')     input.send_keys(Keys.ENTER)     wait = WebDriverWait(browser, 10)     wait.until(EC.presence_of_element_located((By.ID'content_left')))     print(browser.current_url)     print(browser.get_cookies())     print(browser.page_source) finally:     browser.close()

运行代码后发现,会自动弹出一个Chrome浏览器。浏览器首先会跳转到百度,然后在搜索框中输入Python,接着跳转到搜索结果页,如图7-1所示。

                                                                        图7-2 源代码

可以发现,它的id是q,name也是q。此外,还有许多其他属性,此时我们就可以用多种方式获取它了。比如,find_element_by_name()是根据name值获取,find_element_by_id()是根据id获取。另外,还有根据XPath、CSS选择器等获取的方式。

我们用代码实现一下:

1 2 3 4 5 6 7 8 from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.taobao.com') input_first = browser.find_element_by_id('q') input_second = browser.find_element_by_css_selector('#q') input_third = browser.find_element_by_xpath('//*[@id="q"]') print(input_first, input_second, input_third) browser.close()

这里我们使用3种方式获取输入框,分别是根据ID、CSS选择器和XPath获取,它们返回的结果完全一致。运行结果如下:

1 2 3 4 5 6 <selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.564956309 6161541-1")>  <selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.564956309 6161541-1")>  <selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.564956309 6161541-1")>

可以看到,这3个节点都是WebElement类型,是完全一致的。

这里列出所有获取单个节点的方法:

1 2 3 4 5 6 7 8 find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector

另外,Selenium还提供了通用方法find_element(),它需要传入两个参数:查找方式By和值。实际上,它就是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID, id),二者得到的结果完全一致。我们用代码实现一下:

1 2 3 4 5 6 7 8 from selenium import webdriver from selenium.webdriver.common.by import By    browser = webdriver.Chrome() browser.get('https://www.taobao.com') input_first = browser.find_element(By.ID'q') print(input_first) browser.close()

实际上,这种查找方式的功能和上面列举的查找函数完全一致,不过参数更加灵活。

多个节点

如果查找的目标在网页中只有一个,那么完全可以用find_element()方法。但如果有多个节点,再用find_element()方法查找,就只能得到第一个节点了。如果要查找所有满足条件的节点,需要用find_elements()这样的方法。注意,在这个方法的名称中,element多了一个s,注意区分。

比如,要查找淘宝左侧导航条的所有条目,如图7-3所示。

                                                                   图7-4 拖曳前的页面

关于更多等待条件的参数及用法,可以参考官方文档:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions。

12. 前进和后退

平常使用浏览器时都有前进和后退功能,Selenium也可以完成这个操作,它使用back()方法后退,使用forward()方法前进。示例如下:

1 2 3 4 5 6 7 8 9 10 import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com/') browser.get('https://www.taobao.com/') browser.get('https://www.python.org/') browser.back() time.sleep(1) browser.forward() browser.close()

这里我们连续访问3个页面,然后调用back()方法回到第二个页面,接下来再调用forward()方法又可以前进到第三个页面。

13. Cookies

使用Selenium,还可以方便地对Cookies进行操作,例如获取、添加、删除Cookies等。示例如下:

1 2 3 4 5 6 7 8 from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name''name''domain''www.zhihu.com''value''germey'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())

首先,我们访问了知乎。加载完成后,浏览器实际上已经生成Cookies了。接着,调用get_cookies()方法获取所有的Cookies。然后,我们添加一个Cookie,这里传入一个字典,有name、domain和value等内容。接下来,再次获取所有的Cookies。可以发现,结果就多了这一项新加的Cookie。最后,调用delete_all_cookies()方法删除所有的Cookies。再重新获取,发现结果就为空了。

控制台的输出如下:

1 2 3 4 5 6 7 8 9 [{'secure'False'value': '"NGM0ZTM5NDAwMWEyNDQwNDk5ODlkZWY3OTkxY2I0NDY=|1491604091|236e34290a6f407bfbb517888 849ea509ac366d0"', 'domain': '.zhihu.com', 'path': '/', 'httpOnly': False, 'name': 'l_cap_id', 'expiry':  1494196091.403418}] [{'secure'False'value''germey''domain''.www.zhihu.com''path''/''httpOnly'False'name' 'name'},  {'secure'False'value': '"NGM0ZTM5NDAwMWEyNDQwNDk5ODlkZWY3OTkxY2I0NDY=|1491604091|236e34290a6f407bfbb517888849 ea509ac366d0"', 'domain': '.zhihu.com', 'path': '/', 'httpOnly': False, 'name': 'l_cap_id', 'expiry':  1494196091.403418}] []

14. 选项卡管理

在访问网页的时候,会开启一个个选项卡。在Selenium中,我们也可以对选项卡进行操作。示例如下:

1 2 3 4 5 6 7 8 9 10 11 import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.execute_script('window.open()') print(browser.window_handles) browser.switch_to_window(browser.window_handles[1]) browser.get('https://www.taobao.com') time.sleep(1) browser.switch_to_window(browser.window_handles[0]) browser.get('https://python.org')

控制台的输出如下:

1 ['CDwindow-4f58e3a7-7167-4587-bedf-9cd8c867f435''CDwindow-6e05f076-6d77-453a-a36c-32baacc447df']

首先访问了百度,然后调用了execute_script()方法,这里传入window.open()这个JavaScript语句新开启一个选项卡。接下来,我们想切换到该选项卡。这里调用window_handles属性获取当前开启的所有选项卡,返回的是选项卡的代号列表。要想切换选项卡,只需要调用switch_to_window()方法即可,其中参数是选项卡的代号。这里我们将第二个选项卡代号传入,即跳转到第二个选项卡,接下来在第二个选项卡下打开一个新页面,然后切换回第一个选项卡重新调用switch_to_window()方法,再执行其他操作即可。

15. 异常处理

在使用Selenium的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类错误,程序便不会继续运行了。这里我们可以使用try except语句来捕获各种异常。

首先,演示一下节点未找到的异常,示例如下:

1 2 3 4 from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.find_element_by_id('hello')

这里首先打开百度页面,然后尝试选择一个并不存在的节点,此时就会遇到异常。

运行之后控制台的输出如下:

1 2 3 4 5 NoSuchElementException Traceback (most recent call last) <ipython-input-23-978945848a1bin <module>()       3 browser = webdriver.Chrome()       4 browser.get('https://www.baidu.com') ----5 browser.find_element_by_id('hello')

可以看到,这里抛出了NoSuchElementException异常,这通常是节点未找到的异常。为了防止程序遇到异常而中断,我们需要捕获这些异常,示例如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElementException browser = webdriver.Chrome() try:     browser.get('https://www.baidu.com') except TimeoutException:     print('Time Out') try:     browser.find_element_by_id('hello') except NoSuchElementException:     print('No Element') finally:     browser.close()

这里我们使用try except来捕获各类异常。比如,我们对find_element_by_id()查找节点的方法捕获NoSuchElementException异常,这样一旦出现这样的错误,就进行异常处理,程序也不会中断了。

控制台的输出如下:

1 No Element

关于更多的异常类,可以参考官方文档:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions。

现在,我们基本对Selenium的常规用法有了大体的了解。使用Selenium,处理JavaScript不再是难事。

 

 

 

 

标签:webdriver,get,selenium,Selenium,爬虫,element,find,Python3,browser
From: https://www.cnblogs.com/ylxtiankong/p/16799238.html

相关文章

  • 使用爬虫代理采集网站失败怎么办
    爬虫程序采集网站必须使用动态代理,才能避免出现网站访问频繁的限制,这是众所周知的。但是在具体采集网站的过程中,即使使用了动态代理依然会出现403、503或429的反爬错误......
  • 最新版本小红书接口 xhs接口 小红书数据 小红书爬虫 小红书APP 小红书api
    最新版本APP协议,可提供数据接口 q+3275974800!仅供学习交流,如果侵权请联系删除,谢谢!达人详情  笔记详情  笔记列表 ......
  • 配置win10+anaconda3+python3.6+pytorch
    1.下载安装anaconda如果下载太慢,可以选择清华镜像下载:​​https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/​​​2.配置环境变量3.修改镜像如果按照提示http......
  • python 爬虫 相关包
    请求1requests HTML/XML的解析器 1pyquerypyquery得名于jQuery(知名的前端js库),可以用类似jQuery的语法解析网页。2lxmllxml有很高的解析效率,支持xPath......
  • selenium 自动化登录(京东案列)
    京东这一个网站呢,适合和豆瓣有点相似的,但是呢,豆瓣应该是最近改版了,看过以前的视频都知道,豆瓣和京东,里面的滑块图片和背景图片都能在我们的网页中的src中找到但是呢,豆瓣改成......
  • 爬虫-获取某网站token(可变参数)的过程
    使用Selenium去获取token首先说明该方案失败了。由于该网站是不需要登录的,我分析了所有的请求过程,没有找到服务端返回token的请求。最终还是抱着试一试的心态,使用selenium......
  • 【Python】Centos7安装Python3和pip
    安装Python3#wgethttps://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz#tar-xvJfPython-3.6.2.tar.xz#cdPython-3.6.2#./configure--prefix=/data......
  • 爬虫实例——爬取豆瓣网 top250 电影的信息
    本节通过一个具体的实例来看下编写爬虫的具体过程。以爬取豆瓣网top250电影的信息为例,top250电影的网址为:​​https://movie.douban.com/top250​​​。在浏览器的地址栏......
  • 在docker应用中安装python3环境,运行程序,输出日志时间比本地时间慢8小时
    根据排查原因是docker容器时间以0时区为准,中国在东8区,因此输出时间比中国时间慢了8小时解决方法一:1:首先,进入docker应用中dockerexec-it-urootjenkinsbash说明:使......
  • python3.10新特性
    python3.10新特性1.指定1个或多个属性类型.deffunc(num:int|float|str):print(num)func(['a',])#当传入参数与要求不符时,会给予提示2.更严格zip()......