批量查询船舶定位及航线
发布于 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)
的函数,可以根据船名获取到网站上的信息。
![](https://weixin.aisoutu.com/cunchu4/4/2021-09-15/4_16316363874132001.png)
需要注意的是,读者如果要使用代码,可能需要修改下cookie
值(浏览器中按F12,找到这个值)
![](https://weixin.aisoutu.com/cunchu4/4/2021-09-15/4_16316371187412002.png)
批量获取
如果我们有公司所有船舶名称的表,就可以读取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 我们将第一时间删除。
相关素材