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

2024-05-13 14:28

本文主要是介绍selenium进行xhs图片爬虫:06xhs一个博主的全部文章图片爬取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📚博客主页: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 matchestemp_height = 0
url_code_list = []
while True:content = driver.page_sourcenew_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("到底了")breaktemp_height = check_heightprint(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()# 打印网页titleprint(driver.current_url)print(driver.title)temp_height = 0url_code_list = []while True:content = driver.page_sourcenew_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("到底了")breaktemp_height = check_heightprint(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 timetimestamp = 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 timetimestamp = 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视频会有一个封面,该代码也会爬取这个视频封面,而不是漏过这个视频。

这篇关于selenium进行xhs图片爬虫:06xhs一个博主的全部文章图片爬取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985963

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目