当前位置: 首页 > article >正文

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


http://www.kler.cn/a/392008.html

相关文章:

  • 一文简单了解Android中的input流程
  • INQUIRE:一个包含五百万张自然世界图像,涵盖10,000个不同物种的专为专家级文本到图像检索任务设计的新型基准数据集。
  • 若依笔记(八):芋道的Docker容器化部署
  • Appium配置2024.11.12
  • 界面控件Kendo UI for Angular中文教程:如何构建带图表的仪表板?(一)
  • 更改Ubuntu22.04锁屏壁纸
  • 【启程Golang之旅】从零开始构建可扩展的微服务架构
  • 算法魅力-二分查找实战
  • 服务号消息折叠折射出的腾讯傲慢:上云会不会也一样?
  • 红日靶机(七)笔记
  • Ue5 umg学习(二)图像控件,锚点
  • 在PHP8内,用Jenssegers MongoDB扩展来实现Laravel与MongoDB的集成
  • 2024年第四届数字化社会与智能系统国际学术会议(DSInS 2024)
  • 百度世界2024:AI应用的浪潮时刻
  • 机器情绪及抑郁症算法
  • 【零基础学习CAPL】——XML工程创建与使用详解
  • springboot 之 整合springdoc2.6 (swagger 3)
  • 企望制造ERP系统 drawGrid.action SQL注入致RCE漏洞复现
  • 魅力标签云,奇幻词云图 —— 数据可视化新境界
  • css基础:底部固定,导航栏浮动在顶部
  • UI自动化测试|CSS元素定位实践
  • 前端web
  • 【学习】【HTML】localStorage、sessionStorage、cookie
  • javaCV流媒体处理demo
  • 电子版产品册代替纸质版产品册,节能环保!
  • 2.初始sui move