基于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的Flask框架中实现简单的登录功能的教程
Apr 20 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
python读取LMDB中图像的方法
Jul 02 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
centos7之Python3.74安装教程
Aug 15 Python
python安装本地whl的实例步骤
Oct 12 Python
Python中__repr__和__str__区别详解
Nov 07 Python
python构造函数init实例方法解析
Jan 19 Python
python继承threading.Thread实现有返回值的子类实例
May 02 Python
python3中for循环踩过的坑记录
Dec 14 Python
聊聊Python中关于a=[[]]*3的反思
Jun 02 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执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
javascript getElementsByTagName
2011/01/31 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
python如何提升爬虫效率
2020/09/27 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
ajax是什么及其工作原理
2012/02/08 面试题
《九寨沟》教学反思
2014/04/08 职场文书
效能监察建议书
2014/05/19 职场文书
化学教育专业自荐信
2014/07/04 职场文书
领导欢送会主持词
2015/07/06 职场文书
安全温馨提示语大全
2015/07/14 职场文书
工作感想范文
2015/08/07 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server