Python爬虫 使用selenium处理动态网页
对于静态网页,使用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处理动态网页的更多相关文章
- 面向初学者的Python爬虫程序教程之动态网页抓取
目的是对所有注释进行爬网. 下面列出了已爬网链接.如果您使用AJAX加载动态网页,则有两种方式对其进行爬网. 分别介绍了两种方法:(如果对代码有任何疑问,请提出改进建议)解析真实地址爬网示例是参考链接 ...
- [Python爬虫]使用Selenium操作浏览器订购火车票
这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...
- Python 爬虫利器 Selenium 介绍
Python 爬虫利器 Selenium 介绍 转 https://mp.weixin.qq.com/s/YJGjZkUejEos_yJ1ukp5kw 前面几节,我们学习了用 requests 构造页 ...
- Python爬虫之selenium库使用详解
Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...
- Python爬虫之selenium的使用(八)
Python爬虫之selenium的使用 一.简介 二.安装 三.使用 一.简介 Selenium 是自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏 ...
- Python爬虫之selenium高级功能
Python爬虫之selenium高级功能 原文地址 表单操作 元素拖拽 页面切换 弹窗处理 表单操作 表单里面会有文本框.密码框.下拉框.登陆框等. 这些涉及与页面的交互,比如输入.删除.点击等. ...
- 在python使用selenium获取动态网页信息并用BeautifulSoup进行解析--动态网页爬虫
爬虫抓取数据时有些数据是动态数据,例如是用js动态加载的,使用普通的urllib2 抓取数据是找不到相关数据的,这是爬虫初学者在使用的过程中,最容易发生的情况,明明在浏览器里有相应的信息,但是在pyt ...
- Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息
目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...
- python爬虫利器Selenium使用详解
简介: 用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium. Sele ...
随机推荐
- Springboot开发web项目
当前,Spring毫无疑问已经成为java后台对象管理标准框架,除了通过IOC能够管理我们的自定义对象的生命周期之外还提供了众多功能繁复的可配置功能模块.但同时带来了复杂的配置项,这对初学者而言简直是 ...
- swift 5.0 创建button方法
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any ...
- maven项目的运行方式,maven私服的上传下载
一.maven项目父子工程的运行方式 1.通过父项目的plugin下集成的tomacat run启动 2.通过自身项目的tomcat plugin启动,但前提是所依赖的项目必须全部都install(将 ...
- Flink状态妙用
本文主要介绍福布湿在flink实时流处理中,state使用的一些经验和心得.本文默认围观的大神已经对flink有一定了解,如果围观过程中发现了有疑问的地方,欢迎在评论区留言. 1. 状态的类别 1.1 ...
- mongodb学习这篇你就成功入门了,springboot2.0整合mongodb
本文演示以window10系统. 一:环境搭建: 1:mongodb下载和安装: http://www.mongodb.org/官网下载压缩包或者exe傻瓜式安装都行. 2:mongodb配置和搭建服 ...
- 关于Springboot配置文件的理解
一.Springboot Springboot是用来简化Spring框架搭建和开发一款框架,可以理解为是一种Spring框架的简化版. 二.如何在IDEA里面初始化Springboot 主要可以分为两 ...
- spring时遇到的小问题
最近在学习spring的时候遇到了两个小问题,在此总结一下 1.少导了所需要的包 运行测试程序,报出以下错误. 初步分析,得知是dataSource数据源没有创建成功,以为dataSource配置文件 ...
- LeetCode 115.不同的子序列 详解
题目详情 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如, ...
- Java爬取先知论坛文章
Java爬取先知论坛文章 0x00 前言 上篇文章写了部分爬虫代码,这里给出一个完整的爬取先知论坛文章代码. 0x01 代码实现 pom.xml加入依赖: <dependencies> & ...
- Windows下的Minio启动命令
1.首先安装Minio到你的 Windows系统的盘符中,例如D盘 2. 打开dos命令行,进入存放minio.exe的文件夹下,输入 minio.exe server /data 命令,意味着启动 ...