专栏/【20天搞定Python爬虫】第十二天:基于Python +Selenium的爬虫详解

【20天搞定Python爬虫】第十二天:基于Python +Selenium的爬虫详解

2021年08月18日 06:42--浏览 · --点赞 · --评论
粉丝:21.0万文章:116

【千锋教育干货暴击】


如果你想更好的学习python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!

↓    ↓    ↓

千锋教育Python教程_700集零基础Python入门到精通教程(保姆级新手教程)

千锋教育Python教程全套_python零基础入门到精通(学完可达到Python工程师水平) 


一、selenium简介

由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;

1、什么是selenium

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。

selenium模块本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器;由于selenium解析执行了CSS、JavaScript所以相对requests它的性能是低下的;

2、selenium的用途

1)selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用浏览器自动访问目标站点并操作,那我们也可以拿它来做爬虫。

2)selenium本质上是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等...进而拿到网页渲染之后的结果,可支持多种浏览器

二、selenium的安装与测试

1、下载selenium模块:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium

或者在pycharm中下载

2、安装浏览器驱动

1) Google浏览器驱动(在下载驱动之前,查看一下chrome浏览器的版本号,如下:

图片

国内镜像网站地址:http://npm.taobao.org/mirrors/chromedrive

图片

当然也可以去官网找最新的版本,官网: 

https://sites.google.com/a/chromium.org/chromedriver/downloads

另外注意:把下载好的chromedriver.exe放到python安装路径的scripts目录中即可

2) firefox浏览器驱动:

selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver

下载链接:https://github.com/mozilla/geckodriver/releases

3) 测试是否安装成功

图片

三、selenium的使用

所谓模拟浏览器基本就是下面的流程:

  1. 请求

  2. 显示页面

  3. 查找元素

  4. 点击可点击元素

所以如何使用selenium找到页面中的标签,进而触发标签事件,就会变的尤为重要

1. selenium选择器

要想定位页面的元素,selenium也提供了一系列的方法。

1) 通过标签id属性进行定位

2) 通过标签name属性进行定位

3) 通过标签名进行定位

4) 通过CSS查找方式进行定位

5) 通过xpath方式定位

6通过搜索页面中链接进行定位

有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

通过搜索页面中链接进行定位 ,可以支持模糊匹配**

2. selenium显示等待和隐式等待

显示等待:就是明确要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception

WebDriverWait()一般由until()或 until_not()方法配合使用 until(method, message=' '):调用该方法提供的驱动程序作为一个参数,直到返回值为True until_not(method, message=' '):调用该方法提供的驱动程序作为一个参数,直到返回值为False

隐式等待:就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。

注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素

例如:driver.implicitly_wait(10) 。如果元素在10s内定位到了,继续执行。如果定位不到,将以循环方式判断元素是否被定位到。如果在10s内没有定位到,则抛出异常

另外还有一种就是我们常用的sleep,我们称为:强制等待。有时候我们希望脚本在执行到某一位置时暂停一段时间等待页面加载,这时可以使用sleep()方法。sleep()方法会固定休眠一定的时长,然后再继续执行。sleep()方法默认参数以秒为单位。

3. 元素交互操作

用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽(滑动验证)等等。而selenium给我们提供了一个类来处理这类事件——ActionChains;

这个类基本能够满足我们所有对鼠标操作的需求。

1) actionChains的基本使用:

首先需要了解ActionChains的执行原理,当你调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,队列中的时间会依次执行。

这种情况下我们可以有两种调用方法:

链式写法

分步写法

两种写法本质是一样的,ActionChains都会按照顺序执行所有的操作。

2) actionChains方法列表:

示例代码:

或者前进后退相关

四、综合案例


投诉或建议