selenium进行xhs图片爬虫:03获取一篇图文的图片

news2024/12/24 21:10:55

📚博客主页:knighthood2001
公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
🎃知识星球:【认知up吧|成长|副业】介绍
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!

获取一篇文章的图片

比如下面的的小红书链接
100篇阅读理解刷爆大纲5500词|2001年Text3 - 小红书

https://www.xiaohongshu.com/explore/66074a84000000001a01577

我需要将其中的图片下载下来,并且还是无水印的。

前言

右键检查,可以发现图片一般有专门的网址,并且点击进去后是无水印的。
在这里插入图片描述

你可以自己多研究一下

然后右键,查看网页源代码,可以发现图片链接都在这个地方出现。

在这里插入图片描述

因此你可以通过正则表达式进行图片链接的提取。

下面这张图片中的代码就是将图片链接保存为本地图片。这也是我之前讲过的内容,相对于这些都是可以即插即用的模板。

在这里插入图片描述

因此实现爬取小红书指定文章的图片的一般步骤就是:

获取网页源代码->使用正则表达式筛选出图片链接->将图片链接的内容保存为本地图片

编写代码

#TODO 该函数用于返回网页源代码,输入的是xhs链接
def get_html_code(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    content = response.content.decode()
    return content

这段代码获取网页源代码。有了这个后,才可以使用正则进行数据的筛选。


在讲解正则提取之前,我需要讲一下图片链接保存为本地图片,因为这与之前不太一样。

#TODO 实现从网页图片保存到本地,输入为图片网址和保存路径
def image_save(image_url, path):
    if not os.path.exists(path):         # 如果文件夹不存在,则创建
        os.makedirs(path)
    # 发送 GET 请求获取图片数据
    response = requests.get(image_url)
    # 确保请求成功
    if response.status_code == 200:
        image_name = get_time()
        image_name = "{}.png".format(image_name)
        # 指定图片保存路径
        save_path = os.path.join(path, image_name)  # 这里将图片保存在名为 images 的文件夹中
        # 将图片数据写入文件
        with open(save_path, 'wb') as f:
            f.write(response.content)
        print(f'图片已保存为: {save_path}')
        return save_path
    else:
        print(f'下载图片失败,状态码: {response.status_code}')

以上这段代码就是将图片链接的图片保存为本地图片。

但是这次代码,相对于我上面那个即插即用的模板来说,不太一样。因为我上面的那个模板,每次保存图片,由于时间戳一样,就会导致即使有多个图片链接,但是最后都是以一个时间戳命名,最后就保存为1张照片(被反复覆盖了)。

因此我需要进行代码的重构,我的想法是把for循环遍历放到保存图片中,原先保存图片是传入的一个链接,我这时候传入的是一个列表,然后通过for循环进行图片的保存。

并且图片的上一级目录还有一个时间戳,可以帮助你排序,分辨下载先后顺序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这一部分的代码,和之前版本来说,还是有较大区别的。

#TODO 实现输入一个图片url列表,将其中的图片保存到目录中,并按照1-nums排序,这样可以保证下载下来的图片顺序不乱。
#TODO 比如输入[图片链接1,图片链接2,图片链接3]和"image",最后就会生成image/时间戳的目录,然后在里面保存1.png,2.png,3.png
def image_save_batch(image_urls, save_dir):
    time_path = get_time()
    path = os.path.join(save_dir, str(time_path))
    if not os.path.exists(path):
        os.makedirs(path)

    for i, url in enumerate(image_urls):
        # 发送 GET 请求获取图片数据
        response = requests.get(url)
        # 确保请求成功
        if response.status_code == 200:
            # 生成图片文件名
            image_name = f"{time_path}/{i}.png"
            # 拼接图片保存路径
            save_path = os.path.join(save_dir, image_name)
            # 将图片数据写入文件
            with open(save_path, 'wb') as f:
                f.write(response.content)
            print(f'图片{i+1}已保存为: {save_path}')
        else:
            print(f'下载图片{i+1}失败,状态码: {response.status_code}')


def get_img_url_list(content, path="images"):
    # 使用正则表达式提取网址
    url_pattern = re.compile(r'<meta name="og:image" content="(.*?)">')
    matches = url_pattern.findall(content)
    if matches:
        # 去重+顺序
        # unique_matches = list(set(matches)) # 会乱序
        unique_matches = list(Counter(matches))
        nums = len(unique_matches)
        print(f"图片数量:{nums}, 图片去重数量:{len(matches)-nums}")
        print(unique_matches)
        # # 打印每个网址
        # for i in range(nums):
        #     print(unique_matches[i])
        #     image_save(unique_matches[i], "images")
        image_save_batch(unique_matches, path)
    else:
        print("No URL found.")

需要注意的一点是,matches中的图片链接有时候会有重复,因此需要去重操作,但是set函数的去重操作是无序的,会导致最终图片保存顺序为乱序。
因此我这里采用调用collections的Counter,解决去重+乱序的问题。

全部代码

import requests
import re
import os
from collections import Counter  # 解决去重+乱序问题

#TODO 该函数用于返回网页源代码,输入的是xhs链接
def get_html_code(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    content = response.content.decode()
    return content

# 获取当前时间戳
def get_time():
    import time
    timestamp = int(time.time())
    return timestamp

#TODO 实现输入一个图片url列表,将其中的图片保存到目录中,并按照1-nums排序,这样可以保证下载下来的图片顺序不乱。
#TODO 比如输入[图片链接1,图片链接2,图片链接3]和"image",最后就会生成image/时间戳的目录,然后在里面保存1.png,2.png,3.png
def image_save_batch(image_urls, save_dir):
    time_path = get_time()
    path = os.path.join(save_dir, str(time_path))
    if not os.path.exists(path):
        os.makedirs(path)

    for i, url in enumerate(image_urls):
        # 发送 GET 请求获取图片数据
        response = requests.get(url)
        # 确保请求成功
        if response.status_code == 200:
            # 生成图片文件名
            image_name = f"{time_path}/{i}.png"
            # 拼接图片保存路径
            save_path = os.path.join(save_dir, image_name)
            # 将图片数据写入文件
            with open(save_path, 'wb') as f:
                f.write(response.content)
            print(f'图片{i+1}已保存为: {save_path}')
        else:
            print(f'下载图片{i+1}失败,状态码: {response.status_code}')


def get_img_url_list(content, path="images"):
    # 使用正则表达式提取网址
    url_pattern = re.compile(r'<meta name="og:image" content="(.*?)">')
    matches = url_pattern.findall(content)
    if matches:
        # 去重+顺序
        # unique_matches = list(set(matches)) # 会乱序
        unique_matches = list(Counter(matches))
        nums = len(unique_matches)
        print(f"图片数量:{nums}, 图片去重数量:{len(matches)-nums}")
        print(unique_matches)
        # # 打印每个网址
        # for i in range(nums):
        #     print(unique_matches[i])
        #     image_save(unique_matches[i], "images")
        image_save_batch(unique_matches, path)
    else:
        print("No URL found.")

if __name__ == '__main__':
    url = "https://www.xiaohongshu.com/explore/661216c7000000000401818d"
    page_source = get_html_code(url)
    get_img_url_list(page_source)

最后

这个项目也算是搭积木吧,但是我觉得应该挺多人需要。因为有时候一张一张手动保存有水印的小红书图片,慢且有水印。

当然,代码中有一些细节,我并没有讲到,因为我发现,写文档真的太折磨人了。有问题的可以问我。

此外,我本来是使用的selenium免登录操作的,后来发现xhs在爬取图片这方面,反爬不是特别严重,因此可以用这个方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

出海企业哪种组网方案更省事?

对于出海企业而言&#xff0c;建立跨地区的数据传输和协同工作至关重要&#xff0c;以提升运营效率。因此&#xff0c;网络构建变得迫在眉睫。通过构建企业组网&#xff0c;企业能够加强与海外分支、客户和合作伙伴之间的联系&#xff0c;加速海外业务的发展。 然而&#xff0c…

深兰科技荣获中国机器人行业年度独角兽企业奖

近日&#xff0c;“维科杯OFweek 2023人工智能产业大会暨行业年度评选颁奖典礼“在深圳隆重举行。经OFweek网络投票、专家组评审及组委会综合评审三轮激烈紧张的评审筛选&#xff0c;通过对近300个参评项目的综合实力考量&#xff0c;最终深兰科技成功荣膺“维科杯OFweek2023中…

计算机视觉——OpenCV实现Lucas-Kanade 光流追踪

1.光流 光流法是计算机视觉中用于估计图像序列中物体运动的关键技术。它类似于观察夜空中的彗星&#xff0c;通过其在天空中的运动轨迹来追踪它的路径。在图像处理中&#xff0c;光流帮助我们理解像素点如何在连续的帧之间移动。 1.1 稀疏光流法 稀疏光流法关注于图像中的关…

js实现复制功能

/*** 复制* param {*} val 要复制的内容* returns*/ export const copyToClipboard async val > {try {// 使用现代 API 尝试复制if (navigator.clipboard && navigator.permissions) {await navigator.clipboard.writeText(val)return // 如果成功&#xff0c;直接…

pikachu靶场-全套学习

文章目录 配置pikachu靶场浏览器访问过程burpsuite配置代理hackbar安装使用kali安装中国蚁剑暴力破解cookie简化场景解释各部分含义如何工作 基于表单的暴力破解验证码绕过(On server)验证码绕过(on client)token防爆破? XSS&#xff08;Cross-Site Scripting跨站脚本攻击 &am…

Linux下安装mysql8.0(以tar.xz包安装--编译安装)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Linux下安装mysql8.0&#xff08;以tar.xz包安装--编译安装&#xff09;https://myweb.myskillstree.cn/126.html 目录 一、下载对应自己glic版本的MySQL …

Linux x86_64 dump_stack()函数基于FP栈回溯

文章目录 前言一、dump_stack函数使用二、dump_stack函数源码解析2.1 show_stack2.2 show_stack_log_lvl2.3 show_trace_log_lvl2.4 dump_trace2.5 print_context_stack 参考资料 前言 Linux x86_64 centos7 Linux&#xff1a;3.10.0 一、dump_stack函数使用 dump_stack函数…

【Python基础】装饰器(3848字)

文章目录 [toc]闭包什么是装饰器装饰器示例不使用装饰器语法使用装饰器语法 装饰器传参带参数的装饰器类装饰器魔术方法\__call__()类装饰器示例带参数类装饰器property装饰器分页操作商品价格操作 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&…

Redis不同数据类型value存储

一、Strings redis中String的底层没有用c的char来实现&#xff0c;而是使用SDS数据结构( char buf[])。 缺点:浪费空间 优势: 1.c字符串不记录自身的长度&#xff0c;所以获取一个字符串长度的复杂度是O(N),但是SDS记录分配的长度alloc,已使用长度len&#xff0c;获取长度的…

资深测试必备技能!TestNG自动化测试框架实战详解

1、TestNG导言 在软件测试工作中&#xff0c;自动测试框架是不可或缺的&#xff0c;之前有Junit和Nunit框架&#xff0c;后有TestNG。TestNG不但吸取了Junit和Nunit框架的思想&#xff0c;而且创造了更强大的功能&#xff0c;它不但是单元测试框架&#xff0c;同时也是集成自动…

Qt Tab键切换焦点顺序:setTabOrder()

使用这个方法setTabOrder()&#xff0c;设置使得焦点的顺序从前到后依次是&#xff1a; ui->lineEdit》 ui->lineEdit_2》ui->lineEdit_3 》ui->lineEdit_4 焦点先在ui->lineEdit上&#xff0c;当按下Tab键时&#xff0c;焦点跑到ui->lineEdit_2上。。。按…

VS远程调试

因为是做工厂应用的客制化项目&#xff0c;在客户现场出现异常&#xff0c;本地又很难复现&#xff0c;而且重启软件可能又自动恢复了&#xff0c;此时可以用VisualStudio自带的远程调试功能进行调试&#xff0c;不需要重启软件&#xff0c;能较好的定位问题。客户电脑上不需要…

VBA信息获取与处理第四节:获取唯一非重复值返回数组的代码

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

k8s部署skywalking(helm)

官方文档 官方文档说明&#xff1a;Backend setup | Apache SkyWalking官方helm源码&#xff1a;apache/skywalking-helm官方下载&#xff08;包括agent、apm&#xff09;:Downloads | Apache SkyWalking 部署 根据官方helm提示&#xff0c;选择你自己部署的方式&#xff0c…

企业网站从传统服务器迁移到弹性云有什么优势呢?

现代企业对于网站和应用程序的可用性和性能要求越来越高&#xff0c;传统基础设施可能无法满足这些需求。弹性云作为一种新兴的云计算服务模式&#xff0c;对于企业网站的运行和管理带来了许多优势。下面是企业网站从传统服务器迁移到弹性云的五大优势&#xff1a; 灵活弹性&a…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍 文章编号&#x…

Unable to locate the .NET SDK

问题描述&#xff1a; vs2019 加载项目时&#xff0c;提示如下&#xff1a; Unable to locate the .NET SDK as specified by global.json, please check that the specified version is installed. 项目中没有globan找al.json 文件 先使用&#xff1a; dotnet --list-sdks 命…

使用 docker-compose 搭建个人博客 Halo

说明 我这里使用的是 Halo 作为博客的工具&#xff0c;毕竟是开源了&#xff0c;也是使用 Java 写的嘛&#xff0c;另外一点就是使用 docker 来安装&#xff08;自动挡&#xff0c;不用自己考虑太多的环境因素&#xff09;&#xff0c;这样子搭建起来更快一点&#xff0c;我们…

SpringCloudAlibaba:5.1Sentinel的基本使用

概述 简介 Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 官网 https://sentinelguard.io/zh-cn/ Sentinel的历史 2012 年&#xff0c;Sentinel 诞生&#xff0c;主要功能为入口流量控制。 2013-2017 年…

[ue5]编译报错:使用未定义的 struct“FPointDamageEvent“

编译报错&#xff0c;错误很多&#xff0c;但很明显核心问题是第一个&#xff1a;使用未定义的 struct“FPointDamageEvent“&#xff1a; 程序没有找到FPointDamageEvent的定义。 解决办法&#xff1a; 处理这类未定义都可以先F12&#xff0c;找到它的库位置&#xff0c;之后…