绕过淘宝反爬虫,爬取店铺信息和宝贝信息

需求是利用爬虫抓取店铺所有商品并下载商品详细页所有图片,随机挑选店铺链接分析。

但是在实现的过程中遇到各种困难,用selenium,requests利用多种方式都没有绕过。最后使用淘宝开发者API来实现调取店铺所有宝贝列表,但是API是付费的,所以在详细页使用requests来实现,但是requests仅在抓取天猫商品的时候没问题,而且我在天猫的详细页面抓取的时候使用手机页面抓取。如:

手机页面:https://detail.m.tmall.com/item.htm?spm=a320p.7692363.0.0.12dbc423E7Y7NI&id=584463158898&skuId=3978229704791

天猫店铺所有宝贝清单,也可以用爬虫实现,以此店铺链接为例:

https://lego.m.tmall.com/shop/shop_auction_search.do?spm=a222m.7628550.1998338745.1&sort=s&p=2&page_size=12&from=h5&shop_id=69029026&ajson=1&_tm_source=tmallsearch&callback=jsonp_36285523

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

所以天猫店铺的爬虫实现已经不是问题,代码也简单。

1     def get_tmall_taobao_detail(self,iid,category):
 2         if category == "tmall":
 3             url = "https://detail.m.tmall.com/item.htm?id=%s" % (str(iid))
 4             response = requests.get(url)
 5             data = response.content.decode('gbk')
 6             re_img_url = re.compile('(https://img.alicdn.com.*?jpg)" src=\"data:image/')
 7             alicdn_jpg_list = re_img_url.findall(data)
 8             re_title = re.compile(' (.*)')
 9             title = re_title.findall(data)[0].replace(".", "-").replace(".", "-")
10             if os.path.isdir("%s%s" % (self.image_path, title)):
11                 pass
12             else:
13                 os.mkdir("%s%s" % (self.image_path, title))
14                 sum = 1
15                 for img in alicdn_jpg_list:
16                     jpgname = "详细页%s.jpg" %(sum)
17                     self.urllib_download(img, title, jpgname)
18                     sum = sum + 1

现在问题主要在C店的爬取,C店不管是店铺信息还是宝贝信息,数据爬取都比较困难。在分析过程中,所有页面都使用手机终端的请求头来访问,并分析相关js和json文件。

找到数据的关键链接

https://h5api.m.taobao.com/h5/mtop.user.getusersimple/1.0/?jsv=2.5.1&appKey=12574478&t=1599644502338&sign=3567a12e8b3dde1110a6d482d6382481&api=mtop.user.getUserSimple&v=1.0&H5Request=true&preventFallback=true&type=jsonp&dataType=jsonp&callback=mtopjsonp3&data=%7B%22isSec%22%3A0%7D

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

链接在response中看到宝贝的id、title、店铺宝贝数量等信息,但是链接有时效性。

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

而且C店详细页的数据也是一样,只要突破这个请求,就能实现整个爬虫,分析URL参数。

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

经过多次对比分析得到appkey是固定的,t是实时时间戳,sign这个需要计算得到,data中包含了关键参数page,shopid,sellerid,所以只要计算sign就可以构建整个url。

在js文件中找到相关计算代码,其中i是时间戳,g是appkey,c.data是data,d.token需要再寻找

可以看到j需要通过把参数带入h()函数进行计算返回,j就是sign。sign计算参数只有token未知。

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

而token来源于cookie中_m_h5_tk前半部分。

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

现在h()函数中的参数都齐了,单独摘出h()函数带入参数计算比对,验证最后计算与实际sign一致,并且发现这段代码实际就是md5的计算。

那么组合各个参数就可以得到sign,然后重组URL就能得到合法请求。

绕过淘宝反爬虫,爬取店铺信息和宝贝信息
sign_data = self.cookies_m_h5_tk_split + "&" + self.t_now + "&" + self.appkey + "&" + self.get_data
self.sign_md5 = hashlib.md5(sign_data.encode(encoding='UTF-8')).hexdigest()

但是,sign会有时间周期,还需要在下一次提示”令牌过期”后重新获取cookie中的token,然后重新计算sign来提交第二次请求,实现爬虫,所有宝贝的列表代码实现如下,同理再实现详细页爬虫部分。

undefined

class Get_taobao_detail:    def __init__(self):        self.cookies_m_h5_tk_split = ""        self.appkey = "12574478"        self.get_data = ''        self.headers = {            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"        }        self.cookies = "你的cookie"        self.cookies_dict = {}        for i in self.cookies.split("; "):            self.cookies_dict[i.split("=")[0]] = i.split("=")[1]        self.page_number = 0        self.image_path = "./image/"        self.iid_list = []        self.t_now = str(int(round(time.time() * 1000)))        self.sign_md5 = ""    def response_m_taobao_list(self,shopid,userid,page_number_i):        self.get_data = '{"m":"shopitemsearch","vm":"nw","sversion":"4.6","shopId":"%s","sellerId":"%s","style":"wf","page":%s,"sort":"_coefp","catmap":"","wirelessShopCategoryList":""}' % (shopid,userid,page_number_i)        def get_sign_md5():            sign_data = self.cookies_m_h5_tk_split + "&" + self.t_now + "&" + self.appkey + "&" + self.get_data            self.sign_md5 = hashlib.md5(sign_data.encode(encoding='UTF-8')).hexdigest()            url = "https://h5api.m.taobao.com/h5/mtop.taobao.wsearch.appsearch/1.0/?jsv=2.5.1&appKey=%s&t=%s&sign=%s&api=mtop.taobao.wsearch.appSearch&v=1.0&H5Request=true&AntiCreep=true&type=jsonp&timeout=3000&dataType=jsonp&callback=mtopjsonp8&data=%s" % (                self.appkey, self.t_now, self.sign_md5,self.get_data)            response = requests.get(url, headers=self.headers, cookies=self.cookies_dict)            page_data = response.content.decode('utf-8')            new_cookies = requests.utils.dict_from_cookiejar(response.cookies)            page_number_re = re.compile('pageSize":"(\d+)')            page_number = page_number_re.findall(page_data)            if page_number != []:                self.page_number = int(page_number[0])            return new_cookies, page_data        cookies_pagedata = get_sign_md5()        new_cookies = cookies_pagedata[0]        page_data = cookies_pagedata[1]        if "令牌过期" not in page_data:            return self._re_get_iid(page_data,"taobao")        else:            self.cookies_m_h5_tk_split = new_cookies["_m_h5_tk"].split("_")[0]            self.cookies_dict['_m_h5_tk'] = new_cookies["_m_h5_tk"]            self.cookies_dict['_m_h5_tk_enc'] = new_cookies["_m_h5_tk_enc"]            self.response_m_taobao_list(shopid,userid,page_number_i)

最后效果,可爬取天猫淘宝所有内容:

绕过淘宝反爬虫,爬取店铺信息和宝贝信息

Original: https://www.cnblogs.com/vpandaxjl/p/13640433.html
Author: 功夫小熊猫
Title: 绕过淘宝反爬虫,爬取店铺信息和宝贝信息

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571702/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java 动态代理

    一:动态代理: 1.JDK动态代理(接口方式) 介绍:使用java反射包中的类和接口实现动态代理的功能,反射包:java.lang.reflect,里面有三个类:Invocatio…

    Java 2023年6月5日
    093
  • Visual Studio Code的拉取和推送

    posted @2021-08-10 16:06 独莫城 阅读(158 ) 评论() 编辑 Original: https://www.cnblogs.com/dumocheng/…

    Java 2023年6月7日
    0108
  • Dubbo面试大纲

    本篇文章不是进行详细的Dubbo实现以及原理分析的文章,适用于用过Dubbo,对Dubbo有一定了解准备面试的小伙伴阅读。下面列的一些点,如果能在面试时候说到,那面试官肯定觉得不错…

    Java 2023年6月7日
    097
  • WIN7下命令行修改注册表提示拒绝访问的解决

    win7系统的注册表是系统的关键功能之一,一般人不会去修改,在用户使用系统中,如果需要修改注册表却遇到提示拒绝访问要怎么办? 在运行中输入cmd,打开命令行窗口,输入如下测试代码,…

    Java 2023年5月30日
    096
  • Prim算法(三)之 Java详解

    普里姆(Prim)算法,是用来求加权连通图的最小生成树的算法。 基本思想对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放…

    Java 2023年5月29日
    069
  • 使用jhipster 加速java web开发

    jhipster,中文释义: Java 热爱者! JHipster is a development platform to quickly generate, develop, …

    Java 2023年5月29日
    079
  • 在IntelliJ IDEA中创建和运行java/scala/spark程序

    本文将分两部分来介绍如何在IntelliJ IDEA中运行Java/Scala/Spark程序: 基本概念介绍 在IntelliJ IDEA中创建和运行java/scala/spa…

    Java 2023年6月13日
    080
  • 如何正确的中断线程?你的姿势是否正确

    Java停止线程的逻辑(协同、通知) 在Java程序中,我们想要停止一个线程可以通过interrupt方法进行停止。但是当我们调用interrupt方法之后,它可能并不会立刻就会停…

    Java 2023年6月5日
    075
  • java基础篇 —— 方法重载和方法重写有什么区别

    方法重载和方法重写有的区别 1 、定义不同:重载是定义相同的方法名、参数不同,重写是子类重写父类的方法 2 、范围不同:重载是在一个类中,重写是子类与父类之间的 3 、多态不同:重…

    Java 2023年6月5日
    072
  • Java 函数式编程「一」

    由 JS 转 Java,写惯了 React,习惯了函数式,因此转 Java 时也是先学函数式。 语法糖「Syntactic Sugar」 起初,Java 的函数式看起来是匿名类的一…

    Java 2023年6月16日
    096
  • MySQL十六:36张图理解Buffer Pool

    转载~ 在应用系统中,我们为加速数据访问,会把高频的数据放在 「缓存」(Redis、MongoDB)里,减轻数据库的压力。 在操作系统中,为了减少磁盘IO,引入了 「缓冲池」(bu…

    Java 2023年6月8日
    090
  • springboot1.5.4 log4j

    resources下面添加: log4j.properties: # log4j.rootCategory=INFO, stdout, file, errorfile log4j….

    Java 2023年5月30日
    0123
  • 微信扫码登录

    微信扫码登录 1. 使用背景 如今开发业务系统,已不是一个单独的系统。往往需要同多个不同系统相互调用,甚至有时还需要跟微信,钉钉,飞书这样平台对接。目前我开发的部分业务系统,已经完…

    Java 2023年6月13日
    0252
  • Vue 两个字段联合校验典型例子–修改密码

    1、前言 本文是前文《Vue Element-ui表单校验规则,你掌握了哪些?》针对多字段联合校验的典型应用。 在修改密码时,一般需要确认两次密码一致,涉及2个属性字段。类似的涉及…

    Java 2023年6月14日
    0101
  • The One

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/stupidxixi/p/9444380.htmlAut…

    Java 2023年6月5日
    083
  • 验证token

    去测试登陆时,请求头一定要带token(authorization)信息,不然401错误。 Original: https://www.cnblogs.com/145Mirro-r…

    Java 2023年6月6日
    0114
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球