小红书无水印视频图集解析实现思路

小红书无水印视频/图集解析实现思路

一、代码

开门见山,没有兴趣直接 Ctrl + C ✅

def get_xhs(url):
    # 示例HTML内容,实际使用时请替换为您的HTML内容
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
    }
    try:
        content = requests.get(url, headers=headers, ).text
    except Exception as e:
        print(f"Error occurred: {e}")
        return (f"Error occurred: {e}")
    html_content = content
    soup = BeautifulSoup(html_content, 'html.parser')
    # 初始化一个字典来存储我们要返回的数据
    data = {}
    # 提取所有图片链接
    images = [meta['content'] for meta in soup.find_all('meta', attrs={'name': 'og:image'})]

    # 提取视频链接
    video_tags = soup.find_all('meta', attrs={'name': 'og:video'})

    # 提取文本关键字和描述
    keywords = soup.find('meta', attrs={'name': 'keywords'})['content'] if soup.find('meta', attrs={
        'name': 'keywords'}) else None
    description = soup.find('meta', attrs={'name': 'description'})['content'] if soup.find('meta', attrs={
        'name': 'description'}) else None
    # 提取标题
    title = soup.find('meta', attrs={'name': 'og:title'})['content'] if soup.find('meta', attrs={
        'name': 'og:title'}) else None
    title = title.replace(" - 小红书", "")
    # 提取特定社交媒体平台的元数据(这里假设它们存在)
    comment = soup.find('meta', attrs={'name': 'og:xhs:note_comment'})['content'] if soup.find('meta', attrs={
        'name': 'og:xhs:note_comment'}) else None
    like = soup.find('meta', attrs={'name': 'og:xhs:note_like'})['content'] if soup.find('meta', attrs={
        'name': 'og:xhs:note_like'}) else None
    collect = soup.find('meta', attrs={'name': 'og:xhs:note_collect'})['content'] if soup.find('meta', attrs={
        'name': 'og:xhs:note_collect'}) else None
    videotime = soup.find('meta', attrs={'name': 'og:videotime'})['content'] if soup.find('meta', attrs={
        'name': 'og:videotime'}) else None
    data['title'] = title
    data['description'] = description
    data['keywords'] = keywords
    data['like'] = like
    data['collect'] = collect
    data['comment'] = comment
    data['videotime'] = videotime
    data['images'] = images
    data['videos'] = [tag['content'] for tag in video_tags] if video_tags else []
    # 提取rel属性为"preload"的link标签
    cover_img = [link.get('href') for link in soup.find_all('link', rel="preload") if link.get('href')]
    if cover_img:
        data['cover_img'] = cover_img
        # 返回JSON格式的字典
    return json.dumps(data, indent=4, ensure_ascii=False)

二、实现思路

小红书加密不多 直接采用HTML解析的方法拿到数据即可

重点 获取无水印视频

获取视频地址

通过拼接 originVideoKey 参数得到无水印的地址

originVideoKey` 参数位于:`$json['note']['noteDetailMap'][$id]['note']['video']['consumer']['originVideoKey'] 

拼接方法:'https://sns-video-bd.xhscdn.com/' . {originVideoKey}

上方源码获取的是 带有水印的代码

# 无水印
def get_video(response):
     aa = response.find('"originVideoKey')
     bb = response.find('"}', aa + 20)
     video_key = response[aa + 18:bb].replace(r"\u002F", "/")
     video_url = "http://os-test-v1.xhscdn.com/" + video_key
     get_content(response)
     return video_url

三、疑问🤔

网上的小红书解析工具会返回一个路径为 258 的 URL,与上述 URL 不同,但是仍然有效,不知道是怎么构造出来的。对比两个 URL 的差异如下:

有水印 https://sns-video-hw.xhscdn.com/stream/110/259/01e5e2b96c2b17eb010371038dfdd2b1c0_259.mp4
无水印 https://sns-video-hw.xhscdn.com/stream/110/258/01e5e2b96c2b17eb010371038dfdd239f3_258.mp4

暂时未发现是如何构造的,有大佬知道可以指教一下

四、Tips

请勿用于商业用途,仅供学习交流使用 !!!

请勿用于商业用途,仅供学习交流使用 !!!

请勿用于商业用途,仅供学习交流使用 !!!

无水印视频过大时需要先下载然后修改后缀名.mp4

QQ 2027514529 如有违规联系删除!
posted @ 2024-07-13 15:57  Van-kai  阅读(1055)  评论(0)    收藏  举报