Python爬虫实战(十三)Post请求中Payload处理分析—以某素材分享网为例

前情回顾:知网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)

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值