Use requests module instead of urllib. - lefrecce - Retrieve information about next trains and stations via lefrecce.it
 (HTM) hg clone https://bitbucket.org/iamleot/lefrecce
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) changeset 4e3b85bec737283570628a0344059dd1a2f693bd
 (DIR) parent beb3201986f4ae506bf6fed02edc1bbc71e6bbd8
 (HTM) Author: Leonardo Taccari <iamleot@gmail.com>
       Date:   Sun, 13 May 2018 15:42:03 
       
       Use requests module instead of urllib.
       
       Unfortunately solutions() if verbose=True was passed was broken
       because probably now also cookies should be passed to get "details"
       about the single solution. Give up in using urllib and just use
       requests via a single session.
       
       Apart an extra dependency, now the kludge for verbose=True is no more needed!
       
       Diffstat:
        lefrecce.py |  61 ++++++++++++++++++++++---------------------------------------
        1 files changed, 22 insertions(+), 39 deletions(-)
       ---
       diff -r beb3201986f4 -r 4e3b85bec737 lefrecce.py
       --- a/lefrecce.py       Sun May 13 14:49:39 2018 +0200
       +++ b/lefrecce.py       Sun May 13 15:42:03 2018 +0200
       @@ -38,7 +38,8 @@
        
        from datetime import datetime
        import json
       -from urllib import parse, request
       +
       +import requests
        
        
        def print_solution(solution):
       @@ -59,19 +60,17 @@
        
        def solutions(origin, destination, adate, atime, verbose=True):
            url = 'https://www.lefrecce.it/msite/api/solutions?' \
       -        + 'origin=' + parse.quote(origin) + '&' \
       -        + 'destination=' + parse.quote(destination) + '&' \
       +        + 'origin=' + origin + '&' \
       +        + 'destination=' + destination + '&' \
                + 'arflag=A' + '&' \
       -        + 'adate=' + parse.quote(adate) + '&' \
       -        + 'atime=' + parse.quote(atime) + '&' \
       +        + 'adate=' + adate + '&' \
       +        + 'atime=' + atime + '&' \
                + 'adultno=1&childno=0&direction=A&frecce=false&onlyRegional=false'
            
       -    res = ''
       -    req = request.Request(url, headers={'Accept-Language': 'en-US'})
       -    with request.urlopen(req) as r:
       -        for l in r:
       -            res += l.decode()
       -    j = json.loads(res)
       +    sess = requests.Session()
       +    sess.headers['Accept-Language'] = 'en-US'
       +    r = sess.get(url)
       +    j = json.loads(r.text)
            
            for solution in j:
                s = {}
       @@ -83,21 +82,9 @@
                s['trains'] = []
            
                if verbose:
       -            trains_url = 'https://www.lefrecce.it/msite/api/solutions/' + parse.quote(solution['idsolution']) + '/info'
       -            res = ''
       -            req = request.Request(trains_url, headers={'Accept-Language': 'en-US'})
       -            # XXX: Often the request trains information regarding the current
       -            # XXX: solution just return an empty string... Recheck until we have
       -            # XXX: something useful...
       -            while res == '':
       -                try:
       -                    r = request.urlopen(req)
       -                    for l in r:
       -                        res += l.decode()
       -                except:
       -                    pass
       -    
       -            trains = json.loads(res)
       +            trains_url = 'https://www.lefrecce.it/msite/api/solutions/' + solution['idsolution'] + '/info'
       +            r = sess.get(trains_url)
       +            trains = json.loads(r.text)
                
                    for train in trains:
                        stoplist = []
       @@ -129,14 +116,12 @@
        
        def search_stations(name):
            url = 'https://www.lefrecce.it/msite/api/geolocations/locations?name=' + \
       -       parse.quote(name)
       +       name
            
       -    res = ''
       -    req = request.Request(url, headers={'Accept-Language': 'en-US'})
       -    with request.urlopen(req) as r:
       -        for l in r:
       -            res += l.decode()
       -    j = json.loads(res)
       +    sess = requests.Session()
       +    sess.headers['Accept-Language'] = 'en-US'
       +    r = sess.get(url)
       +    j = json.loads(r.text)
        
            stations = []
            for station in j:
       @@ -148,12 +133,10 @@
        def list_stations():
            url = 'http://www.trenitalia.com/cms-file/common/js/themes/trenitalia_2014/001/list_json.js'
        
       -    res = ''
       -    req = request.Request(url, headers={'Accept-Language': 'en-US'})
       -    with request.urlopen(req) as r:
       -        for l in r:
       -            res += l.decode()
       -    j = json.loads(res)
       +    sess = requests.Session()
       +    sess.headers['Accept-Language'] = 'en-US'
       +    r = sess.get(url)
       +    j = json.loads(r.text)
        
            stations = set()
            for station in j: