Python(十九)实现各大跨境船公司物流查询&数据处理处罚优化

[复制链接]
发表于 2025-11-2 20:26:07 | 显示全部楼层 |阅读模式
一、媒介

之前已经实现了常用 跨境物流船司 根本信息查询功能,如下所示

      
  • 实现各大跨境船公司[COSCO/ZIM/MSK/MSC/ONE/PIL]的物流信息查询:  
  • https://blog.csdn.net/Makasa/article/details/145484999?spm=1001.2014.3001.5501
<hr> 然后本章在其根本上做了一些优化,以及新增之前未实现的功能
   1)实现【提单号】单个主动分配查询船司信息
  
       
  • 方法:assign_shipper(bill_number)  
    2)实现【提单号】批量查询
  
       
  • 方法:search_tracking_info_by_list(bl_list)  
    3)获取最新【ETA(预计到港时间)】时间并主动写入excel
  
       
  • 方法:get_latest_eta_time_and_insert_excel()  
  会在原有excel文件中原【ETA】列后添加一行,再将新的【ETA】填写进去
不直接更换缘故起因便于对比;

   4)主动将船司查询到的信息按规定表头写入excel表格【单条】
  
       
  • insert_ship_detail_to_excel(“NGZN50041300”)  
  
      
  • 留意:表头格式我这边按现实需求限定死了,可以按你们自己需求举行更改


   5)批量将船司查询到的信息按规定表头写入excel表格【list】
  
       
  • insert_ship_detail_list_to_excel(bl_list) # 批量插入数excel数据  
  <hr> 将来需优化:

      
  • 1)PIL船司返回的前端,分析如今还存在一点题目,须要兼容各种返回环境的产生;
    如今默认只分析拿到第一个集装箱的数据;  
  • 2)ZIM接口不稳固,需排盘题目  
  • 3)OOCL / CMA /HPL 加密 实验找方法破解
<hr> <hr> 二、代码实现


      
  • 上篇blog已经实现了根本查询功能,按船司分开写的,这里我就差别一分开了,直接贴整个代码
  1. # -*- codeing = utf-8 -*-
  2. # @time: 2025/2/12  14:26
  3. # @Author : Mikasa
  4. import json
  5. import time
  6. from datetime import datetime
  7. import pandas as pd
  8. import requests
  9. from bs4 import BeautifulSoup
  10. from pathlib import Path
  11. def get_MSK_tracking_info(tracking_number):
  12.     """
  13.     查询MSK船司物流信息
  14.     :param tracking_number:提单号
  15.     :return:
  16.     """
  17.     url = "https://api.maersk.com.cn/synergy/tracking/" + tracking_number
  18.     params = {
  19.    
  20.    "operator": "MAEU"}
  21.     headers = {
  22.    
  23.    
  24.         "consumer-key": "UtMm6JCDcGTnMGErNGvS2B98kt1Wl25H",  # 关键认证头 必传
  25.         "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36"
  26.     }
  27.     try:
  28.         response = requests.get(url, params=params, headers=headers, timeout=10)
  29.         result_json = response.json()
  30.         print("===========================================")
  31.         print("MSK船信息:", result_json)
  32.         return result_json
  33.     except requests.exceptions.RequestException as e:
  34.         print(f"请求失败: {
  35.      
  36.      e}")
  37.     except json.JSONDecodeError:
  38.         print("响应不是有效的 JSON 格式")
  39. def get_MSK_related_time(tracking_number):
  40.     """
  41.     获取MSK船期时间
  42.     :param tracking_number:
  43.     :return:
  44.     """
  45.     result = get_MSK_tracking_info(tracking_number)
  46.     location_list = result['containers'][0]['locations']
  47.     target_terminal = "APAPA PORT"
  48.     index = 0
  49.     for i, location in enumerate(location_list):
  50.         if location["terminal"] == target_terminal:
  51.             index = i  # 拿到目的地为apapa PORT的数据的index
  52.             break
  53.     # todo : 246217454 这个已经到港并且已经完结的提单没有expected_time属性
  54.     # todo :248440101 未到港,就存在expected_time属性
  55.     ship_info = location_list[index]['events'][0]
  56.     event_time_type = ship_info['event_time_type']
  57.     if event_time_type == "EXPECTED":
  58.         # 提单还未到港
  59.         ETA = ship_info['expected_time']
  60.     elif event_time_type == "ACTUAL":
  61.         # 提单已到港,拿真实时间
  62.         ETA = ship_info['actual_time']
  63.     new_ETA_fomat = deal_MSK_eta_time_format(ETA)
  64.     print("------------------------------------------")
  65.     print(f"提单号【{
  66.      
  67.      tracking_number}】船期信息如下:")
  68.     print(f"预计到港时间:{
  69.      
  70.      new_ETA_fomat}")
  71.     return new_ETA_fomat
  72. def deal_MSK_eta_time_format(date):
  73.     """
  74.     处理MSK船司预期时间格式
  75.     :param date:
  76.     :return:
  77.     """
  78.     dt = datetime.strptime(date, "%Y-%m-%dT%H:%M:%S.%f")
  79.     formatted_str = dt.strftime("%Y/%#m/%#d %H:%M:%S")
  80.     return formatted_str
  81. def get_ONE_tracking_info_by_bill_number(bill_number):
  82.     """
  83.     根据提单号查询ONE物流信息
  84.     :param bill_number:
  85.     :return:
  86.     """
  87.     str = "ONEY"
  88.     if str in bill_number:
  89.         bill_number = bill_number.replace("ONEY", "")
  90.     headers = {
  91.    
  92.    
  93.         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
  94.         "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
  95.         "X-Requested-With": "XMLHttpRequest"
  96.     }
  97.     url = "https://ecomm.one-line.com/ecom/CUP_HOM_3301GS.do?" \
  98.           "sord=asc" \
  99.           "&f_cmd=121" \
  100.           "&search_type=B" \
  101.           f"&search_name={
  102.      
  103.      bill_number}"
  104.     response = requests.get(url, headers=headers)
  105.     result = response.json()
  106.     print("BL_response:", result)
  107.     return result
  108. def get_ONE_tracking_info(bill_number):
  109.     """
  110.     查询ONE船司物流信息
  111.     :param tracking_number:
  112.     :return:
  113.     """
  114.     result = get_ONE_tracking_info_by_bill_number(bill_number)
  115.     container_list = result['list'][0]  # 默认取第一个集装箱
  116.     container_number = container_list['cntrNo']
  117.     cop_no = container_list['copNo']
  118.     bkg_no = container_list['bkgNo']
  119.     url = "https://ecomm.one-line.com/ecom/CUP_HOM_3301GS.do"
  120.     headers = {
  121.    
  122.    
  123.         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
  124.         "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
  125.         "X-Requested-With": "XMLHttpRequest"
  126.     }
  127.     payload = {
  128.    
  129.    
  130.         "f_cmd": "125",
  131.         "cntr_no": container_number,
  132.         "bkg_no": bkg_no,
  133.         "cop_no": cop_no
  134.     }
  135.     response = requests.post(url, headers=headers, data=payload)
  136.     if response.status_code == 200:
  137.         data = response.json()
  138.         print("===========================================")
  139.         print("ONE船信息:", response.json())
  140.     return data
  141. def get_ONE_related_time(bill_number):
  142.     """
  143.     查询ONE船期时间
  144.     :param bill_number:
  145.     :return:
  146.     """
  147.     data = get_ONE_tracking_info(bill_number)
  148.     track_info_list = data['list']
  149.     eta = "Arrival at Port of Discharging"
  150.     actual_pod = "POD Berthing Destination"
  151.     discharge_cargo = "Port of Discharging"
  152.     print("------------------------------------------")
  153.     print(f"提单号【{
  154.      
  155.      bill_number}】船期信息如下:")
  156.     for track_info in track_info_list:
  157.         statusNm = track_info['statusNm']
  158.         if eta in statusNm:
  159.             print(f"预期到港时间:", track_info['eventDt'])
  160.         elif actual_pod in statusNm:
  161.             print(f"实际抵达卸货港时间:", track_info['eventDt'])
  162.         elif discharge_cargo in statusNm:
  163.             print(f"实际卸货时间:", track_info['eventDt'])
  164.     return track_info['eventDt']  # 直接返回的最新一套信息的时间
  165. def get_PIL_cookie():
  166.     """
  167.     获取PIL的cookie
  168.     :return:
  169.     """
  170.     # 生成北京当前时间戳 单位为ms
  171.     timestamp_ms = int(time.time() * 1000)
  172.     url = "https://www.pilship.com/wp-content/themes/hello-theme-child-master/pil-api/common/get-n.php?timestamp=" + str(
  173.         timestamp_ms)
  174.     headers = {
  175.    
  176.    
  177.         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
  178.         "Referer": "https://www.pilship.com/digital-solutions/?tab=customer&id=track-trace&label=containerTandT&module=TrackTraceBL&refNo=NGRI50097000"
  179.     }
  180.     response = requests.get(url, headers=headers)
  181.     return response
  182. def get_PIL_tracking_info_by_bill_number(bill_number):
  183.     """
  184.     根据提单号查询PIL物流信息
  185.     :param bill_number:
  186.     :return:
  187.     """
  188.     response = get_PIL_cookie()  # 拿到n
  189.     n = response.json()['n']
  190.     timestamp = str(int(time.time() * 1000))
  191.     referer = "https://www.pilship.com/digital-solutions/?tab=customer&id=track-trace&label=containerTandT&module=TrackTraceBL&refNo=" + bill_number
  192.     headers = {
  193.    
  194.    
  195.         'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
  196.         'referer': referer,
  197.         'X-Requested-With': "XMLHttpRequest",
  198.         'cookie': "CookieConsent={stamp:%27LUQ2eOuWASANePCHNSXS2yeSAiOmJoQhXm7pEbeVpMEr7kRRRhczfw==%27%2Cnecessary:true%2Cpreferences:true%2Cstatistics:true%2Cmarketing:true%2Cmethod:%27explicit%27%2Cver:1%2Cutc:1734771385816%2Cregion:%27ng%27}; _ga=GA1.1.1137581632.1734770854; pil_session_cookie=!WFtN5njOPpQS1hf8xTD27kmUREcR4A5xQFGbSdeZWh6xne7uf6cynXyQzICRX7DAVtXpZHsVQFbXaA==; wp-wpml_current_language=en; TSPD_101=08c4718e7dab2800c57f82cee5e846814246783a4ea9308f585af084e53e57c851f4d7af7507b6ba01b43d68d07a6fc9084f292334051800b0bdc60b7433c56f989c7ca0dcd64b787093688cd95badc6; TS00000000076=08c4718e7dab28007707032a2a3c087717436b105e0ea27086f21be845e6238e426c659eed97e9faac24d9498ea8e2f90825bede2809d000f4ff876b60b5d60819d6e9be3e6f3d6f2d0ad9cc544d6ba809938284a1f852c824efa411a4094ef683ea56f2d383a67379539aa5b28a9a52823dde83af710cc1065a8cb738359c2102062f1f41799313cc887fe2f7f84015edf73a4443f90343838461044c8dbccae6660ca3322e787bb229d3ae25557ce32af1669c3ddeb451eb967fe99ac32cc0ef550af1567da52efbed7d17b811159ef5b40416eb7178abca86b4f273868b80aee1cd0ab7a38515f98e7b91baf133b22894982a220077e68b7c314d8ca5c0f89a4bbc55a09b538e; TSPD_101_DID=08c4718e7dab28007707032a2a3c087717436b105e0ea27086f21be845e6238e426c659eed97e9faac24d9498ea8e2f90825bede28063800dd525af8f96ac9cff1388ccc906e36023328029cfae4893759356223de54c62e94a0c306a33859e46108198cac5061a89c8fa7c14267e4fc; TS7ff733e9077=08c4718e7dab280085f60f04ba264a2e0ac0875b36b59c53defab055f5fea0c7c7ce7b40ed9afcf756781ecc450e1b470807626b7517200050d650fcfa6773405f5a17954cff4628d908f416f4234200dbaa3cc3ec46b52a; _ga_M39J8YZNDE=GS1.1.1738786704.56.0.1738786704.0.0.0; TS015cd57e=011698f8e78ca3bc42cad4dd0e721fdcb048e98d12c3529eecbcc961ce0855aa8b6eef2788cf1b3cc8bbe190c65fcf3d0666de4efd377ed9d22d0f951ed126bf67a554e95c; TS7ff733e9029=08c4718e7dab2800e6a5d0f6faeca1dc19685dfff567b4dd1369f1b4b696f84893905e24cb58bc50ffb1a716a0e029fa; TS97a2723b027=08c4718e7dab2000fd4b11416d6e7e1c3da097165f9bd7b084e973e022fa2ec9d671050f9f2f2966081a278b7c1130004fb6fbf91b1d6cb4cd98e6bcb7bd8410d5bed0a0f4b4e1e764e4f4d75f4d5666b6a1bb124f33758104b457ee4acaf2c2"
  199.     }
  200.     # 否则根据提单号查询
  201.     url = f"https://www.pilship.com/wp-content/themes/hello-theme-child-master/pil-api/trackntrace-containertnt.php?" \
  202.           f"module=TrackTraceBL" \
  203.           f"&refNo={
  204.      
  205.      bill_number}" \
  206.           f"&n={
  207.      
  208.      n}" \
  209.           f"&timestamp={
  210.      
  211.      timestamp}"
  212.     response = requests.get(url, headers=headers)
  213.     print("url:", response.url)  # 查看最终请求的 URL
  214.     if response.status_code == 200:
  215.         response_json = json.loads(response.text)
  216.         result_json = analysis_PIL_response_by_bill_number(response_json)  # 解析
  217.         return result_json
  218.     else:
  219.         print("通过【提单号】查询PIL船司信息失败")
  220. def get_PIL_tracking_info(bill_number):
  221.     """
  222.     查询PIL船公司物流信息(完整工作流)
  223.     - 包含动态Token获取和Cookie管理
  224.     - 必传校验:n | 经过多次测试,发现cookie只穿
  225.     """
  226.     response = get_PIL_cookie()  # 拿到n
  227.     n = response.json
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表