基于Python實現(xiàn)船舶的MMSI的獲取(推薦)
目的
工作中遇到一個需求,通過需要通過網(wǎng)站查詢船舶名稱得到MMSI碼,網(wǎng)站來自船訊網(wǎng)。

分析請求
根據(jù)以往爬蟲的經(jīng)驗,打開F12,通過輸入船舶名稱,觀察發(fā)送的請求,發(fā)現(xiàn)返回數(shù)據(jù)的網(wǎng)址

本身網(wǎng)址是一個get請求,直接用這個網(wǎng)址請求,也能返回數(shù)據(jù),即網(wǎng)址本身并沒有加密,這就簡單許多,直接通過改變參數(shù),就能實現(xiàn)數(shù)據(jù)的獲取,馬上開始動手

編寫代碼
代碼中,通過request發(fā)送請求,為了不給服務(wù)器造成太大壓力,每隔0.5秒發(fā)送一個請求,因為會出現(xiàn)查詢不到的情況,通過exception判斷,數(shù)據(jù)結(jié)果一是通過pandas中的to_excel存為excel文件,或者是直接通過pymysql入數(shù)據(jù)庫,為了提高入庫的速度,采用一次拼接三百條的方式入庫
import requests
import os
import time
import pymysql
import pandas as pd
import re
'''
author:shikailiang
function:通過讀取船舶數(shù)據(jù),分別請求拿到j(luò)son數(shù)據(jù)入庫
'''
#定義入庫的類
class company_ship_in_database:
def __init__(self):
self.conn = pymysql.connect(host="192.168.1.222", user="root", password="Cjh#Sjzx@", database="test", charset="utf8")
self.cursor = self.conn.cursor()
#獲取當前文件的父級地址
self.last_path = os.path.abspath(os.path.dirname(os.getcwd()))
#寫入mysql
def in_database(self,data_list):
#j用來對數(shù)據(jù)進行計數(shù)
j=1
#定義sql
sql = ""
#定義sql頭
sql0 = "insert into bms_company_ship_test(oc_name,ship_name,mmsi) values"
rowcount=len(data_list)
for i in data_list:
#定義拼接sql
sql2 = (("(" + "'{}'," * 3)[:-1] + ")").format(i[1][0],i[1][1],i[0])
sql = sql + "," + sql2
# print(sql0 + sql[1:])
if divmod(j, 300)[1] == 0 or j == rowcount:
#如果執(zhí)行錯誤回滾當前事務(wù)
# print(sql0 + sql[1:])
try:
self.cursor.execute(sql0 + sql[1:])
except:
#執(zhí)行錯誤,回滾事務(wù)
self.conn.rollback()
continue
sql= ""
self.conn.commit()
j=j+1
#通過pandas寫入excel
def in_xls(self, data_list):
df=pd.DataFrame(data_list)
#通過pandas實現(xiàn)存為excel
df.to_excel(self.last_path + r"\data\result.xls",header=False,index=False)
#請求船的方法
def company_ship_in_database(self):
data_path = self.last_path + r"\data"
file=open(data_path + "\company.txt")
data=[]
j = 0
for i in file.readlines():
#將船公司和船舶名稱分開
chuan=i.strip().split()
dic={
'f':'auto',
'kw':chuan[1]
}
rq=requests.get("http://searchv3.shipxy.com/shipdata/search3.ashx",params=dic)
#判斷是否請求成功
if rq.status_code==200:
try:
result_json=rq.json()
result=result_json['ship'][0]
#判斷船舶數(shù)字部分是否相同
if re.search('\d+',result['n']).group()==re.search('\d+',chuan[1]).group():
result=result['m']
data.append([result,chuan])
else:
data.append(["", chuan])
except:
data.append(["",chuan])
else:
print(chuan + "請求錯誤")
time.sleep(0.5)
j = j + 1
if divmod(j,100)[1] == 0:
print("已經(jīng)請求" + str(j) + "條")
# if j > 10:
# self.in_xls(data)
# break
self.in_database(data)
if __name__=="__main__":
company_ship=company_ship_in_database()
company_ship.company_ship_in_database()
尾記
寫程序的過程中其實有發(fā)現(xiàn)一個問題,即我們請求的其實是輸入文字時候自動發(fā)送的請求,其實有一個問題,如果我們需要查詢的是"華為5"的船,但是如果系統(tǒng)中沒有這個船,就是返回"華為548"扽船,所以在代碼中需要做一個判斷
即用正則提取出船的數(shù)字,然后和返回的船的數(shù)字進行比對,如果一致,即為同一條船舶

總結(jié)
以上所述是小編給大家介紹的基于Python實現(xiàn)船舶的MMSI的獲取,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
pygame開發(fā):馬賽邏輯小游戲的代碼實現(xiàn)
這篇文章主要介紹了pygame開發(fā),通過本文,您可以使用pygame開發(fā)一個馬賽邏輯小游戲~有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
python PrettyTable模塊的安裝與簡單應(yīng)用
prettyTable 是一款很簡潔但是功能強大的第三方模塊,主要是將輸入的數(shù)據(jù)轉(zhuǎn)化為格式化的形式來輸出,這篇文章主要介紹了python PrettyTable模塊的安裝與簡單應(yīng)用,感興趣的小伙伴們可以參考一下2019-01-01
python將四元數(shù)變換為旋轉(zhuǎn)矩陣的實例
今天小編就為大家分享一篇python將四元數(shù)變換為旋轉(zhuǎn)矩陣的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python 使用uiautomator2連接手機設(shè)備的實現(xiàn)
這篇文章主要介紹了python 使用uiautomator2連接手機設(shè)備的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04
關(guān)于Pytorch的MLP模塊實現(xiàn)方式
今天小編就為大家分享一篇關(guān)于Pytorch的MLP模塊實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
python自動化測試selenium執(zhí)行js腳本實現(xiàn)示例
這篇文章主要為大家介紹了python自動化測試selenium執(zhí)行js腳本的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11
python 尋找優(yōu)化使成本函數(shù)最小的最優(yōu)解的方法
這篇文章主要介紹了python 尋找優(yōu)化使成本函數(shù)最小的最優(yōu)解的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
Python實現(xiàn)圖數(shù)據(jù)處理的完整指南
圖是一種非常重要的數(shù)據(jù)結(jié)構(gòu),在Python中,我們可以使用鄰接矩陣來表示圖,這篇文章主要為大家介紹了Python實現(xiàn)圖數(shù)據(jù)處理的相關(guān)知識,需要的可以參考下2024-04-04

