基于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 31 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
Python生成器的使用方法和示例代码
Mar 04 Python
python TF-IDF算法实现文本关键词提取
May 29 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
python中dict()的高级用法实现
Nov 13 Python
Python Django view 两种return的实现方式
Mar 16 Python
keras得到每层的系数方式
Jun 15 Python
如何使用 Flask 做一个评论系统
Nov 27 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
MySQL相关说明
2007/01/15 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
python字符串连接方式汇总
2014/08/21 Python
Python中运行并行任务技巧
2015/02/26 Python
Python命令行解析模块详解
2018/02/01 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
生产车间主管岗位职责
2013/12/28 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
MySQL 角色(role)功能介绍
2021/04/24 MySQL
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL