Python之selenium爬虫实战爬取表情包

本文介绍如何使用selenium自动化技术从一个表情包网站抓取热门表情包,包括图片、标题和详情页,通过模拟用户操作实现翻页并保存数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述
提示:以下是本篇文章正文内容,下面案例可供参考

前言

大家点进来看selenium操作,那么你应该知道 selenium 是什么了这里不再过多的介绍,selenium它能做到自动操作,下面演示selenium自动化实现对网页的内容爬取进行保存和下载。

寻找目标

我先找到了一个专门发布表情包的网站,就叫做发表情网,可以通过搜索关键词得到大量相关的表情包,下面对这个网站的爬取进行介绍。这里我是进行热门表情包的抓取
在这里插入图片描述

这个网站是属于静态加载的网站。我们不需要通过寻找数据接口去爬取,直接使用普通的爬虫代码进行爬取就可以了,或者使用selenium进行操作都可以。我们的操作对象找到了接下来就是开始干活。
在这里插入图片描述

思路分析

selenium创建浏览器对象,总之爬取的第一步都是先对网页发起请求,请求成功后在网页里确定我们的操作步骤要干嘛(点击哪里或者要输查找什么东西等。。。)通过selenium提供的找元素的方法进行合适自己的使用,然后提取自己所需要的信息,我这里仅进行(图片,标题,详情页)的提取,如需要其他可自行添加,最后就是保存至Excel和下载图片。

步骤实现

首先我们要拿到浏览器的对象,接着开始访问网页找到热门表情包,并点击进入,在网页上通过xpath找到标签位置。
在这里插入图片描述
进到所需的热门表情包之后我们右键检查看看这些一个个表情包都储存在哪里,检查发现我们要的东西都在属性class="ui segment imghover"里面。
在这里插入图片描述

接下来我们用selenium提供的xpath方法找到所有的div,再进行循环所有的div就可以获取我们所需的数据。title那里进行了一下处理,防止有些表情包名字过长导致后面下载图片的时候报错。
在这里插入图片描述
这样子我们所需的数据就爬取下来了,但只是得到第一页的内容,我们想要更多的表情包就得设置个翻页。那么我们怎么操作selenium帮我们进行自动翻页呢?
在这里插入图片描述
我在网页滑下来看了一下,右键检查了下一页,发现第二页表情包的链接href储存在a标签中,那么我们就可以通过selenium定位到下一页的标签,找到标签后我们就进行一个判断,如果我们的这个下一页的标签能获取到href的这个属性那就点击进行翻页。
在这里插入图片描述
这里还要解决一下爬完表情包之后,防止翻页这里获得href后一直点击后面的下一页链接,要加个while给个判断条件,设置想要点击多少次下一页进行爬取,接下来我们就可以构造字典和列表进行数据的存储,调用其他函数进行相关的操作。
在这里插入图片描述
对数据进行保存至Excel的操作
在这里插入图片描述
对数据图片进行下载保存操作
在这里插入图片描述

爬取过程

在这里插入图片描述

到这我们的热门表情包就爬取下来,拥有这么多表情包是不是很爽,以后再也不怕不够别人斗图了。
在这里插入图片描述

实现效果

在这里插入图片描述

在这里插入图片描述

以下是全部代码

# @Author : 王同学
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait   # 显示等待
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains     # 动作链
import time
import re
import requests
import os.path
import csv



driver = webdriver.Chrome() # 创建浏览器对象

wait = WebDriverWait(driver,10)

def get_conten(url):
    driver.get(url) # 对网页发送请求
    time.sleep(1)
    mood = wait.until(EC.presence_of_element_located((By.ID,'pcheaderbq'))) # 找到热门表情包点击
    mood.click()    # 找到热门表情包点击
    time.sleep(1)
    chains = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="bqb"]/div[3]/a[8]')))    # 移动到页面末尾,加载元素
    ActionChains(driver).move_to_element(chains).perform()  # 开始移动
    time.sleep(3)


def get_data():
    all_data = []   # 定义列表 储存数据
    n = 1
    while n < 6:    # 设置循环,翻页次数
        print(f'================================================正在爬取第{n}页的数据===========================================')
        time.sleep(2)
        all = wait.until(EC.presence_of_all_elements_located((By.XPATH,'//*[@id="bqb"]/div[1]/div')))   # 直到元素出现,继续往下执行
        for i in all:
            title = i.find_element(By.XPATH,'./a').get_attribute('title')
            if len(title) >= 295:   # 判断 处理因标题过长而保存不了图片
                title = 'not'
            ditail = i.find_element(By.XPATH,'./a').get_attribute('href')   # 获取详细页
            images = i.find_element(By.XPATH,'./a/img').get_attribute('src')    # 获取图片链接
            item = {
                '标题': title,
                '详情页': ditail,
                '图片': images
            }
            print(item)
            all_data.append(item)
            save_Images(images,title)
            save_csv(all_data)
        # 翻页
        time.sleep(2)
        page = wait.until(EC.presence_of_element_located((By.LINK_TEXT,'下一页')))
        if page.get_attribute('href'):
            page.click()
            n += 1
    print('======================爬取结束==================================')



def save_csv(all_data):
    # 表头
    headers = ['标题','详情页','图片']
    with open('表情包.csv',mode='w',encoding='utf-8',newline='')as f:
        filt = csv.DictWriter(f,headers)
        filt.writeheader()
        filt.writerows(all_data)



def save_Images(images,title):
    if not os.path.exists('./表情包/'):
        os.mkdir('./表情包/')
    image_data = requests.get(url=images).content
    big = '[?<>/\|():!"*]'
    new_title = re.sub(big,"",title)
    with open('./表情包/' + new_title + '.jpg',mode='wb')as f:
        f.write(image_data)
        print('正在保存图片===>:',title)



def main():
    url = '这里加上链接'
    get_conten(url)
    get_data()


if __name__ == '__main__':
    main()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王同学在这

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值