资讯动态

Python实战:从船讯网Post请求到MySQL,一步步教你批量爬取船舶静态数据

发布时间:2026/8/8 5:43:59 来源:尧图企业网站定制
Python工程化爬虫实战船讯网船舶数据采集与MySQL存储全解析在航运数据分析领域船舶静态信息是构建智能物流系统的基础要素。当我们从AIS系统获得MMSI海上移动服务识别码列表后如何高效获取每艘船舶的详细属性并建立可分析的数据仓库本文将用工程化思维拆解从网络请求到数据库落地的完整技术链路特别适合需要处理大批量船舶数据的物流企业技术团队或智慧港口开发者。1. 逆向分析与请求构造船讯网的船舶详情接口采用POST方式交互这是与常见公开API不同的设计特点。我们需要先通过浏览器开发者工具F12进行网络抓包分析# 使用Chrome开发者工具观察到的关键请求特征 headers { Origin: http://www.shipxy.com, Referer: http://www.shipxy.com/ship/, Content-Type: application/x-www-form-urlencoded; charsetUTF-8 }请求参数验证时发现该接口对请求频率较为敏感。实测表明当连续请求间隔小于1秒时容易触发临时封禁。建议采用以下防护策略随机延迟在0.5-2秒区间生成随机等待时间代理池准备至少5个优质HTTP代理IP轮换异常重试对429状态码实现指数退避重试机制提示实际测试中发现接口对User-Agent校验不严格但缺失Origin头会导致403错误2. 响应数据处理与字段映射成功获取的JSON响应包含20个船舶属性字段但实际业务可能只需要核心维度。建议建立字段映射表进行数据清洗原始字段名数据库字段数据类型说明mmsimmsiCHAR(9)必须校验IMO规范imoimoCHAR(7)允许NULL值lengthlength_mDECIMAL(6,2)单位转换为米widthwidth_mDECIMAL(5,2)保留两位小数draughtdraught_mDECIMAL(4,2)吃水深度处理特殊值时需要注意空字符串应转换为NULL长度超过IMO规范的值需标记为异常经纬度坐标需要验证有效范围def clean_ship_data(raw): 数据清洗函数示例 cleaned { mmsi: str(raw.get(mmsi, )).zfill(9), length: float(raw.get(length, 0)) / 3.2808 # 英尺转米 } if not re.match(r^\d{9}$, cleaned[mmsi]): raise ValueError(fInvalid MMSI: {cleaned[mmsi]}) return cleaned3. MySQL存储优化方案面对十万级船舶数据存储需要特别注意数据库设计表结构设计要点CREATE TABLE ship_static ( id INT AUTO_INCREMENT PRIMARY KEY, mmsi CHAR(9) NOT NULL UNIQUE, imo CHAR(7), ship_name VARCHAR(100), length_m DECIMAL(6,2), width_m DECIMAL(5,2), draught_m DECIMAL(4,2), last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_mmsi (mmsi), INDEX idx_imo (imo) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;批量插入建议采用三种方案对比单条INSERT适合小批量实时更新批量INSERT推荐每500条提交一次LOAD DATA超大批量时效率最高实测性能对比10000条记录方式耗时(s)内存峰值(MB)单条提交142.385500条批量提交6.792LOAD DATA1.21054. 工程化异常处理框架构建健壮的爬虫系统需要完善的异常处理机制。建议采用分层捕获策略class ShipSpider: def request_with_retry(self, mmsi, max_retries3): for attempt in range(max_retries): try: response self.session.post( urlself.api_url, data{mmsi: mmsi}, timeout10 ) response.raise_for_status() return self.parse_response(response.json()) except requests.exceptions.RequestException as e: if attempt max_retries - 1: self.logger.error(fFailed after {max_retries} attempts: {mmsi}) raise delay (2 ** attempt) random.random() time.sleep(delay)关键异常类型处理清单网络超时自动重试并逐步增加等待时间数据解析错误记录原始响应供人工核查数据库重复转为UPDATE操作字段校验失败存入隔离表待处理5. 性能监控与日志体系完善的监控系统应该包含以下维度Prometheus监控指标示例from prometheus_client import Counter, Gauge REQUEST_COUNTER Counter( shipxy_requests_total, Total API requests, [status] ) LATENCY_GAUGE Gauge( shipxy_response_latency_seconds, API response latency )日志配置建议采用结构化日志import structlog structlog.configure( processors[ structlog.processors.JSONRenderer() ], logger_factorystructlog.WriteLoggerFactory( fileopen(ship_spider.log, a) ) )在阿里云ECS上的实测数据显示配置4核8G的实例每天可稳定采集8-10万条船舶数据。实际部署时建议使用Supervisor守护进程配置日志轮转logrotate设置每日运行时间窗口如00:00-06:00

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价