基于Python實(shí)現(xiàn)船舶的MMSI的獲取(推薦)
目的
工作中遇到一個(gè)需求,通過(guò)需要通過(guò)網(wǎng)站查詢船舶名稱得到MMSI碼,網(wǎng)站來(lái)自船訊網(wǎng)。
分析請(qǐng)求
根據(jù)以往爬蟲(chóng)的經(jīng)驗(yàn),打開(kāi)F12,通過(guò)輸入船舶名稱,觀察發(fā)送的請(qǐng)求,發(fā)現(xiàn)返回?cái)?shù)據(jù)的網(wǎng)址
本身網(wǎng)址是一個(gè)get請(qǐng)求,直接用這個(gè)網(wǎng)址請(qǐng)求,也能返回?cái)?shù)據(jù),即網(wǎng)址本身并沒(méi)有加密,這就簡(jiǎn)單許多,直接通過(guò)改變參數(shù),就能實(shí)現(xiàn)數(shù)據(jù)的獲取,馬上開(kāi)始動(dòng)手
編寫(xiě)代碼
代碼中,通過(guò)request發(fā)送請(qǐng)求,為了不給服務(wù)器造成太大壓力,每隔0.5秒發(fā)送一個(gè)請(qǐng)求,因?yàn)闀?huì)出現(xiàn)查詢不到的情況,通過(guò)exception判斷,數(shù)據(jù)結(jié)果一是通過(guò)pandas中的to_excel存為excel文件,或者是直接通過(guò)pymysql入數(shù)據(jù)庫(kù),為了提高入庫(kù)的速度,采用一次拼接三百條的方式入庫(kù)
import requests import os import time import pymysql import pandas as pd import re ''' author:shikailiang function:通過(guò)讀取船舶數(shù)據(jù),分別請(qǐng)求拿到j(luò)son數(shù)據(jù)入庫(kù) ''' #定義入庫(kù)的類 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() #獲取當(dāng)前文件的父級(jí)地址 self.last_path = os.path.abspath(os.path.dirname(os.getcwd())) #寫(xiě)入mysql def in_database(self,data_list): #j用來(lái)對(duì)數(shù)據(jù)進(jìn)行計(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í)行錯(cuò)誤回滾當(dāng)前事務(wù) # print(sql0 + sql[1:]) try: self.cursor.execute(sql0 + sql[1:]) except: #執(zhí)行錯(cuò)誤,回滾事務(wù) self.conn.rollback() continue sql= "" self.conn.commit() j=j+1 #通過(guò)pandas寫(xiě)入excel def in_xls(self, data_list): df=pd.DataFrame(data_list) #通過(guò)pandas實(shí)現(xiàn)存為excel df.to_excel(self.last_path + r"\data\result.xls",header=False,index=False) #請(qǐng)求船的方法 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(): #將船公司和船舶名稱分開(kāi) chuan=i.strip().split() dic={ 'f':'auto', 'kw':chuan[1] } rq=requests.get("http://searchv3.shipxy.com/shipdata/search3.ashx",params=dic) #判斷是否請(qǐng)求成功 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 + "請(qǐng)求錯(cuò)誤") time.sleep(0.5) j = j + 1 if divmod(j,100)[1] == 0: print("已經(jīng)請(qǐ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()
尾記
寫(xiě)程序的過(guò)程中其實(shí)有發(fā)現(xiàn)一個(gè)問(wèn)題,即我們請(qǐng)求的其實(shí)是輸入文字時(shí)候自動(dòng)發(fā)送的請(qǐng)求,其實(shí)有一個(gè)問(wèn)題,如果我們需要查詢的是"華為5"的船,但是如果系統(tǒng)中沒(méi)有這個(gè)船,就是返回"華為548"扽船,所以在代碼中需要做一個(gè)判斷
即用正則提取出船的數(shù)字,然后和返回的船的數(shù)字進(jìn)行比對(duì),如果一致,即為同一條船舶
總結(jié)
以上所述是小編給大家介紹的基于Python實(shí)現(xiàn)船舶的MMSI的獲取,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
解決jupyter (python3) 讀取文件遇到的問(wèn)題
這篇文章主要介紹了解決jupyter (python3) 讀取文件遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python純代碼通過(guò)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合方式
這篇文章主要介紹了Python純代碼通過(guò)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Python簡(jiǎn)明講解filter函數(shù)的用法
本文和你一起來(lái)探索Python中的filter函數(shù),讓你以最短的時(shí)間明白這個(gè)函數(shù)的原理。也可以利用碎片化的時(shí)間鞏固這個(gè)函數(shù),讓你在處理工作過(guò)程中更高效2022-06-06Pycharm 如何連接遠(yuǎn)程服務(wù)器并debug調(diào)試
本文主要介紹了Pycharm 如何連接遠(yuǎn)程服務(wù)器并debug調(diào)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06python 數(shù)據(jù)生成excel導(dǎo)出(xlwt,wlsxwrite)代碼實(shí)例
這篇文章主要介紹了python 數(shù)據(jù)生成excel導(dǎo)出(xlwt,wlsxwrite)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python3顯式變量類型typing的實(shí)現(xiàn)
這篇文章主要介紹了python3顯式變量類型typing的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09python爬蟲(chóng)框架scrapy代理中間件掌握學(xué)習(xí)教程
這篇文章主要介紹了python爬蟲(chóng)框架scrapy代理中間件掌握學(xué)習(xí)教程,為大家說(shuō)明一下 scrapy 中代理相關(guān)知識(shí)點(diǎn),有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11