基于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使用itchat实现手机控制电脑
Feb 22 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
python基础知识(一)变量与简单数据类型详解
Apr 17 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
python超时重新请求解决方案
Oct 21 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
浅析python标准库中的glob
Mar 13 Python
Python描述符descriptor使用原理解析
Mar 21 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 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函数
2006/10/09 PHP
用session做客户验证时的注意事项
2006/10/09 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
php中namespace及use用法分析
2016/12/06 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
js函数般调用正则
2008/04/08 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
javascript的this关键字详解
2019/05/20 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
python连接PostgreSQL过程解析
2020/02/09 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
师范毕业生自我鉴定
2014/01/15 职场文书
长城的导游词
2015/01/30 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python