Python采集小红书笔记详情,json数据返回
Python采集小红书笔记详情并返回JSON数据
要采集小红书笔记详情并返回JSON格式数据,需要注意小红书有反爬机制,直接请求可能会被拦截。以下是几种实现方法:
方法一:使用小红书官方API(如果有权限)
import requests |
import json |
def get_xiaohongshu_note_detail(note_id): |
""" |
通过小红书官方API获取笔记详情(需要合法权限) |
""" |
url = f"https://www.xiaohongshu.com/api/sns/v1/note/{note_id}" |
headers = { |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", |
"X-Sign": "your_sign_here", # 可能需要签名参数 |
"Authorization": "your_token_here" # 可能需要授权token |
} |
try: |
response = requests.get(url, headers=headers) |
response.raise_for_status() |
data = response.json() |
# 提取需要的字段 |
note_detail = { |
"id": data.get("id"), |
"title": data.get("title"), |
"desc": data.get("desc"), |
"images": [img["url"] for img in data.get("images", [])], |
"likes": data.get("likes"), |
"comments": data.get("comments"), |
"user": { |
"userid": data.get("user", {}).get("userid"), |
"nickname": data.get("user", {}).get("nickname"), |
"avatar": data.get("user", {}).get("image") |
}, |
"time": data.get("time") |
} |
return json.dumps(note_detail, ensure_ascii=False, indent=2) |
except Exception as e: |
return json.dumps({"error": str(e)}, ensure_ascii=False) |
# 使用示例 |
print(get_xiaohongshu_note_detail("your_note_id_here")) |
方法二:使用Selenium模拟浏览器访问(适合无API权限)
from selenium import webdriver |
from selenium.webdriver.chrome.options import Options |
import json |
import time |
def get_xiaohongshu_note_with_selenium(note_url): |
""" |
使用Selenium获取小红书笔记详情 |
""" |
chrome_options = Options() |
chrome_options.add_argument("--headless") # 无头模式 |
chrome_options.add_argument("--disable-gpu") |
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36") |
driver = webdriver.Chrome(options=chrome_options) |
try: |
driver.get(note_url) |
time.sleep(5) # 等待页面加载 |
# 这里需要根据实际页面结构提取数据 |
# 小红书页面是动态渲染的,可能需要等待特定元素出现 |
# 示例:获取标题(实际选择器需要根据页面调整) |
title = driver.find_element_by_css_selector("h1.title").text |
# 获取描述 |
desc = driver.find_element_by_css_selector("div.desc").text |
# 获取图片 |
images = [img.get_attribute("src") for img in driver.find_elements_by_css_selector("img.note-image")] |
# 获取用户信息 |
user_nickname = driver.find_element_by_css_selector("a.user-nickname").text |
user_avatar = driver.find_element_by_css_selector("img.user-avatar").get_attribute("src") |
note_detail = { |
"title": title, |
"desc": desc, |
"images": images, |
"user": { |
"nickname": user_nickname, |
"avatar": user_avatar |
} |
} |
return json.dumps(note_detail, ensure_ascii=False, indent=2) |
except Exception as e: |
return json.dumps({"error": str(e)}, ensure_ascii=False) |
finally: |
driver.quit() |
# 使用示例 |
print(get_xiaohongshu_note_with_selenium("https://www.xiaohongshu.com/note_url_here")) |
方法三:使用第三方服务或逆向工程API
import requests |
import json |
import re |
def get_xiaohongshu_note_detail_v2(note_url): |
""" |
通过分析小红书网页获取API请求(可能不稳定) |
""" |
# 首先获取笔记ID |
note_id_match = re.search(r"/discovery/item/(\w+)", note_url) |
if not note_id_match: |
return json.dumps({"error": "Invalid note URL"}, ensure_ascii=False) |
note_id = note_id_match.group(1) |
# 构造API请求(这些参数可能需要更新) |
api_url = "https://edith.xiaohongshu.com/api/sns/v1/note" |
headers = { |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", |
"X-Sign": "X12345678901234567890", # 可能需要动态生成 |
} |
params = { |
"note_id": note_id, |
"source": "discovery" |
} |
try: |
response = requests.get(api_url, headers=headers, params=params) |
response.raise_for_status() |
data = response.json() |
# 提取关键数据 |
note_data = data.get("data", {}).get("note", {}) |
user_data = data.get("data", {}).get("user", {}) |
result = { |
"id": note_data.get("id"), |
"title": note_data.get("title"), |
"desc": note_data.get("desc"), |
"images": [img["url"] for img in note_data.get("imageList", [])], |
"likes": note_data.get("likes"), |
"comments": note_data.get("commentCount"), |
"user": { |
"id": user_data.get("userid"), |
"name": user_data.get("nickname"), |
"avatar": user_data.get("image") |
}, |
"time": note_data.get("time") |
} |
return json.dumps(result, ensure_ascii=False, indent=2) |
except Exception as e: |
return json.dumps({"error": str(e)}, ensure_ascii=False) |
# 使用示例 |
print(get_xiaohongshu_note_detail_v2("https://www.xiaohongshu.com/discovery/item/123456789")) |
注意事项
合法性:在采集任何网站数据前,请确保遵守小红书的服务条款和相关法律法规。未经授权的大规模数据采集可能违反其使用条款。
反爬机制:小红书有严格的反爬措施,包括:
- 验证User-Agent
- 检查Cookie
- 动态生成的签名参数
- 频率限制
稳定性和维护:小红书的API和页面结构可能会变化,需要定期维护代码。
推荐做法:
- 优先申请官方API权限
- 控制请求频率
- 使用代理IP池
- 处理验证码等验证机制
数据存储:考虑将结果存储在数据库中而非仅返回JSON,便于后续分析。
如需更稳定的解决方案,建议使用小红书官方提供的开发者API(如果有权限)或考虑合法的数据采购渠道。