基于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使用MD5加密字符串示例
Aug 22 Python
分享一个常用的Python模拟登陆类
Mar 29 Python
Fiddler如何抓取手机APP数据包
Jan 22 Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 Python
python list格式数据excel导出方法
Oct 31 Python
python 提取key 为中文的json 串方法
Dec 31 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
python实现静态web服务器
Sep 03 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
在Python中通过threshold创建mask方式
Feb 19 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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 信息采集程序代码
2009/03/17 PHP
php print EOF实现方法
2009/05/21 PHP
浅析php学习的路线图
2013/07/10 PHP
php操作xml
2013/10/27 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
javascript打印输出json实例
2013/11/11 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
Python实现数据库编程方法详解
2015/06/09 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
司机职责范本
2014/03/08 职场文书
《秋游》教学反思
2014/04/24 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
特教教师先进事迹
2014/05/21 职场文书
个人委托书范本
2014/09/13 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书