基于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的web框架中编写创建日志的程序的教程
Apr 30 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
python的pip安装以及使用教程
Sep 18 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
tensorflow mnist 数据加载实现并画图效果
Feb 05 Python
Python判断字符串是否为空和null方法实例
Apr 26 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
Python 创建守护进程的示例
Sep 29 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
PHP date函数参数详解
2006/11/27 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
php格式化json函数示例代码
2016/05/12 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
实例讲解php实现多线程
2019/01/27 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
srcElement表格样式
2006/09/03 Javascript
XENON基于JSON变种
2010/07/27 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python中的__SLOTS__属性使用示例
2015/02/18 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
幼儿园新学期寄语
2014/01/18 职场文书
解除合同协议书
2014/04/17 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
2015年路政工作总结
2015/05/22 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
Go语言 详解net的tcp服务
2022/04/14 Golang