基于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编程中函数的使用要点
Mar 20 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
使用Python对SQLite数据库操作
Apr 06 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
分享vim python缩进等一些配置
Jul 02 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
Python List cmp()知识点总结
Feb 18 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
python与mysql数据库交互的实现
Jan 06 Python
python如何处理程序无法打开
Jun 16 Python
深入了解NumPy 高级索引
Jul 24 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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中3种方法删除字符串中间的空格
2014/03/10 PHP
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
详解express + mock让前后台并行开发
2018/06/06 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
python使用cookielib库示例分享
2014/03/03 Python
用Python编写一个国际象棋AI程序
2014/11/28 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
用canvas显示验证码的实现
2020/04/10 HTML / CSS
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
如何理解transaction事务的概念
2015/05/27 面试题
会计专业个人求职信范文
2014/01/08 职场文书
成龙洗发水广告词
2014/03/14 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
初中差生评语
2014/12/29 职场文书
环保证明
2015/06/23 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
幼儿园语言教学反思
2016/02/23 职场文书