对于静态网页,使用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. PHP money_format() 函数

    实例 en_US 国际格式: <?php高佣联盟 www.cgewang.com$number = 1234.56;setlocale(LC_MONETARY,"en_US" ...

  2. luogu P3830 [SHOI2012]随机树 期望 dp

    LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...

  3. [转]Post和Get的区别

    作者:zhanglinblog     来源:https://urlify.cn/FnYBbu 这个问题几乎面试的时候都会问到,是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以 ...

  4. 郭超:阿里云Cassandra背后的故事

    大家好,我是阿里云数据库产品事业部的玄陵,真名郭超. ​ 本次的分享大概分三个部分:Cassandra云数据库简介.Cassandra云数据库特性以及Q&A. ​ 我们先了解一下Cassand ...

  5. Java web 小测验

    题目要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单 ...

  6. IDEA的基本使用技巧

    博主在大学里学习的专业是计算机科学与技术,在大三的时候才开始接触 “加瓦”,学习加瓦首先就需要一个运行环境,因为受到了老师们的影响,我第一个编辑JAVA的软件环境便是Eclipse,在学校里学习和使用 ...

  7. C#LeetCode刷题-蓄水池抽样

    蓄水池抽样篇 # 题名 刷题 通过率 难度 382 链表随机节点   47.0% 中等 398 随机数索引   41.6% 中等

  8. shazidouhui的使用体验

    这个软件有三个界面,一个是我的,一个是已批改作业,一个是未完成作业,但是,我不知道怎么用除了“我的”这个界面以外的其他两个界面,这一点还是需要优化优化,另外就是登陆界面确实还存在一点问题,有待改进.

  9. MyBatis-Pro,新一代的MyBatis增强框架

    框架功能 内置提供基础CRUD方法 提供根据方法名自进行单表查询(包括查询.统计.删除等) 接入方法 Spring Boot <dependency> <groupId>com ...

  10. ElasticSearch 7.8.1集群搭建

    通往集群的大门 集群由什么用? 高可用 高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间.如果系统每运行100个时间 ...