【Python】爬取菜鸟物流管家异步加载XHR订单

最近需要商家的订单信息,一直Ctrl+c和Ctrl+v感觉就是有点儿不科学,所以就想爬一下试试。

首先得有商家的账号,巧妇难为无米之炊,还是得有账号。因为以前没有爬过,就是各种的尝试。

本来是想用selenium来模拟登录,然后一步一步的获取我想要的信息。但是,模拟登录的时候有滑块,手动操作这个滑块也不行。正常在浏览器上登录时就没有这个滑块,所以我就改用cookie来爬了。

刚开始就找了我看见的第一个document试了一下,发现只有整个页面的一小部分的信息,并没有订单的信息。

然后就想是不是异步加载XHR,找了一下发现了这样一个query返回了我想要的订单数据。每次点击下一次就会生成一个新的query。

找到链接了,下面就可以根据链接的Headers来构造post请求 。这其中最重要的就是post请求中的参数了,在Headers的最下面有一个Request Payload就是我们要的参数,点击view source我们可以看见字典格式的参数。currentPage是第几页,pageSize是每页的订单数。

程序运行一段时间就会出错,主要是因为找不到一个字段,再请求一次就好了。所以加了一个while循环,错了就重新请求。

这只是一个很粗糙的爬出,需要很多手动的地方,但是可以满足我当下的需求了。大家也可以根据自己的需求去优化。后面我访问了太多次,就出现了403的错误,IP被封了,大家也可以试一试用代理池。

下面是完整的代码:

import requests
import json
import pandas as pd
import time

url = 'https://z.cainiao.com/matrix/pkg/consign/query'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
    'Referer':'https://z.cainiao.com/matrix/pkg/consign?spm=a313w.11298609.header-nav.3.7bec15e5iHLq7U',
    'Cookie':'你的cookie',
    'origin': 'https://z.cainiao.com',
    'hcsrf': '343f5383-8502-4f77-8b90-369017b70191',
    'content-type': 'application/json',
    # 'dnt': '1'
}
info = []
### 获取每页的订单信息
def GetOrders(req, page):
    data = req.json()['dataList']
    JsonLen = len(data)
    for i in range(JsonLen):
        ### 获取下单时间
        CreateDate = data[i]['logOrderPackage']['traceDetailList'][0]['timeStr']
        OrderID = data[i]['logOrderPackage']['tradeOrderList'][0]['goodsList'][0]['tradeId']
        MainData = data[i]['logOrderPackage']['receiver']
        MainData['timeStr'] = CreateDate
        MainData['tradId'] = OrderID
        info.append(MainData)
    print('page %s done' % page, req.url)
### 1-60,100-499
start = 100
end = 500
### 翻页
def ChangePage(start,end):
    pagenum = 0
    for page in range(start,end):
        parameters = {"pageSize":10,"currentPage":page,"consignDateFrom":"2019-08-10T16:00:00.000Z","consignDateTo":"2019-09-10T15:59:59.000Z"}
        ### post请求
        req = requests.post(url=url, headers=headers, data=json.dumps(parameters))
        print(req.url)
        try:
            GetOrders(req, page)
        except:
            print(page)
            return page
        time.sleep(1)
        df = pd.DataFrame(info)
        ### 保存到csv文件里面 
        df.to_csv('./data/orders1.csv')
    return 0

res = ChangePage(start, end)
while res:
    start = res
    # time.sleep(5)
    res = ChangePage(start,end)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值