我也开车啦,一键爬取淘宝评论区照片

之前看网上有人利用mitmproxy一键爬取知乎各种爆照,感觉还挺有意思的,本着学习的态度,try了下,果真“学”到很多。学以致用一直是本人的优点,所以我决定爬取淘宝上评论区的照片…

ps.真的只是为了学习…

无图无真相

是的,最终我学习的目的达到了,爬取了很多图片用于学习。如下:

结果如下:

确实来自淘宝….部分妹子的open程度已经超过我这个屌丝程序员…

准备工作

在大刀阔斧开始干之前呢,需要把准备工作做好:

工具:Mac 、cellphone 、mitmproxy 、mitmdump、shell

实现思路

  • 商品搜索页对应了大量商品ID(一对多)
  • 商品ID对应了多页固定条数商品评论信息(一对多)
  • 单条商品评论对应多个评论图片(一对多)

    所以:

  1. 首先分析评论页的请求和返回,找到请求中团单id、翻页信息和评论返回中的图片url。
  2. 分析检索结果页,拿到请求中query内容和返回结果中的团单ID

实现步骤

  • 首先使用mitmproxy 代理iphone,在手机浏览器登录taobao
  • 在mitmproxy找到搜索search request、评论查询comment请求,并记录到本地
  • 修改search request中的检索内容,利用mitmdump replay search 获取商品id
  • 修改评论request的商品id和翻页id,获取到评论内容
  • 利用正则表达式获取评论内容中的图片url,并wget到本地

关于mitmproxy如何进行https代理

  • mitmproxy作为https代理,捕捉到手机端的请求之后,会发送一个同样的请求到server,和server展开安全握手获取server的Certificate
  • mitmproxy从Certificate中获取Common Name和Subject Alternative Name
  • mitmproxy签一个和Common Name,Subject Alternative Name一致的证书就可以骗过客户端了。所以即使客户端请求是使用的IP地址,这种方式也是行得通的。

just do it

安装mitmproxy

  • mitmproxy和mitmdump是一对孪生兄弟,是用python实现的,所以我们直接用pip安装即可
  • 安装完成后指定任意端口开启代理

     
  • 确认iphone和mac在同一网络环境下,在iphone设置Http代理,ip为mac的内网ip,port为代理port 8088 ,如图示:
  • 首次使用需要安装mitmproxy ca证书,打开iPhone Safari,输入地址:mitm.it,点击安装对应phone的证书。
  • 检查mitmproxy代理情况,没有问题,工具搞定,准备开车。

获取商品ID和评论页信息

        工具准备好了,接下来就是分析评论request 和 response,看如何该请求与商品信息做关联的,是否还需要其他额外信息或者防攻击验证。一开始我比较担心淘宝做了前端的伪随机验证防爬虫,不过仔细看了下请求内容没有发现什么。只是返回结果中图片地址没有加请求协议,不过目前各大网站基本上都迁移到了https,看mitmproxy的图片请求地址也是https,测试了https,果真图片就down下来了。

1. mitmproxy抓取并记录评论页

在进入到商品详情页后清空mitmproxy请求列表页,点击“查看更多评论”后在mitmproxy请求页找到评论请求,结果如下:

分析URL发现不只需要商品ID,还需要卖家ID,而且为了防劫持,还将请求时刻的毫秒数+1,指定为callback用于返回结果验证,不过返回结果实质还是json。如图:

不过我们只要返回结果中的图片url,即pics标签。 在mitmproxy请求列表页,按w保存该请求到本地,名称记录为commentDetail。并用mitmdump回放请求没有问题。

 

2. mitmproxy抓取并记录商品检索页

这一步的目的更加明确:

  • 明确url中传递的关键字如何替换和请求页码
  • 获取商品列表当前页中所有商品商品ID和卖家ID

和上一步同样的方法,我们抓取到请求url,这次结果中就是标准的json,我们直接正则匹配就可以拿出商品ID和卖家ID。如图示:

在mitmproxy请求列表页,按w保存该请求到本地,名称记录为searchReq。 mitmdump -dd -znc searchReq

3. replay 检索请求页

https://s.m.taobao.com/search?eventsubmitdonewsearchauction=1&inputcharset=utf-8&topSearch=1&atype=b&searchfrom=1&action=home%3Aredirectapp_action&from=1&q=%E6%B3%B3%E8%A1%A3%E5%A5%B3&sst=1&n=20&buying=buyitnow&m=api4h5&abtest=9&wlsort=9&page=1

这个是非常简单get请求,幸运的是淘宝的后台即没有做参数的签名,也没有加时间戳来防replay attack,所以我们只要替换掉q=xxx和page=xxx这两个参数就好(from貌似没啥用)。

仿照之前爬知乎脚本的例子,简单的替换脚本replace_search.py如下:

 

然后写一个shell脚本 spider.sh ,用于一键检索内容并替换,获取到所有的商品ID和卖家ID

 

团单ID和卖家ID搞定!接下来开始替换和回放评论页,抓图片

4.replay 评论页

评论页参数比检索页还简单,如下:

https://rate.tmall.com/listdetailrate.htm?itemId=43385690954&sellerId=2265790937&order=3&append=0&content=0&currentPage=1&pageSize=10&tagId=&ksTS=1482037387314687&callback=jsonp688

所以我们只要替换掉itemId、sellerId 以及 currentPage 即可。

调换脚本replace_comment.py如下:

 

修改一键抓取脚本spider.sh 如下:

 

提取图片URL并下载

所有的请求都回放并保存后,只需要将返回结果的中图片url提取出来,然后wget即可,一句简单的命令:

 

大功告成!!!

后记

小工具之所以能成功,就像爬取知乎图片的作者说的: server端也没有针对replay attack做任何防范。即使上了https,也要做多做一层加密保护。端上需要做ssl pinning,防止通过中间人攻击分析请求

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注