船讯网根据获得的MMSI信息对于每个对应船舶的信息进行爬取
船讯网网址:http://www.shipxy.com/
这里爬取的内容包括了船舶的mmsi,imo,船舶宽度,船舶长度,船舶吃水深度等比较详细的信息,大体思路是根据Post得到数据然后我导入了mysql的数据库里。
mmsi数据是我之前爬取船舶的运动轨迹的时候就已经爬取得到了的。
代码原来是CSDN上一位学者根据船名爬取MMSI改的,他那个数据请求方式是get,稍有出入。
首先登陆 船舶网 发送请求,对其request method进行查看。可以发现数据的请求方式是post。
再看数据需要输入的内容,这里只有mmsi。
再看输出,在preview里面,就是我们要得到的内容。
关于爬虫的代码我附在最后,这个也是我写的第一篇CSDN,作为自己的心得记录,希望可以和更多的人一起交流~
import requests
import os
import time
import pymysql
import pandas as pd
import re
import random
'''
author:longcheng
function:通过读取船舶数据,分别请求拿到dict数据入库
'''
#定义入库的类
class company_ship_in_database:
def __init__(self):
self.conn = pymysql.connect(host="",port=, user="", password="", database="", 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):
#data_list为所有数据的列表
j=1
sql = ""
for i in data_list:
# if self.if_inbase(i['mmsi']):
#
# update_sql="UPDATE trail_info SET source = '"+ str(i['source']) +",shipid = '"+str(i['shipid']) +" WHERE mmsi = '" + i['mmsi'] + "'"
#
# self.cursor.execute(update_sql)
# self.conn.commit()
# print("已经更新第" + str(j) + "条")
# else:
insert_sql='insert into trail_info(mmsi,imo,name,callsign,length,width,trail,draught,lon,lat,sog,cog,hdg,rot,navistatus,lastdyn,satelliteutc) values("{}","{}","{}","{}",{},{},{},{},{},{},{},{},{},{},{},{},{})'.format(i['mmsi'],i['imo'],i['name'],i['callsign'],i['length'],i['width'],i['trail'],i['draught'],i['lon'],i['lat'],i['sog'],i['cog'],i['hdg'],i['rot'],i['navistatus'],i['lastdyn'],i['satelliteutc'])
# print(insert_sql)
self.cursor.execute(insert_sql)
print("已经插入第" + str(j) + "条,mmsi = "+ i['mmsi'])
self.conn.commit()
j=j+1
"得到需要查询信息的mmsi"
def get_mmsi(self):
mmsi_sql = "select distinct mmsi from trail3 order by mmsi"
self.cursor.execute(mmsi_sql)
mmsi_group = self.cursor.fetchall()
return mmsi_group
#请求船的方法
def company_ship_in_database(self):
mmsi_group = self.get_mmsi()
data=[]
j = 0
for i in mmsi_group:
chuan=i[0]
dic2 = {
'mmsi':chuan
}
# rq=requests.get("http://searchv3.shipxy.com/shipdata/search3.ashx",params=dic)
rq2 = requests.post("http://www.shipxy.com/ship/GetShip",data=dic2)
if rq2.status_code==200:
try:
import json
result2 = json.loads(rq2.text)
data.append(result2['data'][0])
print("mmsi:",chuan)
# df = pd.DataFrame.from_dict(result2['data'][0], orient='index')
# df = df.T
# print()
except:
data.append([""])
else:
print(chuan + "请求错误")
# time.sleep(random.random())
j = j + 1
if divmod(j,100)[1] == 0:
print("已经请求" + str(j) + "条")
print("已完成查询,准备入库....")
self.in_database(data)
return data
if __name__=="__main__":
company_ship=company_ship_in_database()
data = company_ship.company_ship_in_database()
欢迎大家一起交流哦~