使用Python爬取小红书笔记与评论(js注入方式获取x-s)

2024-01-12 14:12

本文主要是介绍使用Python爬取小红书笔记与评论(js注入方式获取x-s),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 写在前面
  • 2. 分析加密入口
  • 3. 使用JS注入
  • 4. 爬虫工程化

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  除了对x-s、x-s-common进行分析实现加密算法,还有之前文章中提到的通过JS注入免扣加密算法的方式获取加密参数

加密分析及算法文章请阅读这篇文章:小红书x-s、x-s-common加密分析(2024-01-10更新)

x-s的加密算法为JS实现、x-s-common的加密算法为Python实现

2. 分析加密入口

在这里插入图片描述

可以看到上图断点处l包含x-s跟x-t的返回,看下面这行代码:

l = (a && void 0 !== window._webmsxyw ? window._webmsxyw : encrypt_sign)(s, i) || {};

window._webmsxyw函数内即加密逻辑,在自执行函数内部并添加在了window属性中

该函数接受两个参数,s是api接口的路径,i是请求提交的参数

3. 使用JS注入

可以使用Playwright或者pyppeteer实现,通过浏览器的JavaScript注入来获取加密参数,代码实现分别如下

Playwright方式:

import asyncio
from playwright.async_api import async_playwrightasync def main():async with async_playwright() as playwright:browser = await playwright.chromium.launch(headless=True)page = await browser.new_page()# 注入stealth.min.js脚本await page.add_init_script(path="stealth.min.js")url = "" # 请求apidata = "" # 请求参数# 执行JavaScriptencrypt_params = await page.evaluate('([url, data]) => window._webmsxyw(url, data)', [url, data])local_storage = await page.evaluate('() => window.localStorage')print(encrypt_params)print(local_storage)await browser.close()asyncio.run(main())

pyppeteer方式:

import asyncio
from pyppeteer import launchasync def main():browser = await launch(headless=True)page = await browser.newPage()# 注入stealth.min.js脚本stealth_script = open("stealth.min.js", "r").read()await page.evaluateOnNewDocument(stealth_script)url = ""  # 请求apidata = ""  # 请求参数# 执行JavaScriptencrypt_params = await page.evaluate('([url, data]) => window._webmsxyw(url, data)', [url, data])local_storage = await page.evaluate('() => window.localStorage')print(encrypt_params)print(local_storage)await browser.close()asyncio.get_event_loop().run_until_complete(main())

上面的stealth.min.js脚本注入的作用是为了防止被检测的,另外cookie参数需要设置属性来避免Web端出现滑动验证码

当然,这个都是爬虫最终工程化需要考虑的事情,这里主要还是通过非逆向分析的方式去解决加密参数问题!

window.localStorage在之前加密分析的文章中已经详细介绍了,localStorage是一个在浏览器中存储键值对的API,通常用于持久化地存储数据,所需的b1参数就在其中

JS注入方式运行结果如下所示:
在这里插入图片描述

x-s跟x-t的加密参数通过注入的方式能够直接拿到,但是x-s-common的参数仍需要通过sign的方法加密计算生成!

Python版本的sign加密算法在之前的加密分析文章中已提供!JS注入的方式主要为了获取这些个参数:x-s、x-t、b1

JS注入的方式对于有前端基础及经验的小伙伴,就很简单了。通过上面的方式获取到所有的加密参数后,接下来就是爬虫的工程化

4. 爬虫工程化

以笔记搜索为例,爬虫代码实现如下:

import json
import httpx
from typing import Dict, Optionalasync def request(self, method, url, **kwargs) -> Dict:async with httpx.AsyncClient(proxies=self.proxies) as client:response = await client.request(method, url, timeout=self.timeout,**kwargs)   data: Dict = response.json()if data["success"]:return data.get("data", data.get("success", {}))elif data["code"] == self.IP_ERROR_CODE:raise IPBlockError(self.IP_ERROR_STR)else:raise DataFetchError(data.get("msg", None))async def unified_request(self, uri: Optional[str] = None, data: Optional[dict] = None,keyword: Optional[str] = None,page: Optional[int] = 1, page_size: Optional[int] = 20,sort: Optional[SearchSortType] = SearchSortType.GENERAL,note_type: Optional[SearchNoteType] = SearchNoteType.ALL) -> Dict:if keyword:_host = "https://edith.xiaohongshu.com"uri = "/api/sns/web/v1/search/notes"data = {"keyword": keyword,"page": page,"page_size": page_size,"search_id": get_search_id(),"sort": sort.value,"note_type": note_type.value}elif uri and data:headers = await self._pre_headers(uri, data)json_str = json.dumps(data, separators=(',', ':'), ensure_ascii=False)return await self.request(method="POST", url=f"{self._host}{uri}",data=json_str, headers=headers)else:raise ValueError("Either 'uri' and 'data' or 'keyword' must be provided.")return await request(method="POST", url=f"{_host}{uri}", data=json.dumps(data), headers=await self._pre_headers(uri, data))

最后,订阅的小伙伴可找作者获取开箱即用的完整爬虫项目代码,如下:

JS注入方式笔记搜索:

在这里插入图片描述

JS注入方式笔记评论:

在这里插入图片描述

这篇关于使用Python爬取小红书笔记与评论(js注入方式获取x-s)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3