基于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 相关文章推荐
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
Python之py2exe打包工具详解
Jun 14 Python
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
python如何实现单链表的反转
Feb 10 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
Python tensorflow卷积神经Inception V3网络结构
May 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
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
浅谈node的事件机制
2017/10/09 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
Python下线程之间的共享和释放示例
2015/05/04 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
Python中的全局变量如何理解
2020/06/04 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
python interpolate插值实例
2020/07/06 Python
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
八荣八耻的活动方案
2014/08/16 职场文书
职工小家建设活动方案
2014/08/25 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
浅谈python数据类型及其操作
2021/05/25 Python