首页 > 其他 > 详细

淘宝页面反爬虫突破

时间:2020-09-09 18:44:46      阅读:583      评论:0      收藏:0      [点我收藏+]

需求是利用爬虫抓取店铺所有商品并下载商品详细页所有图片。但是在实现的过程中遇到各种困难,用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( <title>(.*)</title>)
 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需要再寻找

可以看到参数带入h()函数进行计算返回sign

技术分享图片

 

 

 而token来源于cookie

 技术分享图片

 

 

 技术分享图片

 

 

 现在h()函数中的参数都齐了,单独摘除h()函数带入参数计算比对,发现实际就是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()

但是,sign会有时间周期,可以采用在下一次提示“令牌过期”后重新获取cookie,然后重新计算sign来提交。实现爬虫,所有宝贝的列表代码实现如下,同理再实现详细页爬虫部分。


class Get_taobao_detail:
def __init__(self):
self.cookies_m_h5_tk_split = "68c63a1f2d4f535061d4009523b7e261"
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)

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

技术分享图片

 

淘宝页面反爬虫突破

原文:https://www.cnblogs.com/vpandaxjl/p/13640433.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!