深圳网站和app建设方案,天水市建设银行官方网站,怎么自己制作网站免费,深圳设计产业园python爬虫10#xff1a;selenium库 前言 python实现网络爬虫非常简单#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点#xff0c;方便以后复习。 申明 本系列所涉及的代码仅用于个人研究与讨论#xff0c;并不会对网站产…python爬虫10selenium库 前言 python实现网络爬虫非常简单只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点方便以后复习。 申明 本系列所涉及的代码仅用于个人研究与讨论并不会对网站产生不好影响。 目录结构 文章目录 python爬虫10selenium库1. 概述与安装1.1 概述1.2 安装 2. 基本使用2.1 声明浏览器对象2.2 访问页面2.3 关闭访问页面和浏览器2.4 查找节点方法2.5 节点交互2.6 动作链2.7 获取网页信息和节点信息2.8 执行js代码2.9 切换Frame2.10 延时等待2.11 切换窗口 3. 总结 1. 概述与安装
1.1 概述
selenium其实严格来说并不属于爬虫库而是用于测试的库不过这里我们就拿来当作爬虫库来用就行。
selenium相比于其他的爬虫库而言更加综合其既可以请求也可以解析并且过程是可视化的即请求的时候你可以看见程序打开浏览器然后按照你设定的步骤进行。
1.2 安装
selenium的安装以前比较麻烦需要自己去安装浏览器驱动但是现在最新版本的selenium已经不需要我们自己装驱动了当你运行代码的时候会自动检测安装。
因此只需要安装
pip install selenium 可以用下面代码测试浏览器驱动是否安装谷歌浏览器
# 导包
from selenium import webdriver# 浏览器初始化
driver webdriver.Chrome()
# 打开百度
driver.get(https://www.baidu.com)
# 打印源码
print(driver.page_source)
# 关闭
driver.quit() 其运行过程就是自动打开浏览器并打开百度搜索页面然后返回源码。
2. 基本使用
2.1 声明浏览器对象
使用selenium首先需要声明浏览器对象除去我之前使用的chrome浏览器还支持Firefox、Edge等等但是一般常用的是chrome浏览器所以这里我只给出chrome浏览器的声明方法其他的声明方法都类似只需要修改浏览器名称即可。
# 导包
from selenium import webdriver# 声明浏览器对象
driver webdriver.Chrome()2.2 访问页面
这里不分什么get或者post统一的只有get方法。语法如下
driver.get(url)
# 示例
driver.get(https://www.baidu.com)2.3 关闭访问页面和浏览器
# 关闭访问页面和浏览器
driver.close()
# 关闭驱动
driver.quit()2.4 查找节点方法
查找单个节点 作用只返回第一个匹配的节点。 方法如下driver.find_element()
常用参数
1. by需要导入from selenium.webdriver.common.by import By指定获取元素的方式常见的如By.NAME标签name属性获取、By.ID标签id属性获取、By.CLASS_NAME标签class属性获取、By.TAG_NAME标签名字获取、By.XPATH通过xpath语法获取、By.CSS_SELECTOR通过css选择器获取......2. value配合上面的by参数填写相应的值即可查找多个节点 方法名只是多了一个s变为了driver.find_elements()参数都是一样的。
2.5 节点交互
常用的节点交互有两种输入与点击这也是我们在浏览器中最常用的两种了。方法分别如下
# 输入内容
xxx.send_keys(内容)# xxx代表着一个节点
xxx.clear() #清除输入的内容
# 点击
xxx.click() 下面给大家一个案例 打开百度输入python并且点击搜索按钮进行搜索,之后再删除python搜索java
# 导包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By# 浏览器声明
driver webdriver.Chrome()
# 打开百度
driver.get(https://www.baidu.com)
# 获取输入框节点
input_tag driver.find_element(byBy.CLASS_NAME,values_ipt)
# 获取搜索按钮
search_tag driver.find_element(byBy.XPATH,value//input[idsu])
# 输入python
input_tag.send_keys(python)
# 点击按钮
search_tag.click()
# 暂停2秒
time.sleep(2)
# 清楚python
input_tag.clear()
# 输入java
input_tag.send_keys(java)
# 搜索
search_tag.click()
# 暂停2秒
time.sleep(2)
# 退出
driver.close()
driver.quit() 运行结果如下动图所示 2.6 动作链
有些动作如拖拽、键盘按键等没有具体的某个节点这种方式就需要动作链来执行你可以这样理解你首先声明一个动作链对象然后这个对象将一条一条的执行你写的代码。
这个方面需要大家自行查找官方文档因为这个我日常用的不多对于自己来说也许只有破解验证码的时候才用得上但是现在的验证码破解越来越难了所以我基本上用不到这块。
2.7 获取网页信息和节点信息 网页信息 网页源码
方法 driver.page_source
作用获取网页源码 网页标题
方法driver.title
作用获取网页标题节点信息下面的xxx指的是的某个节点标签 获取属性
方法 xxx.get_attribute(属性名字)
作用 获取属性值
说明 xxx代表着节点 获取文本
方法 xxx.text
作用 获取文本值 获取其他信息
获取id
xxx.id 获取节点名称
xxx.tag_name 获取节点在页面中的位置
xxx.location 这个还是很有用的对于滑动验证的验证码可以使用 获取节点大小宽和高
xxx.size2.8 执行js代码
之前的功能如输入内容点击按钮等其他库可以使用其他方式实现但是执行js代码确实selenium一个强大的功能。
比如我们有时候爬取动态渲染的网页如百度图片我们鼠标向下滑动越来越多的图片加载出来这就是动态渲染或者我们有时候看见的“更多”有些内容显示不全点更多可以在当前页面查看全部内容都是动态渲染我们可以使用js代码模拟实现。
这个方面考察大家的js功底如果不会的朋友也不用紧张如果你需要啥功能可以在网上搜索将网页的js代码拷贝下来即可。
语法如下
driver.execute_script(js代码) 代码演示(效果直接滑动到网页底部)
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 浏览器声明
driver webdriver.Chrome()
# 打开一个网页
driver.get(https://tieba.baidu.com/f?kw%B6%B7%CD%BCfrala0tpl5)
# 执行js代码
driver.execute_script(window.scrollTo(0,document.body.scrollHeight))
time.sleep(5)
# 关闭
driver.close()
driver.quit() 结果演示 2.9 切换Frame
网页标签中有一个标签叫做frame标签相当于一个子网页而使用selenium打开网页默认在父级frame里面因此想要获取子frame中的内容需要切换frame方法如下
driver.switch_to.frame(frame_referenceid或者name)2.10 延时等待
selenium打开网页有时候需要注意网速是否良好因为有时候你没有获取想要获取的信息就是因为网速不好。
除去使用time模块中的等待外我们还可以使用selenium自带的延时等待。
隐式等待
当查找的节点没有第一时间出现时会等待指定时间后再来获取。
方法如下
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 浏览器声明
driver webdriver.Chrome()
# 延时等待
driver.implicitly_wait(10) # 如果没有找到元素等待10秒中
# 找元素
driver.find_element(byBy.TAG_NAME,valuediv) 显示等待
隐式等待效果并不好因为如果在等待过程中加载出来了我们需要的标签但是我们仍然得等待一定的时间。因此我们需要更好的等待方式----显示等待。
作用它指定最长等待时间如果在这个时间内加载出来了节点则直接获取节点或则抛出超时异常。
方法如下
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 浏览器声明
driver webdriver.Chrome()
# 显示等待
# 创建等待对象
wait WebDriverWait(driver,10) #第二个参数是最大等待时间
tag wait.until(EC.presence_of_element_located((By.ID,q))) # 这个作用直到获取到id为q的节点 EC除去presence_of_element_located外还有很多条件具体的可以见官方库但是使用方法都是这样。
2.11 切换窗口
有时候我们用selenium请求了第一个网页后又再次请求一个新的网页或者你在第一个网页点击了某个按钮跳转到新网页此时selenium权柄还停留在第一个网页而我们想要获取第二个网页的信息就需要切换权柄。
方法如下
driver.window_handles # 查看所有的窗口权柄返回一个列表按照先后顺序出值
driver.current_window_handle # 当前的窗口权柄和上面的可以对应看
driver.switch_to.window(xxx) # 切换窗口权柄里面的xxx可以这么写 driver.window_handles[x]其中x为索引具体的代码演示可以看下一篇的案例3. 总结
本篇讲解了selenium的基础操作由于selenium并不单单可以用于爬虫还可以用于测试这个工作因此其内容还有很多我们并没有涉及这一点就需要靠大家根据自己的实际需求进行学习了。
下一篇进行实战讲解。