最近需要商家的订单信息,一直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)