前情回顾:知网Post请求实战
在上篇博客中,我们分享了一个基础的Post请求爬虫。实际上,Post请求一般传入的都是Form data式的数据,本次分享一个Post请求为request load形式的爬虫案例~
网站地址:某素材网站
一、爬虫分析
抓取字段:标题、尺寸、大小、格式、使用量、收藏量
经过简单抓包可知,右侧红框中则包含我们所需要的信息
我们来分析它的POST请求,发现传入的数据形式是request payload
此时,如果直接传入数据字典,返回数据的是为空的,如下图所示(注意:headers中需要传入x-csrf-token字段及cookie字段)
原因在于:开发者为方便阅读,使用了JSON序列化,请求头中的【content-type: application/json】也印证了这一点
解决方法:将传入数据转为json即可,如下图所示
二、全部代码
import requests
import json
import pandas as pd
from jsonpath import jsonpath
url = 'https://www.heycan.com/api/materialInfo'
params = {"item_id_list":["7005133042142465311"],"pre_item_type":4}
def get_reponse(url,params):
headers = {
'authority': 'www.heycan.com',
'method': 'POST',
'path': '/api/materialInfo',
'scheme': 'https',
'content-type': 'application/json',
'origin': 'https://www.heycan.com',
'referer': 'https://www.heycan.com/materialDetail?item_id=7005133042142465311&from=personal_page&width=720&height=1280',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'cookie': 'csrfToken=abalGrijwUtgehoA6ShdrPCD; s_v_web_id=verify_kuaurt73_zXaCAqEj_pEpR_4OQv_9D9Q_0YK9xKCKaiMB; MONITOR_WEB_ID=cd5c4073-b5b1-4fd7-8c46-c6252bbaa7dc',
'x-csrf-token': 'abalGrijwUtgehoA6ShdrPCD'
}
r = requests.post(url,headers=headers,data=json.dumps(params))
json_data = json.loads(r.text)
return json_data
def parse_inf(json_data):
title = jsonpath(json_data,'$..item_list[*].common_data.title')
width = jsonpath(json_data,'$..item_list[*].common_data.icon.width')
height = jsonpath(json_data,'$..item_list[*].common_data.icon.height')
favorite_num = jsonpath(json_data,'$..item_list[*].statistics.favorite_num')
usage_num = jsonpath(json_data,'$..item_list[*].statistics.usage_num')
video_size_type = jsonpath(json_data,'$..item_list[*].video.video_size_type')
inf_data = pd.DataFrame({
'title':title,
'width':width,
'height':height,
'favorite_num':favorite_num,
'usage_num':usage_num,
'video_size_type':video_size_type
})
return inf_data
json_data = get_reponse(url,params)
parse_inf(json_data)