基於Python實現船舶的MMSI的獲取(推薦)
阿新 • • 發佈:2020-01-09
目的
工作中遇到一個需求,通過需要通過網站查詢船舶名稱得到MMSI碼,網站來自船訊網。
分析請求
根據以往爬蟲的經驗,開啟F12,通過輸入船舶名稱,觀察傳送的請求,發現返回資料的網址
本身網址是一個get請求,直接用這個網址請求,也能返回資料,即網址本身並沒有加密,這就簡單許多,直接通過改變引數,就能實現資料的獲取,馬上開始動手
編寫程式碼
程式碼中,通過request傳送請求,為了不給伺服器造成太大壓力,每隔0.5秒傳送一個請求,因為會出現查詢不到的情況,通過exception判斷,資料結果一是通過pandas中的to_excel存為excel檔案,或者是直接通過pymysql入資料庫,為了提高入庫的速度,採用一次拼接三百條的方式入庫
import requests import os import time import pymysql import pandas as pd import re ''' author:shikailiang function:通過讀取船舶資料,分別請求拿到json資料入庫 ''' #定義入庫的類 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用來對資料進行計數 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: #如果執行錯誤回滾當前事務 # print(sql0 + sql[1:]) try: self.cursor.execute(sql0 + sql[1:]) except: #執行錯誤,回滾事務 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實現存為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] #判斷船舶數字部分是否相同 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("已經請求" + 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()
尾記
寫程式的過程中其實有發現一個問題,即我們請求的其實是輸入文字時候自動傳送的請求,其實有一個問題,如果我們需要查詢的是"華為5"的船,但是如果系統中沒有這個船,就是返回"華為548"扽船,所以在程式碼中需要做一個判斷
即用正則提取出船的數字,然後和返回的船的數字進行比對,如果一致,即為同一條船舶
總結
以上所述是小編給大家介紹的基於Python實現船舶的MMSI的獲取,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!