对于静态网页,使用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. Skill 脚本演示 ycSetNetColor.il

    https://www.cnblogs.com/yeungchie/ ycSetNetColor.il 将原理图中某一 netName 的所有连线同时修改为一种 颜色 / 线宽. 回到目录

  2. 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集

    LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...

  3. ThinkPHP6 核心分析之应用程序初始化

    runWithRequest () 方法 在 Http 类的 run() 方法中,得到 think\Request 类的实例后,程序接着执行 $response = $this->runWith ...

  4. CSS样式大全(网络收集整理)

    CSS样式大全(网络收集整理 字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 { ...

  5. Meow 攻击会删除不安全(开放的)的Elasticsearch(及MongoDB) 索引,然后建一堆以Meow结尾的奇奇怪怪的索引(如:m3egspncll-meow)

    07月29日,早上照例一来,先连接Elasticsearch查看日志[禁止转载,by @CoderBaby],结果,咦,什么情况,相关索引被删除了,产生了一堆以Meow开头的奇奇怪怪的索引,如下图: ...

  6. 每日一道 LeetCode (8):删除排序数组中的重复项和移除元素

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  7. JS DOM笔记

    js的组成     ECMAScript:JS的语法     DOM:页面文档对象模型     BOM:浏览器对象模型     web APIs     是浏览器提供的一套操作浏览器功能和页面元素的A ...

  8. Linux(Centos 7)下安装Git并配置连接GitHub

    1.安装git  Centos7 查看git --version 2.配置用户名密码 git config --global user.name "xxx" git config ...

  9. Vue watch 深层监听

    Vue中监听某个对象的属性 为了避免监听整个对象导致效率问题,可以监听某个对象的特定属性 watch: { 'deptModel.depts': { handler(newVal, oldVal) { ...

  10. 浏览器自动化的一些体会4 webBrowser控件之零碎问题2

    1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意 ...