python使用requests爬取淘宝搜索页数据

前一段时间负责爬取淘宝的一些商品信息,本来接到爬取淘宝的任务的时候,下意识的就想用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

有接口就什么都好说,这个接口里面决定数据的参数只有三个:

  1. _ksTS:时间戳 + “ _” + “一个数字(三位数或者四位数)”
  2. callback:_ksTS后面数字加1
  3. q:搜索关键词
  4. data-value:(页码 -1)*44

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,就不贴出来了。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值