selenium进行xhs图片爬虫:06xhs一个博主的全部文章图片爬取

news2025/2/24 0:02:27

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

保存文章url

本来我想这把实现爬取一个博主的全部文章图片爬取放在一个py文件中,后来想想还是分开吧。

那就涉及到爬取博主文章链接的存放,我这里是存放到txt文件中。

def save_to_txt(array,file_path="url_list.txt"):
    # 打开文件,以写入模式打开('w')
    with open(file_path, 'w') as file:
        # 遍历数组的每一个元素
        for item in array:
            # 将当前元素转换为字符串,并写入文件
            file.write(str(item) + '\n')

该函数就是将列表/数组中的每个元素存入txt的每行中。

当你熟悉01保存链接到txt.py文件后,你可以将其封装一下。如01保存链接到txt(代码重构).py

01保存链接到txt.py

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from collections import Counter  # 解决去重+乱序问题
import re
import time
import os
import requests

# # TODO 实现免登录爬虫
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
driver = webdriver.Chrome(options=options)

time.sleep(3)
# driver = webdriver.Chrome() # 直接这样爬取到的网址不全
url = "https://www.xiaohongshu.com/user/profile/613c82b800000000020270c1"
# url = "https://www.xiaohongshu.com/user/profile/6262794f000000002102a1e4"
# 访问某个网页
driver.get(url)  # 使用驱动实例打开指定的网页
driver.maximize_window()
# 打印网页title
print(driver.current_url)
print(driver.title)
# TODO 该函数是用来返回每次网页中的链接最后数字,如https://www.xiaohongshu.com/explore/65f23536000000000d00f0cd的65f23536000000000d00f0cd,方便后续构造函数
def get_url_code(content):
    url_pattern = re.compile(r'href="/explore/(.*?)"')
    matches = url_pattern.findall(content)
    return matches

temp_height = 0
url_code_list = []
while True:
    content = driver.page_source
    new_url_list = get_url_code(content)
    # print(new_url_list)
    url_code_list += new_url_list
    # 循环将滚动条下拉
    driver.execute_script("window.scrollBy(0,600)")
    # sleep一下让滚动条反应一下
    time.sleep(1)
    # 获取当前滚动条距离顶部的距离
    check_height = driver.execute_script(
        "return document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;")
    # 如果两者相等说明到底了
    if check_height == temp_height:
        print("到底了")
        break
    temp_height = check_height
    print(check_height)

unique_url_code_list = list(Counter(url_code_list))
print(unique_url_code_list)
print(len(unique_url_code_list))

def get_url_list(unique_url_code_list):
    added_string = 'https://www.xiaohongshu.com/explore/'
    # 创建一个空列表来存放结果
    new_url_list = []

    # 循环遍历原始列表,将每个元素加上相同的字符串并存放到新的列表中
    for x in unique_url_code_list:
        new_url_list.append(added_string + x)

    print(new_url_list)  # 输出加上相同字符串后的新列表
    new_url_list = new_url_list[::-1]  # 倒序变成顺序
    return new_url_list

# 得到了网址链接
url_array = get_url_list(unique_url_code_list)

def save_to_txt(array,file_path="url_list.txt"):
    # 打开文件,以写入模式打开('w')
    with open(file_path, 'w') as file:
        # 遍历数组的每一个元素
        for item in array:
            # 将当前元素转换为字符串,并写入文件
            file.write(str(item) + '\n')

save_to_txt(url_array)

01保存链接到txt(代码重构).py

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from collections import Counter  # 解决去重+乱序问题
import re
import time
import os
import requests


# TODO 该函数是用来返回每次网页中的链接最后数字,如https://www.xiaohongshu.com/explore/65f23536000000000d00f0cd的65f23536000000000d00f0cd,方便后续构造函数
def get_url_code(content):
    url_pattern = re.compile(r'href="/explore/(.*?)"')
    matches = url_pattern.findall(content)
    return matches

# TODO 浏览器进行滚动到最底部,返回网址的url中图片没有去重的网址
def browser_scrolling(url,driver):
    driver.get(url)  # 使用驱动实例打开指定的网页
    driver.maximize_window()
    # 打印网页title
    print(driver.current_url)
    print(driver.title)
    temp_height = 0
    url_code_list = []
    while True:
        content = driver.page_source
        new_url_list = get_url_code(content)
        # print(new_url_list)
        url_code_list += new_url_list  # 图片url网址合并到一个list中,里面不免有重复,后续需要去重
        # 循环将滚动条下拉
        driver.execute_script("window.scrollBy(0,600)")
        # sleep一下让滚动条反应一下
        time.sleep(1)
        # 获取当前滚动条距离顶部的距离
        check_height = driver.execute_script(
            "return document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;")
        # 如果两者相等说明到底了
        if check_height == temp_height:
            print("到底了")
            break
        temp_height = check_height
        print(check_height)
    return url_code_list

# TODO 通过传入每个url不同的部分,可以构造出每个完整的url,并且这里将其由倒序变成正序
def get_url_list(unique_url_code_list):
    added_string = 'https://www.xiaohongshu.com/explore/'
    # 创建一个空列表来存放结果
    new_url_list = []

    # 循环遍历原始列表,将每个元素加上相同的字符串并存放到新的列表中
    for x in unique_url_code_list:
        new_url_list.append(added_string + x)

    print(new_url_list)  # 输出加上相同字符串后的新列表
    new_url_list = new_url_list[::-1]  # 倒序变成顺序
    return new_url_list


# TODO 该函数将数组内容按每个元素存入到txt文件中
def save_to_txt(array, file_path="url_list.txt"):
    # 打开文件,以写入模式打开('w')
    with open(file_path, 'w') as file:
        # 遍历数组的每一个元素
        for item in array:
            # 将当前元素转换为字符串,并写入文件
            file.write(str(item) + '\n')


#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

# 获取当前时间戳,后续每个xhs网址的图片保存在每个时间戳中。
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__':
    # # TODO 实现免登录爬虫
    options = Options()
    options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
    driver = webdriver.Chrome(options=options)

    time.sleep(3)
    # driver = webdriver.Chrome() # 直接这样爬取到的网址不全
    # url = "https://www.xiaohongshu.com/user/profile/6520e7d10000000024017cfc"
    url = "https://www.xiaohongshu.com/user/profile/6576a2b8000000003d02a409"
    url_code_list = browser_scrolling(url, driver)
    # 去重
    unique_url_code_list = list(Counter(url_code_list))
    print(unique_url_code_list)
    print(len(unique_url_code_list))
    # 得到了网址链接
    url_array = get_url_list(unique_url_code_list)
    save_to_txt(url_array)

爬取每篇文章的图片

爬取图片就是简单了,这个就是我们之前经常说的内容了。

if __name__ == '__main__':
    # 打开文件
    url_list = []
    with open('url_list.txt', 'r') as file:
        # 逐行读取文件内容
        for line in file:
            # 处理每行的内容,例如打印或者进行其他操作
            url_list.append(line.strip())  #  使用strip()方法去除每行末尾的换行符

    for i, url in enumerate(url_list):
        print(f"处理进度:{i+1}/{len(url_list)}现在正在处理的网址为:{url}")
        page_source = get_html_code(url)
        get_img_url_list(page_source)
        time.sleep(1)

这里就是首先读取txt内容,保存到列表中,然后用一个循环,每隔一秒去爬取每篇文章的图片。

02爬图片.py

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

#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)

        image_save_batch(unique_matches, path)
    else:
        print("没有图片链接发现")

if __name__ == '__main__':
    # 打开文件
    url_list = []
    with open('url_list.txt', 'r') as file:
        # 逐行读取文件内容
        for line in file:
            # 处理每行的内容,例如打印或者进行其他操作
            url_list.append(line.strip())  #  使用strip()方法去除每行末尾的换行符

    for i, url in enumerate(url_list):
        print(f"处理进度:{i+1}/{len(url_list)} 现在正在处理的网址为:{url}")
        page_source = get_html_code(url)
        # todo 路径编写
        get_img_url_list(page_source, path="images\\头像")
        time.sleep(1)

运行结果如下:
在这里插入图片描述

图片会保存在你命名的路径下,按照时间戳对每篇文章图片分类
在这里插入图片描述

最后

这里有个需要特别关注的地方。xhs视频会有一个封面,该代码也会爬取这个视频封面,而不是漏过这个视频。

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

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

相关文章

计算机毕业设计源码 | 基于SpringBoot的线上教学系统 答疑辅导网站(附源码)

1&#xff0c;项目介绍 1.1 项目背景 网络问答平台经历了多年的发展&#xff0c;目前处于一个日益成熟的状态。最早的网络问答平台是知乎&#xff0c;知乎的创立者认为有许多信息在互联网上没有被记录和共享&#xff0c;于是他们决定创造一个平台&#xff0c;能够让更多人可以…

Spring的IOC和AOP机制?

我们是在使用Spring框架的过程中&#xff0c;其实就是为了使用IOC&#xff0c;依赖注入&#xff0c;和AOP&#xff0c;面向切面编程&#xff0c;这两个是Spring的灵魂。 主要用到的设计模式有工厂模式和代理模式。 IOC就是典型的工厂模式&#xff0c;通过sessionfactory去注入…

CVE-2015-1635(MS15-034 ) 远程代码执行漏洞

1.打补丁 https://docs.microsoft.com/zh-cn/security-updates/Securitybulletins/2015/ms15-034 2.临时禁用IIS内核缓存

大型语言模型自我进化综述

24年4月来自北大的论文“A Survey on Self-Evolution of Large Language Models”。 大语言模型&#xff08;LLM&#xff09;在各个领域和智体应用中取得了显着的进步。 然而&#xff0c;目前从人类或外部模型监督中学习的LLM成本高昂&#xff0c;并且随着任务复杂性和多样性的…

【STM32 |外部中断】中断系统、EXTI外部中断

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 丠丠64-CSDN博客&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

一图看懂git merge和git rebase的区别!!

一图看懂git merge和git rebase的区别&#xff01;&#xff01; Git 是一个非常流行的版本控制系统&#xff0c;它帮助开发者管理代码的不同版本。在 Git 中&#xff0c;merge 和 rebase 是两种常用的将不同分支的更改合并到一起的方法&#xff0c;但它们在处理方式和结果上有…

第四届微调——炼丹

学习地址&#xff1a;Tutorial/xtuner/README.md at main InternLM/Tutorial GitHub 笔记 微调是一种在已有的预训练模型基础上&#xff0c;通过使用新的数据对模型进行进一步优化和调整的技术手段。它的目的是使模型能够更好地适应特定的应用场景和任务需求&#xff0c;进一…

融入新科技的SLM27211系列 120V, 3A/4.5A高低边高频门极驱动器兼容UCC27284,MAX15013A

SLM27211是高低边高频门极驱动器&#xff0c;集成了120V的自举二极管&#xff0c;支持高频大电流的输出&#xff0c;可在8V~17V的宽电压范围内驱动MOSFET&#xff0c;独立的高、低边驱动以方便控制&#xff0c;可用于半桥、全桥、双管正激和有源钳位正激等拓。有极好的开通、关…

26 Debian如何配置SSH密钥对验证(支持无密码安全登录)

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian如何配置SSH密钥对验证 《傅老师Debian小知识库系列之26》——原创 前言 傅老师Debian小知识库特点&#xff1a; 1、最小化拆解Debian实用技能&…

【什么是范数】L1、L2范数介绍

一、 什么是范数 范数&#xff08;Norm&#xff09;是数学中用于衡量向量大小(或距离)的一种概念。在几何和代数中&#xff0c;范数可以提供一个向量长度或大小的量度。更正式地说&#xff0c;范数是一个函数&#xff0c;它将向量的集合映射到非负实数&#xff0c;满足以下性质…

【WP网站开发新的订单查询页面,根据付费单号未登录用户可查询资源下载地址】RiProV2主题美化WordPress美化订单查询页面,二次开发DIY的功能页面

【WP网站开发新的订单查询页面,根据付费单号未登录用户可查询资源下载地址】RiProV2主题美化WordPress美化订单查询页面,二次开发DIY的功能页面 背景: 很多资源站是使用,WordPress搭建的PHP网站,一般会额外使用一个主题,比如RiProV2,Ritheme,日主题;本文以 RiProV2主…

物联网实战--平台篇之(七)应用界面设计

目录 一、米家APP分析 二、应用展示 三、应用列表 四、新建应用 五、重命名应用 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.…

jar包启动报错no main manifest attribute

我是这里加了这个跳过&#xff0c;把这个注释掉即可。

SSL证书助力工业和信息化领域数据安全,确保传输数据的保密性、完整性

工业和信息化领域数据包括工业数据、电信数据和无线电数据等&#xff0c;是国家重要基础性战略资源&#xff0c;随着工业领域数字化、网络化、智能化加速提质升级&#xff0c;数据泄露、勒索攻击等网络风险日益增加&#xff0c;由此加强工业和信息化领域数据安全管理&#xff0…

RiProV2主题美化【支付页弹窗增加价格提示语】Ritheme主题美化RiProV2-网站WordPress美化二开

背景: 楼主的网站是用WordPress搭建的,并使用了正版主题RiProV2,但RiProV2在支付弹窗页没有价格,只在文章详情页会展示价格。本文就是美化这个支付弹窗,在支付弹窗页把价格字段加上,如下图所示: 美化前: 美化后 美化步骤: (1)定位到文件:/www/wwwroot/www.uu2i…

【牛客】SQL211 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

1、描述 有一个薪水表salaries简况如下&#xff1a; 请你获取薪水第二多的员工的emp_no以及其对应的薪水salary&#xff0c; 若有多个员工的薪水为第二多的薪水&#xff0c;则将对应的员工的emp_no和salary全部输出&#xff0c;并按emp_no升序排序。 2、题目建表 drop table …

考研数学|24像张宇那样的题?李林880和李永乐660不够用了?

以前的卷子就不说了&#xff0c;就说说最近的24年的考研数学题 24年考研数学真题评价&#xff1a; 首先数学二在计算量上超过了数学三&#xff0c;尤其是在高等数学的选择题部分&#xff0c;这使得数学二的难度可能略高于数学三&#xff0c;尽管两者之间并没有本质的差异。与…

附录2 创建flask镜像

目录 1 python镜像 2 安装flask 3 把项目文件扔进去 3.1 创建git仓库 3.2 上传文件 3.3 获取git链接 3.4 在容器中git clone 4 启动flask服务 5 将容器保存为镜像 6 映射端口运行镜像 7 遇到的问题 8 Dockerfile创建镜像 1 python镜像 首先找一下fla…

怎么用电脑接收手机文件 用备忘录传输更舒服

在这个数字化时代&#xff0c;手机已经成为我们随身携带的“百宝箱”&#xff0c;里面装满了各种重要的文件、资料和信息。然而&#xff0c;有时我们需要在电脑上处理这些文件&#xff0c;比如编辑文档、制作PPT或是查看照片。那么&#xff0c;如何在电脑与手机之间实现文件的顺…

Leetcode-有效的括号

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-parentheses/ 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&…