小红书无水印视频图集解析实现思路
小红书无水印视频/图集解析实现思路
一、代码
开门见山,没有兴趣直接 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 如有违规联系删除!
本文来自博客园,作者:Van-kai,转载请注明原文链接:https://www.cnblogs.com/van-kai/articles/18300226

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号