基于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获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
Python生成不重复随机值的方法
May 11 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
Python之用户输入的实例
Jun 22 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
python3 反射的四种基本方法解析
Aug 26 Python
OpenCV+face++实现实时人脸识别解锁功能
Aug 28 Python
python实现猜数字游戏
Mar 25 Python
基于matplotlib xticks用法详解
Apr 16 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
python 多态 协议 鸭子类型详解
Nov 27 Python
Python实现猜拳与猜数字游戏的方法详解
Apr 06 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.MVC的模板标签系统(三)
2006/09/05 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
python解析xml文件实例分享
2013/12/04 Python
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
python实现彩色图转换成灰度图
2019/01/15 Python
Python3中列表list合并的四种方法
2019/04/19 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
keras K.function获取某层的输出操作
2020/06/29 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
python 下载文件的几种方法汇总
2021/01/06 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
理货员的岗位职责
2013/11/23 职场文书
运动会广播稿150字
2014/02/19 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
Golang jwt身份认证
2022/04/20 Golang