饭饭的Selenium+xlwt笔记
饭饭的Selenium+xlwt笔记
欢迎来我的博客与我讨论饭饭的Selenium+xlwt笔记
这几天写了一个教务处成绩查询的爬虫,用到了Python的一个爬虫库Selenium和execl处理库xlwt,这里做一点记录
项目GITHUB仓库: https://github.com/chaoers/xjtu-grade
Selenium
简介
Selenium是一个模拟浏览器的爬虫库,和目前大部分爬虫不一样的是它是直接模拟浏览器行为。因此爬取网页中有较多异步处理请求和鉴权复杂的网站会很方便,但缺点是无法大规模爬取数据,爬取速度较慢,但同时基本不会触发网站的爬虫检测,因此对于个人爬取少量的用途是一个很好用的库
安装
Selenium本身安装很简单
pip install selenium
但我们需要配置Selenium能够调用我们的浏览器进行自动操作
所以我们需要下载对应的WebDriver
例如笔主使用的是Chrome,就下载ChromeDriver
然后我们需要将下载的配置文件放入环境变量中
例如笔主使用的macOS,就直接放入/usr/bin
中
然后我们尝试爬取一下百度的数据
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print driver.page_source
如果没有报错Selenium就配置正常了
教程
Selenium实际上就是模拟浏览器的行为,因此我们只要用平时浏览网页的逻辑去操作Selenium就可以了
网页操作
常用的网页操作有
# 打开网页
driver.navigate().to("http://www.example.com");# 刷新网页
driver.refresh()# 退出网页
driver.quit()# 前进
driver.navigate().forward();# 后退
driver.navigate().back();# 切换帧(frames中使用)
driver.switchTo().window("windowName");
查找元素
查找元素是爬虫中最重要的一个操作,Selenium提供非常多的查找元素的方式
# 通过元素id查找
driver.find_element_by_id(":id")# 通过元素class查找
driver.find_elements_by_class_name(":class_name")# 通过元素标签名查找(div span等)
driver.find_elements_by_tag_name(":tag_name")# 通过元素name查找
driver.find_elements_by_name(":name")# 通过元素链接文字查找
driver.find_elements_by_link_text(":link_text")# 通过元素链接文字部分匹配
driver.find_elements_by_partial_link_text(":partial_link_text")
Xpath
如果上述查找方式无法满足你的需求(大概率是不够用的),那么与其花费时间写一些复杂的查找方式,强烈建议你学习一下Xpath的查找方式。
Xpath教程
Xpath开始学起来可能有一些摸不着头脑,但我们可以把它类比为命令行中的位置表达式理解起来就很容易了
对于Selenium来说,我们只需要学会Xpath的使用方式就行了,所以下面会重点讲解Xpath使用部分,而其他部分略过不讲
- 选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
… | 选取当前节点的父节点。 |
实际上选取节点方式和路径表达式十分相似,只是可以选择任意子代节点(//
)
- 谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()❤️] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]//title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
通过谓语,我们可以只通过Xpath完成直接介绍过的所有功能,因此Xpath是十分强大的
- 选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
- 选取若干路径
通过在路径表达式中使用"|"运算符,您可以选取若干个路径。
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
接下来我们就可以快乐的使用Xpath查找几乎任何我们想查找的元素
driver.find_element_by_xpath(":Xpath")
注意事项
在查找元素中有一些需要注意的事情
find_element
只会返回查找到的第一个元素,而find_elements
默认会返回一个Lis(即使只有一个元素)- 元素查找可以进行叠加,即以下操作是可行的
cell = driver.find_elements_by_xpath("//div[@class='cjcx-tab-content-1 bh-mt-8 jqx-tabs-content-element jqx-rc-b']//tr")[i].find_elements_by_xpath("./td/span")
操作元素
对于一个元素进行操作也是一件很常见的事,下面介绍一些常用操作
# 点击操作
element.click()# 输入文字
element.send_keys(":keys")
附加教程
有了上述介绍,我们已经能基本能实现浏览器中的大多数常用操作,下面是一些能优化的附加教程
动态等待
由于网络原因,元素不能立即加载出来,这时如果我们不加上一个等待可能会使得程序找不到接下来额元素而停止,
我们一般直接加上一个等待时间,例如
time.sleep(1)
但是这样做会明显增加我们的运行时间,如何当元素加载出来时就进行下一步呢,这时我们可以运用动态等待来执行
# 注意要引入WebDriverWait和EC才可以使用
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素出现执行操作
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='成绩查询']"))).click()
xlwt
Xlwt是一个很简单的python库,但是由于搜索引擎上搜到的教程都被一些垃圾行业的教程污染了这里大致写一下基本操作
import xlwt#设置编码
workbook = xlwt.Workbook(encoding='utf-8')
#表名
worksheet = workbook.add_sheet('Grade') #写入
worksheet.write(:row, :col, label=":label") #保存文件
workbook.save('Grade.xls')
饭饭的Selenium+xlwt笔记相关推荐
- 码蹄集 - MT2013 · 饿饿︕饭饭︕ - 解题思路版本
传送门 饿饿!饭饭! 题目描述 输入描述 输出描述 样例一 输入 输出 题目分析 AC代码 拓展: 饿饿!饭饭! 饿饿!饭饭! 时间限制:1秒 空间限制:64M 题目描述 嗯哼,小码哥在新的一年里不会 ...
- 饿饿,饭饭「每日一题」
饿饿 饭饭 - 题目 - Daimayuan Online Judgerre 题解:经典二分「calc函数好好写就好」 AC代码: #include <iostream> #define ...
- selenium学习笔记之元素定位
selenium学习笔记之元素定位 Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 首先需要创建浏览器驱动: from sele ...
- 程序员是青春饭吗 - CSDN分享会笔记
摘自<人月神话> - P6职业的乐趣:编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐? 一.程序员是青春饭吗? 程序员在工作过程中要保持什么能力?随时可以跳槽的能力. 个人能力( ...
- 【selenium学习笔记】selenium自动化测试环境安装
工作中需要用到selenium,因此将学习和工作过程中的笔记整理 下. [Install selenium] 联网情况下,直接利用pip安装按照如下命令安装selenium.[如何安装pip?]--- ...
- selenium自学笔记---ecshop购买脚本 xpath定位元素(下拉框,单选框)
本机环境:xamppv3.2.1+ecshop3.0 1.元素定位写对,却一直报错,发现是页面元素加载的太慢,所以加上延时 from selenium import webdriverimport t ...
- selenium学习笔记(一)
备注:摘自<selenium2 python 自动化测试实战>- 虫师 (一)什么样的项目适合自动化测试 1.软件需求变动不频繁 测试脚本的稳定性决定了自动化测试的维护成本.如果软件需求 ...
- Python+Selenium学习笔记8 - 多表单多窗口切换
1.多表单切换 下图为待测页面:内嵌百度首页 切换到百度首页进行操作 1 #coding = utf-8 2 3 from selenium importwebdriver4 importos5 im ...
- 基于Java的Selenium学习笔记——Assert
用assert来判断一个表达式,返回true或者false,若表达式返回false,则会导致AssertionError. 注意Eclipse中assert默认是关闭的,需手动开启,如下图: 第一个简 ...
- selenium+python笔记3
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @desc:学习unittest的用法 注意setUp/setUpCl ...
最新文章
- 他们让云撸猫变成现实,台湾大学开发手持VR设备解救吸猫人
- [Bash] Search for Text with `grep`
- Linux 配置多个Tomcat
- ajax callback 在什么时候运行
- 蓝桥杯 试题 基础练习 字母图形——13行代码AC
- 六种常用的物联网通信协议
- python中int是什么的缩写_python中int是什么类型
- 【CodeForces - 245C 】Game with Coins (思维,贪心)
- Android官方开发文档Training系列课程中文版:调用相机之简单摄像
- Charles笔记-配置Charles代理抓取HTTP和HTTPS数据包,安卓模拟器连接Charles
- 新手机出现陌生女人照片,客服:大数据时代可能性有很多
- Maven安装配置操作方法
- (十二)GA-RPN----2019CVPR论文解读
- 计算机cpu架构是什么意思,「电脑小白必备」一分钟快速了解CPU
- qt学习之旅--MinGW编译FFmpeg(32bit)
- ubuntu18安装Domoticz(内网穿透)和home assistant(docker安装)
- 单例设计模式(饿汉式VS懒汉式)
- 十六进制转十进制-华为算法题
- Qt5.6.3交叉编译
- 如何快速入门Ctex
热门文章
- 独立董事、内部董事、执行董事、外部董事、非执行董事概念
- 《大秦赋》热血霸气台词场景记录
- 如何将瀚高数据库单机数据导入HGDW
- 【Python-Anaconda】jupyter notebook运行代码时出现异常——代码前面的[ ]中为空,跳转下一行,显示自动保存失败。面对这种情况该如何解决?
- 关于修复弹窗被360弹窗拦截器拦截的问题的解决案例的分享
- nsis升级包_NSIS office补丁
- qq空间进入游戏显示服务器拒绝,显示ptlogin2.qq.com,QQ空间打不开的快速解决办法...
- uniapp 图片浏览及保存图片到手机
- Day2-Python基础2---列表、元组操作
- 18位身份证号码含义及验证算法代码