Advertisement
Merevoli

Untitled

Apr 7th, 2022
692
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -*- coding: utf-8 -*-
  2. import re
  3.  
  4. import dateutil.parser as dateparser
  5. import jmespath
  6. from pp_scraper.spiders.BaseScraper import BaseScraperItemPipeline
  7. from pp_scraper.mixins import RedisMixin
  8.  
  9. GLSITA_BASE_URL = 'https://gls-group.com/app/service/open/rest/IT/it/rstt001?match=%s&type=%s'
  10.  
  11. class GLSITAScraper(BaseScraperItemPipeline, RedisMixin):
  12.     name = "GLSITAScraper"
  13.  
  14.     def __init__(self, name=None, **kwargs):
  15.         super(GLSITAScraper, self).__init__(name, **kwargs)
  16.         customer_code = self.params.get('scraping_parameters').get('customer_code')
  17.         office_code = self.params.get('scraping_parameters').get('office_code')
  18.        
  19.         if re.match(r'^\w[\w\d]\d{,9}$', self.parcel_id):
  20.             mode = 'NAT'
  21.         elif customer_code and office_code:
  22.             mode = 'DDT'
  23.         else:
  24.             mode = 'DDT'
  25.        
  26.         self.start_urls = [GLSITA_BASE_URL.format(self.parcel_id, mode)]
  27.  
  28.     def parse(self, response):
  29.         data = jmespath.search('tuStatus[0]', response.json())
  30.         event_data = data.get('history')
  31.        
  32.         if not event_data:
  33.             return self.save_result([])
  34.  
  35.         # Events
  36.         events = []
  37.         for raw_event in event_data:
  38.             event = dict()
  39.             event_type = raw_event.get('evtDscr')
  40.             comment = raw_event.get('note')
  41.             raw_date = raw_event.get('date')
  42.             raw_time = raw_event.get('time')
  43.             address = jmespath('address.city', raw_event)
  44.            
  45.             event_time = None
  46.             if raw_date and raw_time:
  47.                 try:
  48.                     event_time = dateparser.parse(
  49.                         " ".join([raw_date, raw_time])
  50.                     ).isoformat()
  51.                 except Exception:
  52.                     continue
  53.                
  54.             if address:
  55.                 event['location'] = address
  56.            
  57.             if comment:
  58.                 event['comments'] = comment
  59.                
  60.             if event_type and event_time:
  61.                 event['event_type'] = event_type
  62.                 event['event_time'] = event_time
  63.                 events.append(event)
  64.  
  65.         # Additional information
  66.         additional_info = dict()
  67.  
  68.         parcel_ship_time_carrier = (
  69.             response.xpath(
  70.                 '//td[b[normalize-space(text())="Departure date:"]]'
  71.                 '/following-sibling::td[1]/span'
  72.                 '/text()'
  73.             )
  74.             .extract_first(default='')
  75.             .strip()
  76.         )
  77.  
  78.         if parcel_ship_time_carrier:
  79.             try:
  80.                 parsed_time = dateparser.parse(
  81.                     parcel_ship_time_carrier, dayfirst=True
  82.                 ).strftime('%Y-%m-%d')
  83.                 additional_info['parcel_ship_time_carrier'] = parsed_time
  84.             except Exception:
  85.                 pass
  86.  
  87.         parcel_piece_count_carrier = (
  88.             response.xpath(
  89.                 '//td[b[normalize-space(text())="Parcel:"]]'
  90.                 '/following-sibling::td[1]/span'
  91.                 '/text()'
  92.             )
  93.             .extract_first(default='')
  94.             .strip()
  95.         )
  96.  
  97.         if parcel_piece_count_carrier:
  98.             additional_info['parcel_piece_count_carrier'] = parcel_piece_count_carrier
  99.  
  100.         parcel_weight_carrier = (
  101.             response.xpath(
  102.                 '//td[b[normalize-space(text())="Weight:"]]'
  103.                 '/following-sibling::td[1]/span'
  104.                 '/text()'
  105.             )
  106.             .extract_first(default='')
  107.             .strip()
  108.         )
  109.  
  110.         if parcel_weight_carrier:
  111.             additional_info['parcel_weight_carrier'] = parcel_weight_carrier.replace(
  112.                 ',', '.'
  113.             )
  114.  
  115.         parcel_volume_carrier = (
  116.             response.xpath(
  117.                 '//td[b[normalize-space(text())="Volume:"]]/following-sibling::td[1]'
  118.                 '/span/text()'
  119.             )
  120.             .extract_first(default='')
  121.             .strip()
  122.         )
  123.  
  124.         if parcel_volume_carrier:
  125.             additional_info['parcel_volume_carrier'] = parcel_volume_carrier.replace(
  126.                 ',', '.'
  127.             )
  128.  
  129.         parcel_from_locality_carrier = (
  130.             response.xpath(
  131.                 '//td[b[normalize-space(text())="Sender:"]]'
  132.                 '/following-sibling::td[1]/span'
  133.                 '/text()'
  134.             )
  135.             .extract_first(default='')
  136.             .strip()
  137.         )
  138.  
  139.         if parcel_from_locality_carrier:
  140.             additional_info['parcel_from_locality_carrier'] = re.sub(
  141.                 r'\s+', ' ', parcel_from_locality_carrier
  142.             )
  143.  
  144.         parcel_to_locality_carrier = (
  145.             response.xpath(
  146.                 '//td[b[normalize-space(text())="Recipient:"]]'
  147.                 '/following-sibling::td[1]/span'
  148.                 '/text()'
  149.             )
  150.             .extract_first(default='')
  151.             .strip()
  152.         )
  153.  
  154.         if parcel_to_locality_carrier:
  155.             additional_info['parcel_to_locality_carrier'] = re.sub(
  156.                 r'\s+', ' ', parcel_to_locality_carrier
  157.             )
  158.  
  159.         parcel_origin_office_carrier = (
  160.             response.xpath(
  161.                 '//td[b[normalize-space(text())="Depot sender:"]]'
  162.                 '/following-sibling::td[1]/span'
  163.                 '/text()'
  164.             )
  165.             .extract_first(default='')
  166.             .strip()
  167.         )
  168.  
  169.         if parcel_origin_office_carrier:
  170.             additional_info['parcel_origin_office_carrier'] = re.sub(
  171.                 r'\s+', ' ', parcel_origin_office_carrier
  172.             )
  173.  
  174.         parcel_destination_office_carrier = (
  175.             response.xpath(
  176.                 '//td[b[normalize-space(text())="Depot recipient:"]]'
  177.                 '/following-sibling::td[1]/span'
  178.                 '/text()'
  179.             )
  180.             .extract_first(default='')
  181.             .strip()
  182.         )
  183.  
  184.         if parcel_destination_office_carrier:
  185.             additional_info['parcel_destination_office_carrier'] = re.sub(
  186.                 r'\s+', ' ', parcel_destination_office_carrier
  187.             )
  188.  
  189.         parcel_carrier_customer_reference = re.sub(
  190.             r'\s+',
  191.             '',
  192.             response.xpath(
  193.                 '//td[b[normalize-space(text())="Shipment number:"]]'
  194.                 '/following-sibling::td[1]/span'
  195.                 '/text()'
  196.             ).extract_first(default=''),
  197.         )
  198.  
  199.         if (
  200.             parcel_carrier_customer_reference
  201.             and self.parcel_id != parcel_carrier_customer_reference
  202.         ):
  203.             additional_info[
  204.                 'parcel_carrier_customer_reference'
  205.             ] = parcel_carrier_customer_reference
  206.  
  207.         parcel_id2 = ''.join(
  208.             response.xpath('//td[@id="inter"]/text()').extract()
  209.         ).strip()
  210.  
  211.         if parcel_id2 and self.parcel_id != parcel_id2:
  212.             additional_info['parcel_id2'] = [parcel_id2]
  213.  
  214.         # from pp_scraper.utils import print_pretty_json
  215.         # print_pretty_json(events)
  216.         # print_pretty_json(additional_info)
  217.         return self.save_result(events, **additional_info)
  218.  
  219.  
Advertisement
RAW Paste Data Copied
Advertisement