原创来自本人的公众号:阿嚏个技术
公众号文章地址: 如何打造python爬虫,以得物商品列表数据为例
文章仅限学习交流所用,禁止商业用途,如有不适,请联系作者删除。
1、爬虫思路
其实就是解决爬什么,怎么爬的问题。
爬什么好解决,一般都是看中一个网站的数据,采集到本地进行分析整理。接着就是针对需要爬的页面进行分析,页面分析的过程就是解决怎么爬的问题,包括页面请求的地址、请求的参数、返回的数据格式等,这些相关问题搞清楚了,就可以用程序模拟用户的请求去获取想要的数据。
本文通过得物微信小程序分析入手,获取品牌商品列表来获取在得物上架的商品信息。当然,得物的反爬虫技术也一直在提升,本文更多提供的实现爬虫的思路。
2、所需工具
工具主要三种。
一是数据监控分析工具,用于检测得物小程序和得物后台请求交互的监控,了解request和response的情况。采用的是Charles,看下图,主要是右边的内容,1为请求的url地址和参数,2为请求的头,3为response返回的数据,使用上比较简单,网上很多教程,不在此赘述。
二是反编译小程序
这一步的主要作用是获取签名算法,这样才能保证每次一发出得物服务器能鉴权识别的请求。首先是获取小程序在电脑上的包,在charles抓取的请求中,有一个header的参数是Referer,如下:
https://servicewechat.com/wx3c12cdad4e8b1a7b/255/page-frame.html
搜索其中“wx3c12cdad4e8b1a7b”所在目录下的255子目录,会找到一个_APP_.wxapk的文件,这个就是我们要反编译的包,我用的是mp-unpack这个工具,使用上也非常简单,把wxapk包拖到界面上就可以反编译出代码,如何根据反编译代码找到sign的方法,网上也有很多文章,就不在这里讲了,后面会直接给出代码的实现。
三是编程工具
原则上用任何一种语言都可以编爬虫,选择对应的IDE工具开发就可以,这里用python来实现,能做爬虫的一般都不陌生。
3、代码实现
首先定义请求所需的url和请求头header
brand_special_list_url = 'https://app.dewu.com/api/v1/h5/search/fire/commodity/detail_brand'
headers = {
'Host': "app.dewu.com",
'appid': "wxapp",
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat",
'Wxapp-Login-Token': '',
'appversion': "4.4.0",
'content-type': "application/json",
'platform': "h5",
'Accept-Encoding': "gzip, deflate, br",
}
其次定义接口请求函数:
def brand_list_load_more_data(lastId, brandId, sortType, sortMode=1):
'''
获取品牌列表页
:param lastId:
:param brandId:
:param sortType:1、销量,2、价格,3、新品
:param sortMode:0、升序,1、降序(对价格)或随机
:return: response text
'''
# 品牌列表页商品接口
post_data = {
'brandId': brandId,
'lastId': lastId,
'sortType': sortType,
'sortMode': sortMode,
'limit': 20,
'categoryIds': '',
'debugAgg': 'true',
'aggregation': 'true'
}
sign = getsign(post_data)
res_data = request_post(brand_special_list_url, headers=headers, data=json.dumps(post_data), is_proxy=is_proxy)
return res_data
然后是定义sign的生成函数,其实就是把请求数据排序后做md5:
def getsign(dic):
s = str()
for i in sorted(dic):
s += i + str(dic[i])
res = s + "一个定义好的常量" #具体值见本人公众号文章
h1 = hashlib.md5()
h1.update(res.encode(encoding='utf-8'))
return h1.hexdigest()
那么程序的主要核心代码就完成了,运行调用
brand_list_load_more_data(0,144,1)
表示按销量获取nike的商品列表,其中144为品牌nike的编号。执行后获取到前20个商品的数据。
至此,用python以得物为例爬取数据的过程就完成了,因为商家一直会阻止反爬行为,所以爬虫程序本身不是一成不变的,比如得物的接口地址、加签名方式、加滑动块验证(得物滑动块的验证请见本人的另一篇文章《得物采集数据出现geetest验证码的解析方式》)等,都是在不断进化中的,但是,但是,爬虫的思路基本不会变,一定要做好采集对象的技术分析。