chinagangkou

抓取中国港口网数据

import json
import time
import random
# import base64
import datetime
import schedule
from pymongo import MongoClient
from datetime import datetime
# from urllib.parse import urlencode
# import execjs
import requests
# import csv
# from lxml import etree
# from Cryptodome.Cipher import DES3

headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    # 'Content-Length': '71',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'ssoUser=@b53c0c7944afc2c426ef87aefa64ae16; UM_distinctid=174bdf61ac146-01ae710934f1b4-3d634d00-384000-174bdf61ac27fc; jsid=15222cfa-bdb8-4e14-b61c-8a0350a55038; Hm_lvt_112cc63ae7d0082ab4d30ec2c3a16614=1600914857,1600914865; CNZZDATA3453251=cnzz_eid%3D1195104629-1600910660-null%26ntime%3D1600910660; Hm_lpvt_112cc63ae7d0082ab4d30ec2c3a16614=1600914906',
    'Host': 'www.chinaports.com',
    'Origin': 'http://www.chinaports.com',
    'Referer': 'http://www.chinaports.com/shiptracker/shipinit.do?method=login',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}


class Tools():
    @staticmethod
    def calculate_track(lon, lat):
        '''
        经纬度的转换
        :param lon:
        :param lat:
        :return:  转换后的经纬度
        '''
        lon = abs(lon)
        lat = abs(lat)
        lon_degree = int(lon)
        lat_degree = int(lat)
        lon_minute = int((lon - lon_degree) * 60)
        lat_minute = int((lat - lat_degree) * 60)
        lon_second = ((lon - lon_degree) * 60 - lon_minute)
        lat_second = ((lat - lat_degree) * 60 - lat_minute)
        #  3: 拿到 如0.130836的 保留小数 做四舍五入   5: 判断小数位是否大于5
        if int(str(lon_second)[3]) >= 5:
            # [2:3] :拿到 四舍五入后的 小数两位值
            lon_second1 = str(lon_second + 0.1)[2:3]
            # 10: 10进制,大于或等于10 minute加一
            if int(lon_second1) >= 10:
                lon_second = '0' + '′'
                lon_minute = lon_minute + 1
                # 60:大于或等于60 degree加一
                if lon_minute >= 60:
                    lon_minute = '00' + '.'
                    lon_degree = lon_degree + 1
                    lon_degree = str(lon_degree) + '°'
                else:
                    lon_minute = str(lon_minute) + '.'
                    lon_degree = str(lon_degree) + '°'

            else:
                lon_degree = str(lon_degree) + '°'
                lon_minute = str(lon_minute) + '.'
                lon_second = str(lon_second1) + '′'
        else:
            lon_degree = str(lon_degree) + '°'
            lon_minute = str(lon_minute) + '.'
            # [2:4] 没有任何进制的转换时 取小数的后两位
            lon_second = str(lon_second)[2:4] + '′'
        lon_data = lon_degree + lon_minute + lon_second
        if int(str(lat_second)[3]) >= 5:
            lat_second1 = str(lat_second + 0.1)[2:3]
            # print(lat_second1)
            if int(lat_second1) >= 10:
                lat_second = '0' + '′'
                lat_minute = lat_minute + 1
                if lat_minute >= 60:
                    lat_minute = '00' + '.'
                    lat_degree = lat_degree + 1
                    lat_degree = str(lat_degree) + '°'
                else:
                    lat_minute = str(lat_minute) + '.'
                    lat_degree = str(lat_degree) + '°'
            else:
                lat_degree = str(lat_degree) + '°'
                lat_minute = str(lat_minute) + '.'
                lat_second = str(lat_second1) + '′'
        else:
            lat_degree = str(lat_degree) + '°'
            lat_minute = str(lat_minute) + '.'
            lat_second = str(lat_second)[2:4] + '′'
        lat_data = lat_degree + lat_minute + lat_second
        return lon_data, lat_data

    @staticmethod
    def get_time():
        '''
        利用当前的时间获取前一天的时间
        :param localtime:
        :return:
        '''
        localtime = str(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        # 先转换为时间数组
        timeArray = time.strptime(localtime, "%Y-%m-%d %H:%M:%S")
        # 转换为时间戳
        timeStamp = int(time.mktime(timeArray))
        # 每天时间戳增加的 86400
        lastday_time = timeStamp - 86400
        timeArray1 = time.localtime(lastday_time)
        lastday_time = time.strftime("%Y-%m-%d %H:%M:%S", timeArray1)
        # '1598371200'  '2020-09-30 09:55:05','2020-10-08 09:55:05'
        return lastday_time,localtime

class Gettrack_data:
    connect_mongo = MongoClient('mongodb://{}:27017/'.format('localhost'))
    def __init__(self, ship_name):
        '''
        :param ship_name:
        '''
        self.ship_id = None
        self.mmsi = None
        self.ship_name = ship_name
        # gbk  utf-8  utf-8-sig  指定对应的编码格式 解决不同工具打开乱码问题
        # self.csvfile = open('{}_Track_data.csv'.format(ship_name), 'a', newline='',encoding='utf-8-sig')
        # self.con_head = self.save_csv()
        # self.connect_mongo = MongoClient('mongodb://{}:27017/'.format('localhost'))
        self.tools = Tools()

    def get_ship_id(self):
        '''
        获取shipid
        :return:
        '''
        url = 'http://www.chinaports.com/shiptracker/newshipquery.do'
        data = {
            'method': 'search',
            'isall': 0,
            'vession': 0,
            # 传入的参数 船名
            'cnqp': self.ship_name,
            'queryParam': self.ship_name
        }
        response = requests.post(url=url, headers=headers, data=data)
        try:
            # print(response.json()[0][1])
            self.ship_id = response.json()[0][1]
        except:
            self.ship_id = None
            # return

    def get_track_list(self, begain_time, end_time):
        '''
        获取轨迹点
        :param begain_time:轨迹开始的时间
        :param end_time:轨迹结束的时间
        :return:
        '''
        self.get_ship_id()
        if self.ship_id == None:
            return
        urlp = 'http://www.chinaports.com/shiptracker/shipinit.do'
        datas = {
            'method': 'shipTrail',
            'zoomleavel': '11',
            'shipid': self.ship_id,
            'begindate': begain_time,
            'enddate': end_time,
            'common': 'undefined',
            'encode': 'true',
        }
        response1 = requests.post(url=urlp, headers=headers, data=datas)
        result_mmsi = self.get_mmsi()
        # 只在第一次写入文件时写入表头
        # dict1_writer = self.con_head
        count = 0
        print(self.ship_name,result_mmsi)
        for i in response1.json():
            count += 1
            self.save_data(self.ship_name, result_mmsi, i)
        # self.csvfile.close()

    def get_mmsi(self):
        '''
        获取 ship的 mmsi
        :return:
        '''
        if self.ship_id == None:
            return
        url_mmsi = 'http://www.chinaports.com/shiptracker/shipinit.do'
        data_mmsi = {
            'method': 'pospoint',
            'type': '1',
            'shipid': self.ship_id,
            'encode': 'true'
        }
        response2 = requests.post(url=url_mmsi, headers=headers, data=data_mmsi)
        data_mmsistr = response2.text.split("[[", maxsplit=1)[1].rsplit("]]", maxsplit=1)[0]
        data_mmsis = data_mmsistr.split(',')
        self.mmsi = data_mmsis[6][2:-1]
        return self.mmsi

    # def save_csv(self):
    #     '''
    #     首次写文件时调用该方法  写表头
    #     :return:
    #     '''
    #     fieldnames = ['ship_name', 'ship_mmsi', 'time', 'log', 'lat']
    #     dict_writer = csv.DictWriter(self.csvfile, fieldnames=fieldnames)
    #     # dict_writer.writeheader()
    #     return dict_writer

    def save_data(self, name, mmsi, data):
        '''
        保存数据
        :param name:  ship_name
        :param mmsi:  ship_id
        :param data:  ship_info
        :return:
        '''
        db = self.connect_mongo.Gangkou
        mycol = db['{}'.format(name)]  # 选择集合

        try:
            log_data, lat_data = self.tools.calculate_track(data[1], data[2])
            dict_info = {'ship_name': name, 'ship_mmsi': mmsi, 'time': data[0], 'log': log_data, 'lat': lat_data}
            mycol.insert_one(dict_info)
        except Exception as errors:
            print(errors)

def main():
    '''
    程序启动的主函数
    :return:
    '''
    # 船的列表
    myclient = Gettrack_data.connect_mongo
    list_havetrack = ['truecorsair', 'wisdomofthesea1', 'alphaunity', 'glovisadvance', 'panfreedom', 'victorious',
                      'oresaoluis', 'mineralutamaro',
                      'aashna', 'densacobra', 'atalandi', 'truecartier', 'jozen', 'magsenger12', 'pacificcanopus',
                      'taharoaeos', 'changhangbinhai',
                      'ormond', 'hebeiuniverse', 'capeamanda', 'amportcartier']
    sd = Tools()
    begain_time, localtime = sd.get_time()
    for j in list_havetrack:
        ship = Gettrack_data(j)
        ship.get_track_list(begain_time, localtime)
    myclient.close()
if __name__ == '__main__':

    # 定时任务 每天执行一次
    # main()
    schedule.every().days.at("10:40").do(main)
    # schedule.every().days.do(main)
    while True:
        # 运行所有可运行的任务
        schedule.run_pending()
        time.sleep(1)
    # print(Tools.get_time())`在这里插入代码片`
以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值