python爬取淘宝数据遇见的坑

狂风中的少年 提交于 2019-12-03 02:42:06

来说说我用python爬取淘宝数据遇见的坑

学习python 一年了,总想着找个大网站来练练手,于是乎,我就把眼光放在了马云爸爸的知名大网站——淘宝。可能也是我自己作死的关系,导致淘宝不让我访问了,不但出现滑块验证码,验证码即使通过了也依然不让我访问,莫名想哭怎么办 ,呜哇~~~

下面就来讲讲我爬淘宝遇到的坑们

一、首先打开了淘宝,想爬商品的基本信息,但是不想爬详情页,就想着在搜索页找找看能不能爬,然后还真的有诶,火狐浏览器查看元素 ,刷新一下,就能找到一个json类型的响应,但是打开请求网址 ,却显示这个

然后看看原始数据,好吧,确实不是正确的json格式的数据,那我试着请求请求,看能不能得到里面的信息,结果显而易见,当然不行,不行怎么办呢,当时我看到了JSONP这个东西

然后就在想JSONP是个什么 ,还有回调是个啥,此时就得靠我们的好老师——百度啦,然后度老师是这么解释的 :

Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

我在想这样是不是和js渲染有关呢?可是那么多js文件到底是哪个呢?怪我自己才疏学浅,到这我就进行不下去了,然而我发现并不是这个问题阻挡了我,而是API,原来我发现的这个请求网址是这个样子滴

https://h5api.m.taobao.com/h5/mtop.alimama.union.sem.landing.pc.items/1.0/?jsv=2.4.0&appKey=12574478&t=1539951370299&sign=e8a8615b376cc737f9545e5cee69c25b&api=mtop.alimama.union.sem.landing.pc.items&v=1.0&AntiCreep=true&dataType=jsonp&type=jsonp&ecode=0&callback=mtopjsonp1&data={%22keyword%22:%22%E6%B0%B4%E6%9D%AF%22,%22ppath%22:%22%22,%22loc%22:%22%22,%22minPrice%22:%22%22,%22maxPrice%22:%22%22,%22ismall%22:%22%22,%22ship%22:%22%22,%22itemAssurance%22:%22%22,%22exchange7%22:%22%22,%22custAssurance%22:%22%22,%22b%22:%22%22,%22clk1%22:%2266d2d77c1852b02e17f02795c3864bdb%22,%22pvoff%22:%22%22,%22pageSize%22:%22100%22,%22page%22:%220%22,%22elemtid%22:%221%22,%22refpid%22:%22mm_26632258_3504122_32538762%22,%22pid%22:%22430673_1006%22,%22featureNames%22:%22spGoldMedal,dsrDescribe,dsrDescribeGap,dsrService,dsrServiceGap,dsrDeliver,%20dsrDeliverGap%22,%22ac%22:%22XxAhFH83H0kCATwIBPIZ9PXU%22,%22wangwangid%22:%22%22,%22catId%22:%22%22}

来,我们看看参数,时间戳都是小意思啦,可是看到appkey,顿时感觉这条路可能真的走不通了,要调用淘宝的API,我要到哪里去找到淘宝的API呢,像马云爸爸开的大公司,数据就是金钱 ,怎么会这样白白流出,不过可能会有试用???我也不知道,打算以后学学js渲染和API接口,好啦,淘宝还是要接着爬。

二、然后我接着爬,就去看看别人是怎么做的,看来好多人都爬过淘宝啊,接着我发现一个让我觉得自己很智障的事情,查看网页源代码发现我想要的信息源码里就有,在一个script 标签里叫做g_page_config的一个字典里,啊啊啊啊啊啊,真的是,好久没打开过源代码了,总是查看元素,所以最基本的就忘记了,真的是很智障啊!!!!!

那这下子就简单了,直接请求网页源代码就行了,可能我还是太天真。。。。。。。

来先看看url:

第一页:https://s.taobao.com/search?initiative_id=staobaoz_20181019&q=%E6%B0%B4%E6%9D%AF&suggest=0_1&_input_charset=utf-8&wq=shuibei&suggest_query=shuibei&source=suggest

第二页:https://s.taobao.com/search?initiative_id=staobaoz_20181019&q=%E6%B0%B4%E6%9D%AF&suggest=0_1&_input_charset=utf-8&wq=shuibei&suggest_query=shuibei&source=suggest&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44

第三页:https://s.taobao.com/search?initiative_id=staobaoz_20181019&q=%E6%B0%B4%E6%9D%AF&suggest=0_1&_input_charset=utf-8&wq=shuibei&suggest_query=shuibei&source=suggest&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88

参数里的q是搜索商品的名称,initiative_id是固定的staobaoz_加上当日日期,wqsuggest_query都是拼音,s是页数,bcoffsetntoffset我没搞清楚,但是没它俩好像无伤大雅,剩下的都是固定的。用request来请求网页源代码,得到之后用正则或者BS4都行,反正理论上都能匹配出来,为什么我说理论上呢,是因为我请求得到的源代码里就没有上面提到的有g_page_config的script标签,一开始能的到,也能匹配出来商品信息,可是后来再也没有出现过,我在想,是不是我访问淘宝次数太过频繁,所以被禁了,嗯 ,很有可能。

三、人生苦短,我学python,爬虫的学习之路上怎能容许我说放弃呢,我就换了个浏览器,依然是一里面的方法,这次是找到了完全的json格式的数据,就是把,参数有点麻烦,现在我的IP访问淘宝有些不顺利了,代码里有的url是这个样子滴

url = "https://s.taobao.com/api?_ksTS={}&callback={}&ajax=true&m=customized&stats_click=search_radio_all:1&q=花盆&s=36&imgfile=&bcoffset=0&js=1&ie=utf8&rn={}".format(ksts_str,callback_str , rn)

参数虽然麻烦点,但是网上大神多啊,这三个参数可以以以下方式得到(这三个以让我想到了撒老师的段子O(∩_∩)O哈哈~)

keyword="手表"
k="shoubiao"
t = time.localtime()
initiative_id=("staobaoz_%s%02d%02d") % (t[0], t[1], t[2])
time_stamp = int(round(time.time()*1000))
ii=str(time_stamp)[-3:]
ran_num = random.randint(100,3000)
ksts_str = str(time_stamp) + '_' +ii
callback_str = 'jsonp' + str(int(ii)+1)
rn =md5(ksts_str)
param={
'initiative_id	':initiative_id,
'q':	keyword,
'suggest_query':k,
'wq':	k,
}

一开始我访问的的时候url还是是完整的,现在变成这个样子。。。。

哎呦喂,我就想爬个淘宝,学习学习,为什么要如此对我,我可能需要请教大佬,虽然这条爬淘宝之路很坎坷,但是我还不想说放弃,加油!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!