基于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写的图片蜘蛛人代码
Aug 27 Python
5种Python单例模式的实现方式
Jan 14 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
Android分包MultiDex策略详解
Oct 30 Python
python3.x实现base64加密和解密
Mar 28 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
一行python实现树形结构的方法
Aug 09 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
python django 原生sql 获取数据的例子
Aug 14 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 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
星际中的相关伤害
2020/03/04 星际争霸
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
python每天定时运行某程序代码
2019/08/16 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
业务经理岗位职责
2013/11/11 职场文书
股份转让协议书
2014/04/12 职场文书
买卖车协议书
2014/04/21 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
2014年车间工作总结
2014/11/21 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
民主生活会主持词
2015/07/01 职场文书
新员工入职感想
2015/08/07 职场文书