最近想跟女朋友换个情侣头像,找了一圈,终于在 小红书 里找到几个看上眼的,保存图片时,找了半天发现居然没有下载按钮!!!

那可不可以分享呢,复制分享链接在浏览器中打开试了一下,这样可以保存图片了,但是图片是有水印的。

可不可以下载到去水印的图片呢?

我去网上简单搜索了一下,倒是搜到很多去水印的小程序,但是这些几乎都是有免费使用次数限制的,解析几次就不让用了,要充钱或者什么的,作为一名会爬虫的程序员,这能忍?

既然它们可以通过小红书的分享链接直接解析出无水印的图片,那么理论上来讲,我也可以!

话不多说,说干就干。


1. 思路分析

首先,在小红书 APP 中点击分享,获取到它的链接分享,如:https://www.xiaohongshu.com/discovery/item/60a5f16f0000000021034cb4

然后把它在浏览器中(我用的是 chrome 浏览器)打开。

F12 或者 Ctrl + shift + i 打开 开发者工具,切换到 Network 类型,过滤器选择 Img,如图所示,

刷新一下网页,可以很轻松的提取到我们要的图片的链接。

Preview 中可以预览图片,在 Headers 中可以查看到图片的 请求头 等信息。

如上图,就可以知道图片的下载链接了。

https://ci.xiaohongshu.com/0c7a3f7b-92c9-4e0b-5408-4154abc82d86?imageView2/2/w/100/h/100/q/75

简单分析一下,链接由以下几部分组成,域名(https://ci.xiaohongshu.com/) + 图片id(0c7a3f7b-92c9-4e0b-5408-4154abc82d86) + ? + 压缩格式(imageView2/2/w/100/h/100/q/75)。

Tips:浏览器中直接访问 https://ci.xiaohongshu.com/0c7a3f7b-92c9-4e0b-5408-4154abc82d86?imageView2/2/w/100/h/100/q/75 会弹出下载界面;而去掉 ? 后面的部分,访问 https://ci.xiaohongshu.com/0c7a3f7b-92c9-4e0b-5408-4154abc82d86 会在浏览器中打开图片。

通过上面的链接直接下载到的图片,我们发现是有水印的,那无水印的图片怎么去获取呢?

我们继续分析。

我们已经知道了,图片的链接是由 域名 + ID + 压缩格式 组成的,而后面的压缩格式字段只影响图片的尺寸和质量,并不影响有无水印,甚至去掉都没关系(貌似去掉以后获取到的是压缩前的原图)。

所以,无水印的图片,一定是通过 ID 来控制的。而且作为程序员的直觉,这个无水印图片 ID (如果有的话)一定是跟有水印的图片 ID 放一起的。

接下来,我们复制 0c7a3f7b-92c9-4e0b-5408-4154abc82d86(有水印的图片ID) 去网页源码里搜索,看有无收获。

经过一番寻找,终于找到一个地方很可疑,是一个 json 格式的文本,在 imageList 下有很多元素,每一项里都有 url ,宽高,fieldIdtraceId 信息。

我们发现,url 就是我们刚才找到的图片链接(里面的 \u002F 是 斜杠 / 的 URL编码),fieldId 就是我们找到的图片的 ID。

这时候,就有一个字段很可疑了,traceId 是什么呢?

抱着试试的心态,我把 url 里的 图片id 换成了 traceId 的值,复制到浏览器中查看一下

https://ci.xiaohongshu.com/5ab4de05-817e-302f-b2c2-3a7562102b96

嘿,您猜怎么着?水印没啦!!哈哈哈哈

这样,我们就完成了 图片去水印 的思路分析环节,成功提取到了无水印的图片链接。

接下来,我们使用 python 爬虫程序来实现这一过程。

2. 编码环节

整理一下我们的提取思路:

  1. 找到小红书分享链接的网页源码

  2. 提取出包含图片信息的 imageList 字段,解析为 json 格式

  3. 提取出 traceId 字段,替换原图片 url 中的 fieldId 部分

  4. 使用新拼接好的 url 下载图片

接下来我们编码来实现这一过程。

2.1 网络请求函数

import requestsdef fetchUrl(url):'''发起网络请求,获取网页源码'''headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 ','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36','cookie':'你自己的 cookie',}r = requests.get(url, headers = headers)return r.text

我们使用 requests 库来发起网络请求,其中,url 是要请求的网址,headers 是请求头,用来把爬虫伪装成浏览器,以及向服务器发送一些必要的参数。

小红书的服务器要验证 cookie 信息,cookie 不填或者过期都会访问失败,所以需要去浏览器中复制自己的 cookie 替换到代码中。

2.2 解析图片链接

def parsing_link(html):'''解析html文本,提取无水印图片的 url'''beginPos = html.find('imageList') + 11endPos = html.find(',"cover"')imageList = eval(html[beginPos: endPos])for i in imageList:picUrl = f"https://ci.xiaohongshu.com/{i['traceId']}"yield picUrl, i['traceId']

这个函数的作用是解析网页源码,从中提取出去水印图片的 url 链接。

这里提取的时候我们没有用第三方解析库,而是取了个巧,大家可以参考一下。

如图所示,我们需要的是图中红框部分的数据,观察后发现,这些数据位于字符串 imageList,"cover" 之间。

所以使用 .find 函数直接定位起始和终止位置,通过 html[beginPos: endPos] 直接将中间部分提取出来了。

此外,这里的 eval() 函数,作用是把字符串解析成 json 对象。

2.3 下载保存图片


def download(url, filename):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36',}with open(f'{filename}.jpg', 'wb') as v:try:r = requests.get(url, headers=headers)v.write(r.content)except Exception as e:print('图片下载错误!')

这个函数的作用是通过图片链接,下载图片并保存在本地。

保存图片跟保存文本不同的点在于,图片的数据是二进制形式,所以

  1. 处理网络请求结果时,使用 r.content (普通文本一般用 r.text)

  2. 保存文件时,mode 选择 wb (普通文本一般用 w)

2.4 主函数

if __name__ == '__main__':original_link = 'https://www.xiaohongshu.com/discovery/item/60a5f16f0000000021034cb4'html = fetchUrl(original_link)for url, traceId in parsing_link(html):print(f"download image {url}")download(url, traceId)print("Finished!")

主函数作为 爬虫调度器,用来启动爬虫,控制爬虫进度等。

original_link 是初始请求链接,即小红书的分享链接

download(url, traceId) 中,第二个参数是图片保存的文件名,这里我设置了 traceId 作为文件名,大家可以根据需要自行设置命名规则。

3. 运行效果

启动程序,爬虫顺利运行,下面是运行结果。

无水印的图片也顺利保存到了本地。

4. 爬虫源码分享

import requests
import os'''https://ci.xiaohongshu.com/ 这个是小红书无水印拼接链接,后面只要传入:traceId 里面的参数即可'''def fetchUrl(url):'''发起网络请求,获取网页源码'''headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 ','cookie':'你自己的cookie','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36',}r = requests.get(url, headers = headers)return r.textdef parsing_link(html):'''解析html文本,提取无水印图片的 url'''beginPos = html.find('imageList') + 11endPos = html.find(',"cover"')imageList = eval(html[beginPos: endPos])for i in imageList:picUrl = f"https://ci.xiaohongshu.com/{i['traceId']}"yield picUrl, i['traceId']def download(url, filename):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36',}with open(f'{filename}.jpg', 'wb') as v:try:r = requests.get(url, headers=headers)v.write(r.content)except Exception as e:print('图片下载错误!')if __name__ == '__main__':original_link = 'https://www.xiaohongshu.com/discovery/item/60a5f16f0000000021034cb4'html = fetchUrl(original_link)for url, traceId in parsing_link(html):print(f"download image {url}")download(url, traceId)print("Finished!")

这下终于可以愉快地跟女朋友换情侣头像了。

如果文章中有哪里没有讲明白,或者讲解有误的地方,欢迎在评论区批评指正,或者扫描下面的二维码,加我微信,大家一起学习交流,共同进步。

Python 网络爬虫实战:如何下载小红书去水印图片相关推荐

  1. [day4]python网络爬虫实战:爬取美女写真图片(Scrapy版)

    l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.Scrapy简介 4. ...

  2. [day2]python网络爬虫实战:爬取美女写真图片(增强版)

    l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.实现 1.分析url格 ...

  3. [day1]python网络爬虫实战:爬取美女写真图片

    l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.实现 1.分析url格 ...

  4. Python网络爬虫实战案例之:7000本电子书下载(2)

    一.前言 本文是<Python开发实战案例之网络爬虫>的第二部分:7000本电子书下载网络爬虫开发环境安装部署.配套视频课程详见网易云课堂 二.章节目录 (1)Python开发环境依赖 ( ...

  5. python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...

    廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程 1.JPG (53.51 KB, 下载次数: 1) 2019-8-9 08:15 上传 2.JPG ...

  6. python爬虫文件代码大全-Python网络爬虫实战项目代码大全(长期更新,欢迎补充)...

    WechatSogou[1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典.[1]: https://github ...

  7. python常用代码大全-Python 网络爬虫实战项目代码大全

    原标题:Python 网络爬虫实战项目代码大全 DouBanSpider 豆瓣读书的爬虫.你可以爬豆瓣读书下面标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价 ...

  8. python基础代码大全-Python网络爬虫实战项目代码大全(长期更新,欢迎补充)

    WechatSogou[1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典.[1]: https://github ...

  9. Python 网络爬虫实战:猫眼电影 38950 条评论数据告诉你《无名之辈》是否值得一看?

    11月16日,一部无流量明星.无大制作.无大IP的"三无"国产电影<无名之辈>上映后,竟然连续打败了超级英雄"毒液".会魔法的"神奇动物& ...

  10. Python 网络爬虫实战:去哪儿网旅游攻略图文爬取保存为 Markdown电子书

    接上回,<Python 网络爬虫实战:爬取<去哪儿>网数千篇旅游攻略数据>. 我们爬取到了数千篇的旅游攻略文章的数据. 但是事情还没有结束,对于大部分的人来讲,最希望得到的东西 ...

最新文章

  1. Select Top在不同数据库中的使用
  2. GTC2018八大热点:发布多项黑科技,联合芯片巨头ARM打造AI芯片专用IP
  3. vc中载入flash资源
  4. InsightFace笔记
  5. android系统sharedUserId: SYSTEM_UID+PHONE_UID+BLUETOOH_UID+LOG_UID+NFC_UID
  6. linux用户和账号管理
  7. BZOJ 1283 费用流
  8. (49)FPGA面试技能提升篇(仿真加速平台Palladium、Zebu、Veloce)
  9. 系统设计2:数据库设计
  10. RxJava+Retrofit+MVP+Dagger2 谷歌四件套
  11. java date 格式化 yyyymmdd_如何将LocalDate格式化为yyyyMMDD(不含JodaTime)
  12. latex段落悬挂缩进_使用正则表达式在Java中悬挂缩进段落
  13. beyond compare this license key has been revoked
  14. Qt操作Excel类
  15. C语言限时答题小程序
  16. 什么是 java 序列化?什么情况下需要序列化?
  17. 项目管理中的各种技术,分析图(简介+应用子过程)
  18. 快速设置电脑自动关机
  19. 虚拟信用卡免费申请(工行E卡充值entropay虚拟信用卡)
  20. HTML非遗文化网页设计题材【京剧文化】HTML+CSS(大美中国 14页 带bootstarp)

热门文章

  1. Win10磁盘占用100%的解决办法
  2. 比较简单的win7升级win10的方法
  3. 独家首发强大的个性生成工具箱微信小程序源码,超多功能的合成
  4. Echarts教程1_ ECharts官方教程(一)【5分钟上手ECharts】
  5. 中国通信简史 (上)
  6. R语言:蒙特卡洛模拟
  7. bochs镜像java模拟器_bochs镜像下载
  8. pxe服务器启动镜像存放位置,PXE启动服务器及客户端镜像制作
  9. Nvivo 12 Plus WIN版本丨中文英文 软件安装包下载 安装教程步骤丨WIN系统
  10. AOP结构图(术语图解)