自动化爬虫Selenium

news/2024/11/16 8:50:47/

自动化爬虫Selenium

这篇文章, 我们将要学习自动化爬虫的知识啦。

目录

1.Selenium的基本操作

2.用Selenuim获取数据

3.当当网数据获取

4.实战

一、Selenium的基本操作

首先, 我们在使用Selenium之前, 需要做两件事情。第一件事情, 就是安装第三方库, 第二件事情, 就是下载对应的驱动。

1.安装第三方库:

pip install selenium==4.0.0

2.下载对应驱动

每个浏览器的驱动, 都不一样, 要看自己一会儿用的是什么浏览器进行自动化爬虫

edge:

https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver?form=MA13LH

谷歌:

https://registry.npmmirror.com/binary.html?path=chrome-for-testing/

火狐:

https://github.com/mozilla/geckodriver/releases

那我们这边, 就以谷歌浏览器为例。

我们需要先知道我们谷歌浏览器的版本, 点击右上角三个点的地方。

在这里插入图片描述

在这里插入图片描述

再找到帮助, 再点开关于Google Chrome。

然后再找到关于里面的信息, 里面就有写着版本号。

在这里插入图片描述

我的浏览器的版本号是130.0.6723.59。

那我们打开谷歌浏览器需要的自动化爬虫的驱动。

url是https://registry.npmmirror.com/binary.html?path=chrome-for-testing/

在这里插入图片描述

然后我们快捷键Ctrl+F, 快速搜索, 然后输入130.0.6723

在这里插入图片描述

找到和我们浏览器版本号最靠近的。那我这里选择130.0.6723.58这个版本号。

我们点进去:

在这里插入图片描述

然后这里, 就按照自己电脑的操作系统来决定到底选择哪个驱动。

我是windows11电脑, 64位, 所以这里我们点击最下面的win64。

在这里插入图片描述

最后, 我们找到最下面的chromedriver-win64.zip这个压缩包, 点击它等它下载完。

在这里插入图片描述

下载完之后, 可以给它放到别的磁盘中, 再解压。

解压缩之后, 文件夹点进去, 有个exe文件, 将这个exe文件, 放到我们的pycharm里面去。

在这里插入图片描述

在这里插入图片描述

接下来, 我们就要开始写代码了。

我们首先, 要导入第三方模块:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e8e93b11860042bc876f57738e882727.png)然后我们需要创建服务对象, 指定驱动的路径:```python
service = Service(r'chromedriver.exe')  # 相对路径

这个chromedriver.exe就是我们刚才放到pycharm项目的文件夹下面的exe文件。除了写相对路径, 也可以写绝对路径。

创建浏览器对象:

web = webdriver.Chrome(service=service)

打开页面 不需要区分get和post 放入目标页面的url(浏览器地址栏的url):

web.get('https://registry.npmmirror.com/binary.html?path=chromedriver/106.0.5249.21/')

设置窗口最大化:

web.maximize_window()

同时也有设置窗口最小化的写法: web.minimize_window()。

完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service# 创建服务对象 指定驱动的路径
# Service(r'D:\爬虫_38\chromedriver.exe') 绝对路径
service = Service(r'chromedriver.exe')  # 相对路径
# 创建浏览器对象
web = webdriver.Chrome(service=service)
# 打开页面  不需要区分get和post 放入目标页面的url(浏览器地址栏的url)
web.get('https://registry.npmmirror.com/binary.html?path=chromedriver/106.0.5249.21/')# 设置窗口最大化
web.maximize_window()
# 设置窗口最小化
# web.minimize_window()

结果:

在这里插入图片描述

运行结果就是, 自动打开了对应的url网页。

二、用Selenuim获取数据

我们先用Selenuim打开百度

from selenium import webdriver
from selenium.webdriver.chrome.service import Serviceservice = Service(r'chromedriver.exe') # 相对路径
# 创建浏览器对象
web = webdriver.Chrome(service=service)
# 设置窗口最大化
web.maximize_window()
web.get('https://www.baidu.com/')

结果:

在这里插入图片描述

获取网页源代码(看到的是什么拿到的就是什么 所见即所得):

print(web.page_source)

解析数据:

'''
1- 基于html源码 可以利用xpath bs4
2- Selenium提供了自带的解析数据的方式
'''

通过标签的id属性获取到标签对象:

# 比如:<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">这样的标签
# 浏览器对象.find_element(By.ID,'id的值') 根据id=值 从页面中获取到标签对象
print(web.find_element(By.ID,'kw'))
print(web.find_elements(By.ID,'kw')) # 返回值为列表,列表中保存的是根据规则获取到的标签对象

获取标签, 往文本标签内输入文字(标签对象.send_keys(内容)):

input_tag = web.find_element(By.ID,'kw')
input_tag.send_keys('python')

通过标签的class属性值获取标签对象:

tag = web.find_element(By.CLASS_NAME,'s_ipt')
tag.send_keys('python')

通过标签的name属性值获取标签对象:

tag = web.find_element(By.NAME,'wd')
tag.send_keys('python')

通过标签名获取标签对象 如果通过标签名获取标签对象,最好是用find_elements 拿所有:

tag = web.find_element(By.TAG_NAME,'input')  # 只会获取当前页面第一个input标签
tag.send_keys('python')

通过xpath语法获取标签对象:

tag = web.find_element(By.XPATH,'//input[@id="kw"]')
tag.send_keys('python')

通过css选择器获取标签对象:

# 比如id=kw, 那我们再find_element的第二个参数那里要写#kw
tag = web.find_element(By.CSS_SELECTOR,'#kw')
tag.send_keys('python')

三、当当网数据获取

我们这个案例, 分为4部分操作:

"""
1- 打开当当网
2- 在搜索框内输入要搜索的内容
3- 点击放大镜
4- 解析 (先要拿到标签对象,才可以获取文本,获取属性,实现点击,实现输入...)
"""

第一、打开当当网。

代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Byservice = Service(r'chromedriver.exe')  # 相对路径
# 创建浏览器对象
web = webdriver.Chrome(service=service)
# 设置窗口最大化
web.maximize_window()
web.get('https://www.dangdang.com/')

第二、在搜索框内输入要搜索的内容。

第三、点击放大镜。

我将这两个内容放在一起去讲解。

代码:

# name = input('请输入你想要查询的商品')
name = 'python'
# 获取搜索框的标签
input_tag = web.find_element(By.ID, 'key_S')
input_tag.send_keys(name)
# 获取放大镜标签
but_tag = web.find_element(By.CLASS_NAME, 'button')
# 实现点击的操作  标签对象.click()
but_tag.click()

在这里插入图片描述

input_tag = web.find_element(By.ID, ‘key_S’)这行代码相当于找到了当当网的input的输入框。而input_tag.send_keys(name)这行代码, 就是在输入框要输入的内容, 也就是我们想要查询的内容。

在这里插入图片描述

同理, but_tag = web.find_element(By.CLASS_NAME, ‘button’)这行代码就是获取放大镜那个搜索按钮。通过but_tag.click()这行代码来实现点击搜索按钮去搜索内容。

这一步操作, 相当于我们人为在输入框里面输入我们想要查询的内容, 然后再点击搜索按钮进行查询, 从而查到我们想要查到的内容。

四、解析 (先要拿到标签对象,才可以获取文本,获取属性,实现点击,实现输入…)。

我们需要获取列表中的书名、价格、作者、出版日期、出版社、评论数。

在这里插入图片描述

代码:

lis = web.find_elements(By.XPATH, '//ul[@class="bigimg"]/li')# 基于每一个li标签获取需要的信息
count = 1for li in lis:# li = 第一个li标签对象# 书名# 获取标签的文本内容:通过标签对象.text# book_name = li.find_element(By.NAME,'itemlist-title').text# 获取标签的属性值:标签对象.get_attribute(标签名)book_name = li.find_element(By.NAME, 'itemlist-title').get_attribute('title')# 价格price = li.find_element(By.CLASS_NAME, 'search_now_price').text# 有些书籍没有作者,没有出版日期,没有出版社# 作者try:author = li.find_element(By.NAME, 'itemlist-author').get_attribute('title')except:author = '无'# 出版日期  [2]代表获取第二个标签try:date = li.find_element(By.XPATH, '//p[@class="search_book_author"]/span[2]').textexcept:date = '无'# 出版社try:cbs = li.find_element(By.XPATH, '//p[@class="search_book_author"]/span[3]/a').textexcept:cbs = '无'# 评论数try:comment_num = li.find_element(By.CLASS_NAME, 'search_comment_num').textexcept:comment_num = 0print(count, book_name, price, author, date, cbs, comment_num)count += 1

这里的代码, 就是获取我们想要的数据, 写法其实和之前学习的html解析中的xpath内容有关联, 可以回头翻一翻我以前写过的数据解析的那几篇博客。在Selenuim操作中, 多了些操作, 比如通过name, class name等方法, 来获取我们想要的数据。

完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Byservice = Service(r'chromedriver.exe')  # 相对路径
# 创建浏览器对象
web = webdriver.Chrome(service=service)
# 设置窗口最大化
web.maximize_window()
web.get('https://www.dangdang.com/')# name = input('请输入你想要查询的商品')
name = 'python'
# 获取搜索框的标签
input_tag = web.find_element(By.ID, 'key_S')
input_tag.send_keys(name)
# 获取放大镜标签
but_tag = web.find_element(By.CLASS_NAME, 'button')
# 实现点击的操作  标签对象.click()
but_tag.click()# 获取数据
# 获取每本书的整体标签 因为每个li标签身上都有不同的属性值
# 所以基于父级ul标签拿所有的子标签li
lis = web.find_elements(By.XPATH, '//ul[@class="bigimg"]/li')  # 拿多个
# web.find_element() # 拿一个
# print(len(lis))# 基于每一个li标签获取需要的信息
count = 1for li in lis:# li = 第一个li标签对象# 书名# 获取标签的文本内容:通过标签对象.text# book_name = li.find_element(By.NAME,'itemlist-title').text# 获取标签的属性值:标签对象.get_attribute(标签名)book_name = li.find_element(By.NAME, 'itemlist-title').get_attribute('title')# 价格price = li.find_element(By.CLASS_NAME, 'search_now_price').text# 有些书籍没有作者,没有出版日期,没有出版社# 作者try:author = li.find_element(By.NAME, 'itemlist-author').get_attribute('title')except:author = '无'# 出版日期  [2]代表获取第二个标签try:date = li.find_element(By.XPATH, '//p[@class="search_book_author"]/span[2]').textexcept:date = '无'# 出版社try:cbs = li.find_element(By.XPATH, '//p[@class="search_book_author"]/span[3]/a').textexcept:cbs = '无'# 评论数try:comment_num = li.find_element(By.CLASS_NAME, 'search_comment_num').textexcept:comment_num = 0print(count, book_name, price, author, date, cbs, comment_num)count += 1

结果:

过一会儿, 就会从当当网里面的输入框里面自动输入python并搜索查询内容。

在这里插入图片描述
在这里插入图片描述

我们在返回pycharm里面, 看看控制台输出的结果:

在这里插入图片描述

在这里插入图片描述

我们发现, 在控制台里面输出了我们想要获取的数据(书名、价格、作者、出版日期、出版社、评论数)。也就是我们所爬取到的内容。

四、实战

url是https://www.mi.com/shop/category/list

要求: 爬取所有分类名。

需要爬取左边圈出来的那些文字(也就是所有的分类名)。

在这里插入图片描述

这些分类名, 在ul>li>span里面。

先自己尝试的用selenuim做一做, 作完后再对答案。






参考答案:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Byservice = Service(r'chromedriver.exe')  # 相对路径
# 创建浏览器对象
web = webdriver.Chrome(service=service)
# 设置窗口最大化
web.maximize_window()
web.get('https://www.mi.com/shop/category/list')categories = web.find_elements(By.XPATH, '//ul[@class="category-list"]//li')
for item in categories:# img = item.find_element(By.XPATH, './/img').get_attribute("alt")category = item.find_element(By.XPATH, './/a//span').text# print(img)print(category)

结果:

打开了小米网站:

在这里插入图片描述

然后这是在控制台输出的内容:

在这里插入图片描述

在这里插入图片描述

这道实战题, 你写出来了吗? 如果写出来的话, 给自己鼓掌哦👏

以上就是自动化爬虫Selenium的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!


http://www.ppmy.cn/news/1547412.html

相关文章

blockchain实现遇到的问题

区块链分叉 v1114 : 基于python socket 创建TCP server&#xff0c;以中心化的形式暂时实现区块链的状态同步 C:\Users\vin0sen>nc 192.168.137.1 9000 Enter a new data: 111 {"index": 1, "timestamp": "2024-11-14 15:28:53.173112", &quo…

「AI Infra 软件开源不是一个选项,而是必然」丨云边端架构和 AI Infra专场回顾@RTE2024

在人工智能和开源技术蓬勃发展的当下&#xff0c;AI Infra 项目正经历着日新月异的变革。从跨平台运行时到云边端 AI 基础设施&#xff0c;再到多模态知识助手&#xff0c;创新浪潮席卷而来。这些进步不仅显著提升了技术指标&#xff0c;也为实时音视频处理、边缘计算、大模型应…

Rust,删除cargo安装的可执行文件

列出安装的文件列表 cargo install --list 删除 rm /Users/ry/.cargo/bin/fancy

Java EE 技术基础知识体系梳理

1. Java EE 平台概述 1.1 发展历程 Java EE 从 J2EE 发展而来&#xff0c;经历了多个版本的演进&#xff0c;从早期的 J2EE 1.2 到最新的 Jakarta EE。 1.2 架构特点 多层架构&#xff1a; 客户端层&#xff1a;用户界面&#xff0c;如 Web 浏览器、移动应用等。Web 层&…

ssm092基于Tomcat技术的车库智能管理平台+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;车库智能管理平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本车库智能管理平台…

Kafka常见问题及处理

Apache Kafka是一个分布式流处理平台&#xff0c;以其高吞吐量和可扩展性而广受欢迎。然而&#xff0c;在实际应用中&#xff0c;我们可能会遇到各种问题。本文将探讨一些Kafka的常见问题及其解决方案&#xff0c;帮助您更有效地管理和使用Kafka。 1. 高延迟问题 问题描述&am…

微搭低代码入门04数组

目录 1 数组的定义和赋值2 访问数组中的元素3 获取数组的长度4 给数组添加元素5 删除数组中的元素6 其他常见用法7 数组作为参数传递8 数组的嵌套9 不改变原数组的方法总结 我们日常经常说的编程&#xff0c;叫编写程序。那程序的核心组成是数据结构算法。我们在编程入门的时候…

maven的optional选项说明以及具体应用

写在前面 本文看下maven的optional选项的作用和用法。 1&#xff1a;什么作用 考虑这样的场景&#xff0c;A依赖B&#xff0c;B依赖C&#xff0c;正常的按照依赖的传递性&#xff0c;A也会间接的依赖C&#xff0c;但是在一些特定的场景中项目A只希望依赖B&#xff0c;而不依…