From ed25887b9a44246f798073c597b30c8965f18d3c Mon Sep 17 00:00:00 2001 From: Nath Date: Tue, 4 Oct 2022 16:49:58 +0100 Subject: [PATCH] Update __init__.py using `request.Session` is better, as it emulates browser behaviour to the server. that being said need to add more header information, such as what "browser" it is etc.. Also f-literal strings are your friends --- indeed/__init__.py | 51 +++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/indeed/__init__.py b/indeed/__init__.py index 9ac66d1..6f5c7f8 100644 --- a/indeed/__init__.py +++ b/indeed/__init__.py @@ -1,41 +1,54 @@ -import requests +from requests import Session DEFAULT_FORMAT = "json" API_ROOT = "http://api.indeed.com/ads" -API_SEARCH = {'end_point': "%s/apisearch" % API_ROOT, 'required_fields': ['userip', 'useragent', ['q', 'l']]} -API_JOBS = {'end_point': "%s/apigetjobs" % API_ROOT, 'required_fields': ['jobkeys']} + +API_SEARCH = dict( + end_point=f"{API_ROOT}/apisearch", + required_fields=["userip", "useragent", ['q', 'l']] +) + +API_JOBS = dict( + end_point=f"{API_ROOT}/apigetjobs", + required_fields=["jobkeys"] +) class IndeedClientException(Exception): pass -class IndeedClient: - def __init__(self, publisher, version = "2"): +class IndeedClient(Session): + def __init__(self, publisher, version = '2'): + super(IndeedClient, self).__init__() self.publisher = publisher self.version = version def search(self, **args): - return self.__process_request(API_SEARCH.get('end_point'), self.__valid_args(API_SEARCH.get('required_fields'), args)) + return self.__process_request( + API_SEARCH.get("end_point"), + self.__valid_args(API_SEARCH.get("required_fields"), args)) def jobs(self, **args): - valid_args = self.__valid_args(API_JOBS.get('required_fields'), args) - valid_args['jobkeys'] = ",".join(valid_args['jobkeys']) - return self.__process_request(API_JOBS.get('end_point'), valid_args) + valid_args = self.__valid_args(API_JOBS.get("required_fields"), args) + valid_args["jobkeys"] = ','.join(valid_args["jobkeys"]) + return self.__process_request(API_JOBS.get("end_point"), valid_args) def __process_request(self, endpoint, args): - format = args.get('format', DEFAULT_FORMAT) - raw = True if format == 'xml' else args.get('raw', False) - args.update({'v': self.version, 'publisher': self.publisher, 'format': format}) - r = requests.get(endpoint, params = args) - return r.json() if not raw else r.content + format_ = args.get("format", DEFAULT_FORMAT) + if format_ == "xml": + raw = True + else: + raw = args.get("raw", False) + args.update({'v': self.version, "publisher": self.publisher, "format": format_}) + response = self.get(endpoint, params = args) + return response.json() if not raw else response.content def __valid_args(self, required_fields, args): for field in required_fields: - if type(field) is list: - validation_list = [args.get(f) != None for f in field] - if not (True in validation_list): - raise IndeedClientException("You must provide one of the following %s" % ",".join(field)) + if isinstance(field, list): + if not (True in [args.get(f) != None for f in field]): + raise IndeedClientException(f"You must provide one of the following {','.join(field)}") elif not args.get(field): - raise IndeedClientException("The field %s is required" % field) + raise IndeedClientException(f"The field {field} is required") return args