基于Python实现船舶的MMSI的获取(推荐)

  

  

工作中遇到一个需求,通过需要通过网站查询船舶名称得到MMSI码,网站来自船讯网。

  

基于Python实现船舶的MMSI的获取(推荐)

  

  

根据以往爬虫的经验,打开F12,通过输入船舶名称,观察发送的请求,发现返回数据的网址

  

基于Python实现船舶的MMSI的获取(推荐) 基于Python实现船舶的MMSI的获取(推荐)

  

本身网址是一个得到请求,直接用这个网址请求,也能返回数据,即网址本身并没有加密,这就简单许多,直接通过改变参数,就能实现数据的获取,马上开始动手

  

基于Python实现船舶的MMSI的获取(推荐)

  

  

代码中,通过请求发送请求,为了不给服务器造成太大压力,每隔0.5秒发送一个请求,因为会出现查询不到的情况,通过例外判断,数据结果一是通过熊猫中的to_excel存为excel文件,或者是直接通过pymysql入数据库,为了提高入库的速度,采用一次拼接三百条的方式入库

        进口的要求   进口操作系统   导入的时间   进口pymysql   熊猫作为pd导入   进口再保险   “‘   作者:shikailiang   功能:通过读取船舶数据,分别请求拿到json数据入库   “‘      #定义入库的类   类company_ship_in_database:   def __init__(自我):   自我。康涅狄格州=pymysql.connect(主机=?92.168.1.222”,用户=案?密码=癈jh # Sjzx@”=安馐浴笔菘?charset=皍se utf8”)   自我。光标=self.conn.cursor ()   #获取当前文件的父级地址   自我。last_path=os.path.abspath (os.path.dirname (os.getcwd ()))   #写入mysql   def in_database(自我,data_list):   # j用来对数据进行计数   j=1   #定义sql   sql=" "   #定义sql头   sql0="插入bms_company_ship_test (oc_name、ship_name mmsi)价值观”   rowcount=len (data_list)   因为我在data_list:   #定义拼接sql   sql2=((“(”+”“{}”,“* 3) (: 1) +”)”) .format(我[1][0],[1][1],[0])   sql=sql +”、“+ sql2   #打印(sql0 + sql [1:])   如果divmod (j, 300)[1]==0或j==rowcount:   #如果执行错误回滚当前事务   #打印(sql0 + sql [1:])   试一试:   self.cursor。执行(sql0 + sql [1]):      除了:   #执行错误,回滚事务   self.conn.rollback ()   继续   sql=" "   self.conn.commit ()   j=+ 1   #通过熊猫写入excel   def in_xls(自我,data_list):   df=pd.DataFrame (data_list)   #通过熊猫实现存为excel   df.to_excel(自我。last_path + r \ data \ result.xls,头=False,指数=False)   #请求船的方法   def company_ship_in_database(自我):   data_path=自我。last_path + r“\数据”   文件=打开(data_path + " \ company.txt ")   data=https://www.yisu.com/zixun/[]   j=0   因为我在file.readlines ():   #将船公司和船舶名称分开   .split栓=i.strip () ()   dic={' f ': '汽车',   千瓦:川[1]   }   rq=requests.get (" http://searchv3.shipxy.com/shipdata/search4.ashx " params=dic)   #判断是否请求成功   如果rq.status_code==200:   试一试:   result_json=rq.json ()   结果=result_json[‘船’][0]   #判断船舶数字部分是否相同   如果re.search (\ d +,结果[' n ']) .group ()==re.search (\ d +,栓[1]).group ():   结果=结果(“m”)   data.append([因此,栓)   其他:   数据。追加([",栓))   除了:   data.append([",栓))      其他:   打印(栓+“请求错误”)   time . sleep (0.5)   j=+ 1   如果divmod (j, 100) [1]==0:   打印(“已经请求“+ str (j) +“条”)   #如果j比;10:   # self.in_xls(数据)   #打破   self.in_database(数据)      if __name__==癬_main__”:   company_ship=company_ship_in_database ()   company_ship.company_ship_in_database ()      

  

写程序的过程中其实有发现一个问题,即我们请求的其实是输入文字时候自动发送的请求,其实有一个问题,如果我们需要查询的是“华”为5的船,但是如果系统中没有这个船,就是返回“华为548”扽船,所以在代码中需要做一个判断

  

基于Python实现船舶的MMSI的获取(推荐),

基于Python实现船舶的MMSI的获取(推荐)