php爬取flash数据,爬虫爬取flash网站数据

本文介绍了一种通过Python爬取Flash网站数据的技巧,利用GitHub上的代码示例,展示了如何针对中国农业信息网的一个特定页面进行数据抓取。通过分析请求包和响应,使用pyamf库来编码和解码AMF协议,实现对Flex应用程序的数据获取。爬取过程包括构造RemotingMessage,设置请求参数,以及解析返回的AMF数据。
摘要由CSDN通过智能技术生成

一直纠结如何爬取flash网站,偶尔在 github上看到了爬取的方法。有兴趣可以研究下。

网站:中国农业信息网

请求包分析

Chales抓包截图

请求

339c90c8a493?from=singlemessage

image

响应

339c90c8a493?from=singlemessage

image

代码如下

# coding: utf-8

# agri.gov.cn_amf_client.py

# http://jgsb.agri.gov.cn/flexapps/hqApp.swf数据抓取

# http://jgsb.agri.cn/controller?SERVICE_ID=REGISTRY_JCSJ_MRHQ_SHOW_SERVICE&recordperpage=15&newsearch=true&login_result_sign=nologin

import urllib

import urllib2

from urllib2 import Request

import uuid

import pyamf

import json,datetime

from pyamf import remoting

from pyamf.flex import messaging

class HqPara:

def __init__(self):

self.marketInfo = None

self.breedInfoDl = None

self.breedInfo = None

self.provice = None

# registerClassAlias("personTypeAlias", Person);

# 注册自定义的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)

# 第一个是查询参数,第二个是页数,第三个是控制每页显示的数量(默认每页只显示15条)但爬取的时候可以一下子设置成全部的数量

# 构造请求数据

def getRequestData(page_num,total_num):

msg.body = [HqPara(),str(page_num), str(total_num)]

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 getResponse(data):

url = 'http://jgsb.agri.cn/messagebroker/amf'

req = Request(url, data, headers={'Content-Type': 'application/x-amf'})

# 解析返回数据

opener = urllib2.build_opener()

return opener.open(req).read()

def getContent(response):

amf_parse_info = remoting.decode(response)

# 数据总条数

total_num = amf_parse_info.bodies[0][1].body.body[3]

info = amf_parse_info.bodies[0][1].body.body[0]

print info

return total_num, info

def store2json(info):

res = []

for record in info:

record['reportDate'] = record['reportDate'].strftime('%Y-%m-%d %H:%M:%S')

record['auditDate'] = record['auditDate'].strftime('%Y-%m-%d %H:%M:%S')

res.append(record)

fp = open('info.json','w')

json.dump(res,fp,indent=4)

fp.close()

# 获取数据量

reqData = getRequestData(1,2)

rep = getResponse(reqData)

total_num,info = getContent(rep)

# 一次请求完成

reqData = getRequestData(1,total_num)

rep = getResponse(reqData)

total_num,info = getContent(rep)

print info

for record in info:

print record

store2json(info)

要使用PHP编写爬虫爬取整个网页的数据,你可以按照以下步骤进行操作: 1. 使用PHP的cURL库或者file_get_contents()函数发送HTTP请求,获取目标网页的HTML内容。你需要提供目标网页的URL作为请求的参数。 示例使用cURL库发送GET请求的代码: ```php $url = "https://example.com"; // 目标网页的URL $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); curl_close($curl); // 检查请求是否成功 if ($response === false) { // 请求失败的处理逻辑 } else { // 请求成功,$response 变量中存储了目标网页的HTML内容 } ``` 2. 解析HTML内容。你可以使用PHP的内置函数或者第三方库(例如SimpleHTMLDom)来解析HTML,并提取你感兴趣的数据。这可能涉及到使用DOM操作来遍历HTML元素、查找特定的标签或属性。 示例使用SimpleHTMLDom库解析HTML内容的代码: ```php // 假设已经获取到了目标网页的HTML内容存储在$response变量中 // 使用SimpleHTMLDom库加载HTML内容 require('simple_html_dom.php'); $html = str_get_html($response); // 通过CSS选择器查找并提取需要的数据 $elements = $html->find('.class-name'); // 使用CSS类名选择器查找元素 foreach ($elements as $element) { // 处理提取到的元素数据 echo $element->plaintext; // 输出元素文本内容 } ``` 3. 递归爬取(可选)。如果你需要爬取整个网站,而不仅仅是单个页面,可以通过解析页面中的链接,并对链接进行递归处理来实现。可以使用正则表达式或者解析HTML的方式来提取链接。 这是一个基本的示例,演示了如何使用PHP爬取网页数据。根据具体的需求和网页结构,你可能需要进行更多的定制和处理。请注意,在编写爬虫时要遵守网站爬虫规则和法律法规,以确保合法和合规的爬取行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值