【求助】船讯网爬AIS静态数据,一直显示401

本文介绍了如何使用Python编写一个名为ShipxySpider的类,通过发送HTTP请求从shipxy.com获取船舶信息,包括MMSI、类型、长度、宽度和名称。代码中处理了cookie和可能的反爬虫策略,用于抓取AIS静态数据以满足毕业论文需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import time
import pymysql
import pandas as pd
import re
import random  # 导入requests库
import csv  # 导出为csv文档
import requests
from fake_useragent import UserAgent  # 导入随机获取UA的库
import json
import pandas as pd
from shapely.geometry import Point, Polygon
import glob

mmsi_list=['413996270', '413819502', '413825696', '413778811', '413819498', '413981334', '413819516', '413981375', '413994991', '413989687', '413989650', '413989663', '413831022', '413796869', '413989674', '413989685', '413796913']

class ShipxySpider(object):
    def __init__(self):
        self.session = requests.Session()
        self.ua = UserAgent()
        Cookie = 'FD857C2AF68165D4=yhLGwCZ+CdOuTxnfKBtXqTFRLT7+2GhMO7z1sXLSKgL+Najd+uXQGG+5Io0fGQxQ; token=0d2cfcdbf57e20ff17b8b021d6586b2a; tc_TC=; _elane_shipfilter_type=%u8D27%u8239%2C%u96C6%u88C5%u7BB1%u8239%2C%u6CB9%u8F6E%2C%u5F15%u822A%u8239%2C%u62D6%u8F6E%2C%u62D6%u5F15%2C%u6E14%u8239%2C%u6355%u635E%2C%u5BA2%u8239%2C%u641C%u6551%u8239%2C%u6E2F%u53E3%u4F9B%u5E94%u8239%2C%u88C5%u6709%u9632%u6C61%u88C5%u7F6E%u548C%u8BBE%u5907%u7684%u8239%u8236%2C%u6267%u6CD5%u8247%2C%u5907%u7528-%u7528%u4E8E%u5F53%u5730%u8239%u8236%u7684%u4EFB%u52A1%u5206%u914D%2C%u5907%u7528-%u7528%u4E8E%u5F53%u5730%u8239%u8236%u7684%u4EFB%u52A1%u5206%u914D%2C%u533B%u7597%u8239%2C%u7B26%u540818%u53F7%u51B3%u8BAE%28Mob-83%29%u7684%u8239%u8236%2C%u62D6%u5F15%u5E76%u4E14%u8239%u957F%3E200m%u6216%u8239%u5BBD%3E25m%2C%u758F%u6D5A%u6216%u6C34%u4E0B%u4F5C%u4E1A%2C%u6F5C%u6C34%u4F5C%u4E1A%2C%u53C2%u4E0E%u519B%u4E8B%u884C%u52A8%2C%u5E06%u8239%u822A%u884C%2C%u6E38%u8247%2C%u5730%u6548%u5E94%u8239%2C%u9AD8%u901F%u8239%2C%u5176%u4ED6%u7C7B%u578B%u7684%u8239%u8236%2C%u5176%u4ED6; _elane_shipfilter_length=0%2C40%2C41%2C80%2C81%2C120%2C121%2C160%2C161%2C240%2C241%2C320%2C321%2C9999; _elane_shipfilter_sog=0%2C1; _elane_shipfilter_naviStatus=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C15%2C255; _elane_shipfilter_olength=; _elane_shipfilter_osog=; _elane_shipfilter_customsog=; _filter_flag=-1; _elane_shipfilter_one=2; _elane_shipfilter_country=0%2C1%2C2; tc_QX=; gdxidpyhxdE=nDMU7fmf2UqADGgUxwj%5CHv%2FnTjc%2BZTyiYxqNQ8xom2cyOSqVvO%2B7CjtaD6t31xhknUuU9%2B6fI4rDa8U0E4V56iT%2FOWtIAsdYkzdN87zLV0TfL69YRZ5yVdmgcVs7B1k06tPgMitB%2BEKmp5sP5rhkg8HJO3aaTXuWQI8KON6DgMY8ELqf%3A1712072404707; Hm_lvt_adc1d4b64be85a31d37dd5e88526cc47=1712047123,1712066221,1712110039; ASP.NET_SessionId=y4qlwqjxmvzq3jqdjir33p3a; .UserAuth2=D0B5D9179A7B0435732BBA58AC037C529D0DD57AECEBC5F591968084DC9F8B10F3D5D09DEFA427B0A905D4333DA733E04D100EFB8BD67C4E60B75A37004A8A0E101C0309AA9E68BEFB3E90042A032AEAF5F508FB816366CBC1B1FD0DE86A72BAB9DFA46401EB0FFB173AB95315BC3DDAC021774B9205F9A68DD4127BD0692C57B21931656C74C0985840DF09191ED91CB4F4C78DF972D7E77145CED109027E83EB8D81C2; UserAuthUCenter=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImtfS1JMRk9TM1dPYk9ZcUN2ZEpKS2I3ZGo1TSIsImtpZCI6ImtfS1JMRk9TM1dPYk9ZcUN2ZEpKS2I3ZGo1TSJ9.eyJpc3MiOiJodHRwOi8vaWQyLmVsYW5lLmNvbS9jb3JlIiwiYXVkIjoiaHR0cDovL2lkMi5lbGFuZS5jb20vY29yZS9yZXNvdXJjZXMiLCJleHAiOjE3MTk4ODcxNzcsIm5iZiI6MTcxMjExMTE3NywiY2xpZW50X2lkIjoiSFlRX1Jlc19BbGxJbiIsInNjb3BlIjpbIm9wZW5pZCIsInByb2ZpbGUiLCJ1c2VyYXBpIl0sInN1YiI6Ijk2NzZmOWQ3YTc5MmQ3MjkiLCJhdXRoX3RpbWUiOjE3MTIxMTExNzcsImlkcCI6Imlkc3J2IiwiYW1yIjpbInBhc3N3b3JkIl19.FDuV9RCdijGMk-nZAk_xUTcrscVwGfw_c0xqlfU0Pf2TQaXPv6YcAB_WezyAPECLxXDOrh6TUAUuk_2wj8f5_hMJTXzxikWTqAoHDhUB4V0TY_nWgT37Mzwc1QMX_mNWTm9plNTchiwAva5-D0RLeB4nj_P_PHfGwVeOIGH-nFtFNfNosrGUZUEVoQ1KU-Ob1SeY_ONXbx5FIOlpa9nYMx_uUslLjq8yDDX7TWz0n0im6URxIPk1tqZPoT4wt3J3ahkcqNphgMWsXpTNxLP0-PAAn7pIamfgNR3cvuXbd6dSxBnpzsrgpLHoIRa9BgALL3VU_8akpA00wso3jOZ9bg; Hm_lpvt_adc1d4b64be85a31d37dd5e88526cc47=1712111182; jfg=34cef8a940d65c5e3eb8adb4049a1d50; SERVERID=b8466f4910324363455fdd8cd201bb92|1712111276|1712110035'  # 请替换成你的Cookie
        self.header = {
            'User-Agent': self.ua.chrome,
            'Referer': 'http://www.shipxy.com/',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Cookie': Cookie,
            # 可能还需要其他头信息
        }


    def make_http_request(self, mmsi):
        # 发送HTTP请求获取数据
        url = f'https://www.shipxy.com/ship/GetShip?mmsi={mmsi}'
        try:
            response = self.session.get(url, headers=self.header)
            if response.status_code == 200:
                result = response.json()
                if result.get('status') == 2:
                    print(f"MMSI: {mmsi}, Message: {result.get('msg')}")
                    return None
                return result
            else:
                print(f"MMSI: {mmsi}, 请求失败,状态码: {response.status_code}")
                return None
        except Exception as e:
            print(f"MMSI: {mmsi}, HTTP请求过程中发生错误: {str(e)}")
            return None

    def process_mmsi_list(self, mmsi_list):
        all_data = []
        for mmsi in mmsi_list:
            data = self.make_http_request(int(mmsi))
            if data:
                all_data.append(data)
            # 控制请求频率以避免触发反爬虫机制
            time.sleep(0.2)
        return all_data

mmsi1=[]
type1=[]
length=[]
width=[]
name=[]

if __name__ == '__main__':
    spider = ShipxySpider()
    #mmsi_list = list(set(ship_data['mmsi'].tolist()))# 示例MMSI号列表,请替换为实际的MMSI号列表
    all_data = spider.process_mmsi_list(mmsi_list)
    for data in all_data:
        try:
            mmsi1.append(data['data'][0]['mmsi'])
            type1.append(data['data'][0]['type'])
            length.append(data['data'][0]['length']/10)
            width.append(data['data'][0]['width']/10)
            name.append(data['data'][0]['name'])
        except:
            continue
for i in all_data:
    print(i)



输出结果一直显示:401.

个人进行调整:把船讯网添加到浏览器白名单,但是还是没用。

因为做毕业论文要用到ais静态数据,所以比较着急,若有高人指点,解决此问题,重谢!

### 使用Python讯网AIS数据 为了有效地从讯网这样的特定领域网站上获取 AIS 数据,建议采用结构化的方式进行开发。考虑到目标站点可能具有复杂的前端交互逻辑以及反机制,在此之前应该先确认该网站的服务条款允许此类操作。 对于合法合规的前提下执行的任务来说,可以从以下几个方面着手准备: #### 1. 分析请求模式 通过浏览器开发者工具中的网络监视功能来观察页面加载时发出的各种HTTP请求,特别是那些返回 JSON 或 XML 格式的 API 请求。这有助于识别出用于传输实际 AIS 数据的具体接口路径及其参数构成[^2]。 #### 2. 处理动态内容加载 如果发现所需数据是由 JavaScript 动态注入到 DOM 中,则需考虑使用 Selenium WebDriver 这样的自动化测试框架模拟真实用户的浏览行为,从而触发完整的页面渲染过程并捕获最终呈现出来的全部信息[^3]。 #### 3. 尊重服务器负载与频率控制 为了避免给源站带来不必要的压力甚至被封禁 IP 地址的情况发生,在编写脚本的过程中务必加入合理的延时设置,并遵循 Robots.txt 文件所规定的访问权限范围内的资源列表来进行抓取活动。 #### 4. 利用现有库简化流程 借助 Scrapy 等成熟的 Web Scraping 库能够快速搭建起稳定高效的采集环境;而对于某些特殊场景下(比如需要处理大量异步更新的内容),也可以尝试引入 Playwright 来增强兼容性和灵活性[^4]。 下面给出一段基于 `requests` 和 `pandas` 的简单示例代码片段作为参考,假设已知某个公开可查询的 AIS 接口 URL 及其必要参数: ```python import requests import pandas as pd def fetch_ais_data(api_url, params): response = requests.get(url=api_url, params=params) if response.status_code == 200: json_result = response.json() df = pd.DataFrame(json_result['data']) return df raise Exception(f"Failed to retrieve data: {response.text}") if __name__ == "__main__": api_endpoint = 'http://example.shiptracking.com/api/vessels' query_params = { 'mmsi': 'your_target_ship_mmsi_here', 'token': 'your_api_access_token_here' # 如果有认证需求的话 } try: ais_df = fetch_ais_data(api_endpoint, query_params) output_file_path = './output/ship_positions.csv' ais_df.to_csv(output_file_path, index=False, encoding='utf-8') print(f"AIS Data successfully saved into '{output_file_path}'.") except Exception as e: print(e) ``` 请注意上述仅为示意性质的伪代码模板,具体实现细节还需根据实际情况调整完善。另外提醒一点就是一定要事先查阅清楚目标平台的相关文档资料,确保整个项目都在法律许可范围内开展。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值