selenium+chromedriver操作浏览器获取动态数据【python爬虫入门进阶】(13)

举报
码农飞哥 发表于 2021/12/14 18:49:02 2021/12/14
【摘要】 selenium+chromedriver操作浏览器获取动态数据

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
😁 1. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
💪🏻 2. Python基础专栏,基础知识一网打尽。 Python从入门到精通
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门

为啥写这篇文章?

上篇文章我们介绍了如何用多线程的方式来提高爬虫效率。还没看的小伙伴可以补看一波。
用生产者消费者模式爬取斗图吧,一次性收获超多表情包【python爬虫入门进阶】(11)

软件环境

软件 版本
电脑系统 mac
Chrome 96.0.4664.93
chromedriver 96.0.4664.18

selenium是什么

这篇文章我们将介绍Selenium这个技术,该技术可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等等。一句话总结Selenium相当于一个机器人。
当然,这个机器人必须要有驱动程序去驱动浏览器,不同浏览器上需要不同的驱动程序,在Chrome浏览器上的驱动程序是Chromedriver,只有使用它才能驱动浏览器。

不同浏览器上的driver下载地址

谷歌浏览器驱动下载地址:https://chromedriver.storage.googleapis.com/index.html
火狐浏览器驱动下载地址:https://github.com/mozilla/geckodriver/releases/
PhantomJS驱动下载地址:http://phantomjs.org/download.html
IE浏览器下载地址:http://selenium-release.storage.googleapis.com/index.html

以Chrome浏览器为例

这里需要特别注意的是:要根据当前你Chrome浏览器的版本下载对应版本的chromedriver
比如:我这里Chrome浏览器的版本是:96.0.4664.93,如下图1所示
图1
我就需要下载:96.0.4664.18 版本下的chromedriver驱动。如下图2所示:
图2
点进96.0.4664.18 目录里,以看到不同系统对应不同的安装包,这里我的电脑系统是mac系统,所有我选择了chromedriver_mac64.zip 压缩包。如下图3所示:
图3
如果你不按照版本来对应下载的话,就有可能会出现如下图4所示的错误:
图4

给chromedriver配置环境变量

解压之后可以得到chromedriver程序,将该程序放在/usr/local/bin/ 目录下。
这里以Mac系统为例进行说明:

  1. 打开终端输入:vim ~/.bash_profile 命令,向.bash_profile文件中写入如下配置。按i进入编辑状态,
alias chromedriver='/usr/local/bin/chromedriver'

在这里插入图片描述
编辑完成之后按esc 退出编辑。然后,输入:wq! 保存编辑结果。
3. 接着在终端输入 source ~/.bash_profile 使得环境变量生效。
在这里插入图片描述

使用selenium

安装selenium

在使用selenium之前还是需要通过pip安装一下selenium包。安装命令如下:

pip install selenium

安装好之后就是导入包进行使用了。

from selenium import webdriver

# 调用环境变量指定的
# driver = webdriver.Chrome()
# 如果没有在环境变量指定Chromedriver的位置
executable_path = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(executable_path=executable_path)
driver.get("http://www.baidu.com")
# 打印获取到页面源码
print(driver.page_source)

如果没有在环境变量中指定chromedriver的位置,那么在调用webdriver.Chrome 方法时就需要在executable_path参数中传入Chromedriver的位置。
如果在前面给chromedriver配置了环境变量,则直接调用driver = webdriver.Chrome() 方法即可。
这里通过selenium打卡Chrome浏览器,并访问百度首页。运行后的效果如下图5所示:通过selenium打卡的浏览器窗口会有Chrome 正收到自动测试软件的控制 的提示。
图5

selenium的常用操作

更多详细的操作可以看官方文档

关闭页面

#关闭当前页面
driver.close()
#退出整个浏览器
driver.quit()

定位页面元素

定位页面元素的方法统一调用driver.find_element 方法,其语法结构是:

find_element(self, by=By.ID, value=None)

默认是根据ID查找元素,value 指定的是查找的关键字。
如图6所示,点击查看By类的源代码可以看到
图6

1. 根据id来查找某个元素

根据id来查找某个元素只需要将by的值传入为By.ID。这里的id指的是标签的id属性。

from selenium.webdriver.common.by import By
# 根据ID查找某个元素
driver.get("https://so.csdn.net/so/search")
input_tag = driver.find_element(by=By.ID, value='keyword')
input_tag.send_keys('码农飞哥,爬虫')

这里以CSDN的搜索框为例,找到搜索框元素的id是keyword。send_keys 方法用于向匹配到的元素输入关键字。运行之后得到的效果如下图7
图7

2.根据类名查找元素

这里的类名指的是标签的class属性。如下图8所示现有标签元素<div class="profile-intro-name-boxTop"> ,我们就可以通过类名来找到这个标签元素。传入的by参数是By.CLASS_NAME。

driver.get("https://blog.csdn.net/u014534808")
tag = driver.find_element(by=By.CLASS_NAME, value='profile-intro-name-boxTop')
print(tag.text)

运行结果如下图8所示:
图8

3. 根据name属性的值来查找元素

driver.get("https://blog.csdn.net/u014534808")
tag = driver.find_element(by=By.NAME, value='report')
print(tag)

在这里插入图片描述

4. 根据标签名来查找元素

5. 根据xpath语法来获取元素

driver.get("https://blog.csdn.net/u014534808")
feige_tag = driver.find_element(by=By.XPATH,
                                value='//div[@class="profile-intro-name-boxFooter"]//a')
print(feige_tag.text)
driver.close()

运行结果是:
在这里插入图片描述
这里需要注意的是不能提取到标签的某个属性。比如://div[@class="profile-intro-name-boxFooter"]//a/@href 这样会报错的。因为这个方法选择的是元素。

6. 根据css选择器选择元素

需要注意的是,find_element 是获取第一个满足条件的元素,find_elements 是获取所有满足条件的元素。

driver.get("https://blog.csdn.net/u014534808")
class_tags = driver.find_element(by=By.CSS_SELECTOR, value='.article-list .article-item-box')
print(class_tags)

总结

本文简单介绍了selenium的使用

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。