亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Python實現船舶的MMSI的獲取(推薦)

發布時間:2020-10-14 08:29:55 來源:腳本之家 閱讀:315 作者:沐浴清風z 欄目:開發技術

目的

工作中遇到一個需求,通過需要通過網站查詢船舶名稱得到MMSI碼,網站來自船訊網。

基于Python實現船舶的MMSI的獲取(推薦)

分析請求

根據以往爬蟲的經驗,打開F12,通過輸入船舶名稱,觀察發送的請求,發現返回數據的網址

基于Python實現船舶的MMSI的獲取(推薦) 基于Python實現船舶的MMSI的獲取(推薦)

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

基于Python實現船舶的MMSI的獲取(推薦)

編寫代碼

代碼中,通過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/search4.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的獲取(推薦) 

即用正則提取出船的數字,然后和返回的船的數字進行比對,如果一致,即為同一條船舶

基于Python實現船舶的MMSI的獲取(推薦)

總結

以上所述是小編給大家介紹的基于Python實現船舶的MMSI的獲取,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜章县| 海林市| 阿拉善左旗| 多伦县| 定结县| 天镇县| 客服| 清镇市| 临朐县| 高要市| 庄浪县| 牟定县| 平凉市| 青阳县| 乌鲁木齐县| 哈巴河县| 东丽区| 乐清市| 盐池县| 年辖:市辖区| 固始县| 山阳县| 武邑县| 电白县| 福贡县| 施甸县| 巴青县| 手游| 五峰| 景德镇市| 泌阳县| 都江堰市| 中山市| 饶河县| 运城市| 宽城| 淮滨县| 浙江省| 中卫市| 高安市| 临城县|