对于静态网页,使用requests等库可以很方便的得到它的网页源码,然后提取出想要的信息。但是对于动态网页,情况就要复杂很多,这种页面的源码往往只有一个框架,其内容都是由JavaScript渲染出来的。这时候,我们就可以使用selenium来直接驱动浏览器进行爬取。

selenium是一个自动化测试工具,利用它可以驱动浏览器进行一系列操作,并且可以得到当前呈现的网页的源码,对动态页面的爬取非常有效。下面来说一下selenium的简单使用。

一、安装

1. selenium

推荐使用pip直接安装:

pip install selenium

2. ChromeDriver

selenium是一个自动化测试工具,需要配合浏览器驱动来使用,以Chrome为例,首先需要下载自己浏览器对应版本的驱动。版本对照可以到chromedriver与chrome版本映射表查看。另外Chrome版本70以上的可以直接到ChromeDriverMirror根据浏览器版本下载。

下载完成后需要将可执行文件配置到环境变量里,Windows系统可以将chromedriver.exe文件直接拖到python环境的scripts目录下,也可以将其所在路径配置到系统环境变量,Linux系统下可以将可执行文件移动到环境变量目录中:sudo mv chromedriver /usr/bin

配置完成后,在命令行直接输入 chromedriver 如果有如下输出,则环境配置成功:

二、使用

1. 声明浏览器对象

from selenium import webdriver
chrome = webdriver.Chrome()

这样初始化之后在使用它进行浏览器操作时会弹出浏览器界面直到关闭,显然一般情况下我们是希望它默默地在后台干活而不弹出任何界面的,所以还需要设置chrome的无界面模式(老版本可能不支持):

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome = webdriver.Chrome(chrome_options=chrome_options)

2. 访问页面

访问页面使用get函数传入url即可:

chrome.get('https://www.baidu.com')
print(chrome.page_source) # 输出当前页面源码

3. 查找节点

用get方法打开一个页面以后就可以用page_source方法获得它的源码进而使用BeautifulSoup等库进行解析,不过selenium已经提供了对节点进行操作的一系列方法,就不用再额外使用解析库了。

对于id,class等常见属性的节点可以通过find_element_by_id这样的方法获得,获取单个节点的方法有:

find_element_by_tag_name()
find_element_by_id()
find_element_by_name()
find_element_by_class_name()

另外还有查找节点的通用方法 find_element(属性名, 值) ,可以很灵活的查找自定义属性的节点。以上方法都是获取单个节点的方法,如果页面中有多个符合条件的节点则只能返回第一个结果,如果想找到所有符合条件的节点,只需要将方法中的 element 改为 elements 即可,这将返回一个节点列表。

4. 获取节点信息

定位到某个节点之后就可以使用get_attribute('属性名')方法获取它的属性信息,获取节点内容可以使用.txt方法:

node = chrome.find_element_by_id('kw')
print(node.get_attribute('class'))
print(node.text)

5. 节点交互

selenium提供了对节点的一系列操作方法,比如向输入框填入内容:

input = chrome.find_element_by_id('kw')
input.send_keys('python') # 填入内容
input.clear() # 清空输入
input.send_keys('zzu')

点击指定按钮:

button = chrome.find_element_by_id('su')
button.click()

6. 延时等待

打开一个页面时可能会由于网络问题或者页面需要加载很多动态信息从而导致立即对页面进行操作时发生错误,所以最好在打开页面后等待一段时间再进行操作,最简单的等待方式是使用time库:

import time
time.sleep(3)

显然这种方式是很不灵活的,大多数页面都可以很快的加载出来,这样的固定延时就会浪费很多时间。更好的方法是使用WebDriverWait类,用一个浏览器对象和一个最大等待时间初始化之后再调用until方法,传入等待完成的条件,最大等待时间内条件满足则立即结束等待,否则抛出异常,例如:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait # 5秒内id为content_left的节点出现则结束等待,否则抛出异常
WebDriverWait(chrome, 5).until(EC.presence_of_element_located(('id', 'content_left')))

完整的等待条件可以查看官方文档

7. 执行JavaScript代码

selenium提供了直接运行JavaScript代码的方法 excute_script ,对于selenium没有提供的动作都可以通过执行JavaScript代码来实现,比如下拉进度条以加载更多内容:

# 下拉进度条到最底部
chrome.execute_script('window.scrollTo(0, document.body.scrollHeight)')
chrome.execute_script('alert("to bottom")')

Python爬虫 使用selenium处理动态网页的更多相关文章

  1. 面向初学者的Python爬虫程序教程之动态网页抓取

    目的是对所有注释进行爬网. 下面列出了已爬网链接.如果您使用AJAX加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...

  2. [Python爬虫]使用Selenium操作浏览器订购火车票

    这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...

  3. Python 爬虫利器 Selenium 介绍

    Python 爬虫利器 Selenium 介绍 转 https://mp.weixin.qq.com/s/YJGjZkUejEos_yJ1ukp5kw 前面几节,我们学习了用 requests 构造页 ...

  4. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  5. Python爬虫之selenium的使用(八)

    Python爬虫之selenium的使用 一.简介 二.安装 三.使用 一.简介 Selenium 是自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏 ...

  6. Python爬虫之selenium高级功能

    Python爬虫之selenium高级功能 原文地址 表单操作 元素拖拽 页面切换 弹窗处理 表单操作 表单里面会有文本框.密码框.下拉框.登陆框等. 这些涉及与页面的交互,比如输入.删除.点击等. ...

  7. 在python使用selenium获取动态网页信息并用BeautifulSoup进行解析--动态网页爬虫

    爬虫抓取数据时有些数据是动态数据,例如是用js动态加载的,使用普通的urllib2 抓取数据是找不到相关数据的,这是爬虫初学者在使用的过程中,最容易发生的情况,明明在浏览器里有相应的信息,但是在pyt ...

  8. Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

    目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...

  9. python爬虫利器Selenium使用详解

    简介: 用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium. Sele ...

随机推荐

  1. Echarts饼图绘制

    实现效果: html代码: <div id="chartBody1" style="width:120%;height:28vh;"> <di ...

  2. Skill 脚本演示 ycLayerExcel.il

    https://www.cnblogs.com/yeungchie/ ycLayerExcel.il 用于 Tape-out 流程,获取当前用到的所有 lpp 等信息,并按照自定格式输出为 Excel ...

  3. number类型转date类型

    遇到用数字记录日期时,进行查询转换. create or replace function num_to_date(s in number) return dateisbegin return to_ ...

  4. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)

    导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...

  5. SpringAOP 面向切面编程

    AOP的相关概念 AOP:全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改 ...

  6. “随手记”开发记录day11

    今天,我们团队针对每个团队对我们项目的意见或建议进行了探讨,决定了接下来需要改进的地方: (1)背景图片和颜色搭配: (2)增加修改功能: (3)对功能进行更明显划分,让使用者能够更方便的使用.

  7. 蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率

    识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大.不管怎样,它能用能达到我 ...

  8. Java 程序员生产神器 IDEA 的常用快捷键、插件及设置

    对于 Java 程序员来说,使用 IDEA 集成环境是最称手的.优点不多讲,用过的人都知道.IDEA 虽好,但为了充分利用 IDEA 的优势,我分享一下我常用快捷键.插件和设置. 常用快捷键 Ctrl ...

  9. 【av68676164(p41-p42)】内存管理功能

    存储器的功能需求 容量足够大 速度足够快 信息永久保存 多道程序并行 多道程序并行带来的问题 共享:代码和数据共享,节省内存 保护:不允许内存中的程序相互间非法访问 实际存储器体系 三级存储体系 Ca ...

  10. 20、Java 泛型

    1.晓之以理,动之以码 学Java就是很上头哦,一来直接三连问!!! 什么是泛型?为什么要用泛型?泛型怎么用? 当然泛型在Java中有很重要的一个地位,在面向对象编程以及在各种设计模式中有非常广泛的应 ...