基于Python实现船舶的MMSI的获取(推荐)


Posted in Python onOctober 21, 2019

目的

工作中遇到一个需求,通过需要通过网站查询船舶名称得到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/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"?Y船,所以在代码中需要做一个判断

基于Python实现船舶的MMSI的获取(推荐) 

即用正则提取出船的数字,然后和返回的船的数字进行比对,如果一致,即为同一条船舶

基于Python实现船舶的MMSI的获取(推荐)

总结

以上所述是小编给大家介绍的基于Python实现船舶的MMSI的获取,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
Python中join和split用法实例
Apr 14 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
python编写猜数字小游戏
Oct 06 Python
解决django model修改添加字段报错的问题
Nov 18 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
python根据字典的键来删除元素的方法
Aug 16 Python
opencv实现图像平移效果
Mar 24 Python
python中if和elif的区别介绍
Nov 07 Python
基于Python解密仿射密码
Oct 21 #Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 #Python
python超时重新请求解决方案
Oct 21 #Python
详解python中*号的用法
Oct 21 #Python
python中bytes和str类型的区别
Oct 21 #Python
python中@property和property函数常见使用方法示例
Oct 21 #Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 #Python
You might like
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
JavaScript 学习技巧
2010/02/17 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Python ljust rjust center输出
2008/09/06 Python
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python全局变量用法实例分析
2016/07/19 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
舞蹈教育学专业推荐信
2013/11/27 职场文书
校园报刊亭创业计划书
2014/01/02 职场文书
《长城》教学反思
2014/02/14 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
课题研究阶段性总结
2015/08/13 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL