批量查询船舶定位及航线

发布于 2021-09-15 00:07

审计一家航运公司,公司业务的开展高度依赖信息系统。

当然,我们计划对收入和成本做一些业务系统和财务系统的核对,以及对业务系统计算逻辑的一些验证工作。

不过,今天我想了想,这些都是内部数据,我们除了做这些,是不是还应该做一些和外部数据的核对工作。

比如,这条航次的船在系统里什么数据都有,但这条船究竟是不是在对应的地方?还是说待在家里没动?

前两天财审老师,发我一个可以查船舶定位的网站:

http://www.shipxy.com

只需要输入船名就可以查出船舶当前的GPS定位,目的地(要到的港口),以及预计要到的时间。

那么我是不是可以批量查出公司所有船舶当前的时点的信息,与当天系统里航次信息做对比?

动手写一个简单的爬虫

import requests
import pandas as pd
import os


def get_info(mmsi):
    url = 'http://www.shipxy.com/ship/GetShip'
    data = {
        'mmsi':mmsi
    }
    header = {
        'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.25 Safari/537.36 Edg/93.0.961.18',
        'Cookie':"FD857C2AF68165D4=VKhpAhTERJ9066miDC67kkXGOblH87dqzBNYl3heEdsf2QzsbvsnHq9Lk8hYgoQw; _elane_maptype=MT_GOOGLE; 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%u5A31%u4E50%u8239%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; _filter_flag=-1; _elane_shipfilter_one=2; _elane_shipfilter_country=0%2C1%2C2; _elane_shipfilter_olength=; tc_QX=; ASP.NET_SessionId=ecvzrj4pt5xhutup4jq01hnt; shipxy_v3_history_serch=s%u2606CHUAN%20ZHENG%20BO%201%20HAO%u2606413278150%u260690%u2606MMSI%uFF1A413278150%7Cs%u2606ZHENG%u2606413472670%u260680%u2606MMSI%uFF1A413472670; Hm_lvt_adc1d4b64be85a31d37dd5e88526cc47=1631587732,1631588208,1631588800,1631588985; Hm_lpvt_adc1d4b64be85a31d37dd5e88526cc47=1631588985; SERVERID=6462d953552c3e70030b707fb585b257|1631588985|1631587728"
    }
    response = requests.post(url,headers=header,data=data)
    json_str = response.json()
    return json_str

def get_location(name):
    url = 'http://searchv3.shipxy.com/shipdata/search3.ashx?'
    params = {
        'f':'auto',
        'kw':name
    }
    response = requests.get(url,params=params)
    json_str= response.json()
    # name = json_str['ship'][0]['n']
    mmsi = json_str['ship'][0]['m']
    json_str = get_info(mmsi)
    data = json_str['data']
    df = pd.DataFrame(data)
    df.insert(0,"sourcename",name)
    return df

if __name__ == "__main__":
    df = get_location('长城1')
    print(df)

我们构造一个get_location(name)的函数,可以根据船名获取到网站上的信息。

需要注意的是,读者如果要使用代码,可能需要修改下cookie值(浏览器中按F12,找到这个值)

批量获取

如果我们有公司所有船舶名称的表,就可以读取Excel的数据,写个循环并将查询出的数据保存到本地文件。

if __name__ == "__main__":
    df = pd.read_excel('./船名.xlsx')
    outpath = 'output.csv'
    boat_names = list(df['船名'])
    for boat_name in boat_names:
        try:
            df = get_location(boat_name)
            print(df)
            if os.path.exists(outpath):
                df.to_csv(outpath,index=False,header=False,mode='a+',encoding='utf8')
            else:
                df.to_csv(outpath,index=False,encoding='utf8')
        except:
            print('%s未查询成功' % boat_name)
            df = pd.DataFrame([[boat_name]],columns=['sourcename'])
            df.to_csv(outpath,index=False,header=False,mode='a+',encoding='utf8')

我们可以得到这个时点公司所有船舶动态。

结语

如果我们每年都审计这家公司,其实我们还可以做得更多。

比如,我直接写一个定时任务,每天自动都获取公司所有船支的信息,这个数据不就是最有力判断公司业务真实性的证据么?

审计军火库

青藤数据-审计师自己的平台

不装了,摊牌了,我是审计师

开源我写的指数估值系统

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材