python 爬取全国农产品批发指数网站 charles 抓取 flash 数据包 分析数据包数据

python 爬取全国农产品批发指数网站

charles 抓取 flash 数据包  分析数据包数据

amf 数据请求与返回格式  flash 数据

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import uuid
import pyamf
import datetime
from pyamf import remoting
from pyamf.flex import messaging
import pandas as pd


# charles 抓取 flash 数据包  分析数据包数据
class HqPara:
    def __init__(self):
        self.marketInfo = None
        self.breedInfoDl = None
        self.breedInfo = None
        self.province = None


# 注册自定义的Body参数类型,这样数据类型com.itown.kas.pfsc.report.po.HqPara就会在后面被一并发给服务端
# 否则服务端就可能返回参数不是预期的异常Client.Message.Deserialize.InvalidType
pyamf.register_class(HqPara, alias='com.itown.kas.pfsc.report.po.HqPara')

# 构造flex.messaging.messages.RemotingMessage消息
msg = messaging.RemotingMessage(messageId=str(uuid.uuid1()).upper(),
                                clientId=str(uuid.uuid1()).upper(),
                                operation='getHqSearchData',
                                destination='reportStatService',
                                timeToLive=0,
                                timestamp=0)


# https://blog.csdn.net/imiser2016/article/details/79231783   推荐参考博客
# 第一个是查询参数 第二个是页数 第三个是控制每页显示的数量(默认每页只显示15条)但爬取的时候可以一下子设置成全部的数量 构造请求数据
def get_request_data(page_num, total):
    msg.body = [HqPara(), str(page_num), str(total)]
    msg.headers['DSEndpoint'] = None
    msg.headers['DSId'] = str(uuid.uuid1()).upper()
    # 按AMF协议编码数据
    req = remoting.Request('null', body=(msg,))
    env = remoting.Envelope(amfVersion=pyamf.AMF3)
    env.bodies = [('/1', req)]
    data = bytes(remoting.encode(env).read())
    return data


# 返回一个请求的数据格式
def get_response(data):
    url = 'http://jgsb.agri.cn/messagebroker/amf'
    res = requests.post(url, data, headers={'Content-Type': 'application/x-amf'})
    return res.content


def get_content(response):
    amf_parse_info = remoting.decode(response)
    # 数据总条数
    total = amf_parse_info.bodies[0][1].body.body[3]
    info = amf_parse_info.bodies[0][1].body.body[0]
    return total, info


def store2df(info):
    df = pd.DataFrame(info)
    df.to_csv(datetime.datetime.now().strftime('%Y-%m-%d') + '全国农产品指数的抓取.csv', index=0, encoding='utf-8')


def job():
    total_num, info = get_content(get_response(get_request_data(1, 15)))
    num, data = get_content(get_response(get_request_data(1, total_num)))
    store2df(data)


if __name__ == '__main__':
    job()

 完整代码下载:https://github.com/tanjunchen/SpiderProject/tree/master/agriculture 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方的飞猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值