前一段时间负责爬取淘宝的一些商品信息,本来接到爬取淘宝的任务的时候,下意识的就想用selenium(毕竟淘宝有点不好搞)。但是使用selenium时搜索页面也得需要登录,并且当使用selenium时不能使用本地浏览器缓存的cookie,这就有点恶心了。
但是我发现下面的接口携带的时搜索页面的数据,而且还是json数据,这就很开心了。
https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksTS=1574221181541_764&callback=jsonp765&q=搜索关键词&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20191120&ie=utf8&bcoffset=3&ntoffset=0&p4ppushleft=1%2C48
有接口就什么都好说,这个接口里面决定数据的参数只有三个:
data-value的作用就是确定页码数量的,淘宝搜索页每页是44条数据,故而data-value的值就是(页码 -1)*44。
这里面主要的还是_ksTS参数后面的那个数字,通过多次对比观察也没有发现规律,最后就干脆也不管三位或者四位数字了,就从100~1999随机选择一个整数来使用,没想到竟然可以可以使用,真开心。接口解决了,剩下的就是带着cookie开始爬取数据了。
还有一点这个接口获取的数据,要先去除头部和尾部的多余数据,然后再转成json数据才行。
头部多余数据
尾部多余数据
这些去除之后便可以转json了。
话不多说直接上代码
import requests, time, random, re, json, xlwt
import time
from lxml import etree
class TaoBao(object):
def __init__(self):
self.a = 1
self.b = 1
self.cb = random.randint(100, 1999)
self._ksTS = str(int(time.time()*1000)) + '_' + str(self.cb)
self.callback = 'jsonp' + str(self.cb + 1)
]
self.headers = {
'Referer': 'https://detail.tmall.com/item.htm?',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
'cookie':''
}
self.proxies = [
{'HTTPS':'36.250.156.249:9999'},
]
def index(self):
for x in range(1, 30):
print('正在爬取第{}页'.format(x))
url = 'https://s.taobao.com/search?data-key=s&data-value={}&ajax=true&_ksTS={}&callback={}&q=新疆一级灰枣&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=3&p4ppushleft=1%2C48'.format(str((x - 1) * 44), self._ksTS, self.callback)
response = requests.get(url, headers=self.headers, proxies=random.choice(self.proxies)).text.strip(');')
response = re.sub(r'jsonp.*?\(', '', response)
json_response = json.loads(response)
goods_list = json_response['mods']['itemlist']['data']['auctions']
for goods in goods_list:
try:
qwe = goods['icon'][0]['title']
except:
qwe = 'asdfa'
if '掌柜热卖' not in qwe:
# 价格
price = goods['view_price']
# 名称
name = goods['raw_title']
# 付款人数
try:
money_num = goods['view_sales']
except:
money_num = '没有数据'
# 店家
boss = goods['nick']
# 地点
site = goods['item_loc']
print(price, name, money_num, boss, site)
time.sleep(random.randint(5, 10))
if __name__ == '__main__':
t = TaoBao()
t.index()
代码写的不规范,大家就这样看吧,里面有些我改了改,可能会不能直接运行,调试一下改改就好了。
提示:在淘宝改之前能用,如果淘宝改规则的话,就不能使用了。(至少写博客的时候是能用的)
关于详情页的数据,我这边也写了,但是写的有点low,就不贴出来了。