自动化爬虫Selenium

自动化爬虫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 Service

service = 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 By

service = 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 = 1

for 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]').text
    except:
        date = '无'
    # 出版社
    try:
        cbs = li.find_element(By.XPATH, '//p[@class="search_book_author"]/span[3]/a').text
    except:
        cbs = '无'
    # 评论数
    try:
        comment_num = li.find_element(By.CLASS_NAME, 'search_comment_num').text
    except:
        comment_num = 0
    print(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 By

service = 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 = 1

for 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]').text
    except:
        date = '无'
    # 出版社
    try:
        cbs = li.find_element(By.XPATH, '//p[@class="search_book_author"]/span[3]/a').text
    except:
        cbs = '无'
    # 评论数
    try:
        comment_num = li.find_element(By.CLASS_NAME, 'search_comment_num').text
    except:
        comment_num = 0
    print(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 By

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920266.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源可视化工具对比:JimuReport VS DataEase

在当今数据驱动的时代&#xff0c;高效的数据可视化工具成为企业洞察业务、做出决策的关键利器。那对于企业来讲如何选择BI产品呢&#xff1f; 在开源可视化工具的领域中&#xff0c;JimuReport和DataEase 以其独特的优势脱颖而出&#xff0c;究竟谁更胜一筹呢&#xff1f;让我…

Jenkins的环境部署

day22 回顾 Jenkins 简介 官网Jenkins Jenkins Build great things at any scale The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project. 用来构建一切 其实就是用Java写的一个项目…

Ubuntu22.04配置强化学习环境及运行相关Demo

什么是强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;简称 RL&#xff09;是机器学习中的一个重要分支&#xff0c;属于一种基于试错机制的学习方法。它通过让智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;进行交互&…

AI 写作(一):开启创作新纪元(1/10)

一、AI 写作&#xff1a;重塑创作格局 在当今数字化高速发展的时代&#xff0c;AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位&#xff0c;发挥着不可替代的作用。 随着信息的爆炸式增长&#xff0c;人们对于内容的需求日益旺盛。AI 写作能够…

丹摩征文活动 | AI创新之路,DAMODEL助你一臂之力GPU

目录 前言—— DAMODEL&#xff08;丹摩智算&#xff09; 算力服务 直观的感受算力提供商的强大​ 平台功能介绍​ 镜像选择 云磁盘创建 总结 前言—— 只需轻点鼠标,开发者便可拥有属于自己的AI计算王国 - 从丰富的GPU实例选择,到高性能的云磁盘,再到预配置的深度学习…

echarts的图例换行并对齐

现状&#xff1a; 期望&#xff1a; 实现方式&#xff1a; 通过对legend的formatter和textStyle组合设置宽度来实现&#xff0c;代码如下 这里会出现一个问题&#xff0c;发现设置了width没有效果&#xff0c;刚开始以为是宽度给的不够&#xff0c;然后发现并不是&#xff0c…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中&#xff0c;我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板&#xff0c;包括模型、逻辑、处理器、路由等&#xff0c;大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

Windows Server 2022 Web1

载入靶机&#xff0c;看到相关描述&#xff1a; 进入虚拟机发现桌面有phpstudy和解题两个软件&#xff1a; 打开解题.exe&#xff0c;发现里面是一些问题&#xff0c;接下来就需要获取相关信息&#xff1a; 1、shell密码 2、IP地址 3、隐藏账户名称 4、挖矿程序的矿池域名 打…

经典的网络安全技术

以我的理解&#xff0c;“黑客”大体上应该分为“正”、“邪”两类&#xff0c;正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善&#xff0c;而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情&#xff0c;因为邪派黑客…

【TDOA最小二乘解算】两步最小二乘迭代的TDOA解算方法,适用于二维平面、自适应锚点(附MATLAB代码)

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法&#xff0c;利用多个锚点&#xff08;基站&#xff09;和时间差到达&#xff08;TDOA&#xff09;数据来估计未知目标的位置。 文章目录 运行结果代码代码功能概述代码结构和详细说明初始化部分参数和…

VideoCrafter模型部署教程

一、介绍 VideoCrafter是一个功能强大的AI视频编辑和生成工具&#xff0c;它结合了深度学习和机器学习技术&#xff0c;为用户提供了便捷的视频制作和编辑体验。 系统&#xff1a;Ubuntu22.04系统&#xff0c;显卡&#xff1a;4090&#xff0c;显存&#xff1a;24G 二、基础…

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回&#xff1f; 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维。 优点&#xff1a; 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本&#xff0c;因为所有接⼝都…

window 中安装 php 环境

window 中安装 php 环境 一、准备二、下载三、安装四、测试 一、准备 安装前需要安装 Apache &#xff0c;可以查看这篇博客。 二、下载 先到这里下载 这里选择版本为“VS16 x64 Thread Safe”&#xff0c;这个版本不要选择线程安全的&#xff0c;我试过&#xff0c;会缺少文…

HarmonyOS Next 关于页面渲染的性能优化方案

HarmonyOS Next 关于页面渲染的性能优化方案 HarmonyOS Next 应用开发中&#xff0c;用户的使用体验至关重要。其中用户启动APP到呈现页面主要包含三个步骤&#xff1a; 框架初始化页面加载布局渲染 从页面加载到布局渲染中&#xff0c;主要包含了6个环节&#xff1a; 执行页…

【Linux网络编程】简单的UDP套接字

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 三&#xff0c;UDP套接字的应用 3-1&#xff0c;实现英译汉字典 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信…

【WPF】Prism学习(十)

Prism MVVM 1.BindableBase 1.1. BindableBase的作用&#xff1a; Prism库提供了一个基础类BindableBase&#xff0c;这个类实现了INotifyPropertyChanged接口。这个接口允许ViewModel&#xff08;视图模型&#xff09;通知视图&#xff08;View&#xff09;当属性&#xff0…

计算机网络学习笔记-3.3以太网和局域网

以太网 以太网&#xff08;Ethernet&#xff09;是一种用于计算机网络的技术规范&#xff0c;广泛应用于局域网&#xff08;LAN&#xff09;的构建。它定义了如何在网络设备之间传输数据&#xff0c;并确保这些数据能够被可靠传送。以太网是目前最常见和最广泛使用的局域网技术…

聊一聊Elasticsearch的索引分片的恢复机制

1、什么是索引分片的恢复&#xff1f; 所谓索引分片的恢复指的是在某些条件下&#xff0c;索引分片丢失&#xff0c;ES会把某索引的分片复制一份来得到该分片副本的过程。 2、触发分片恢复的场景有哪些&#xff1f; 分片的分配 当集群中节点的数量发生变化&#xff0c;或者配…