@@ -25,24 +25,23 @@ def __init__(self, token: str):
2525 self .token = token
2626 self .requests_session = requests .Session ()
2727 version = scrapingant_client .__version__
28- user_agent = f'ScrapingAnt Client/{ version } ({ sys .platform } ; Python/{ platform .python_version ()} );'
28+ self . user_agent = f'ScrapingAnt Client/{ version } ({ sys .platform } ; Python/{ platform .python_version ()} );'
2929 self .requests_session .headers .update ({
3030 'x-api-key' : self .token ,
31- 'User-Agent' : user_agent ,
31+ 'User-Agent' : self . user_agent ,
3232 })
3333
34- def general_request (
34+ def _form_payload (
3535 self ,
3636 url : str ,
3737 cookies : Optional [List [Cookie ]] = None ,
38- headers : Optional [Dict [str , str ]] = None ,
3938 js_snippet : Optional [str ] = None ,
4039 proxy_type : ProxyType = ProxyType .datacenter ,
4140 proxy_country : Optional [str ] = None ,
4241 return_text : bool = False ,
4342 wait_for_selector : Optional [str ] = None ,
4443 browser : bool = True ,
45- ) -> Response :
44+ ) -> Dict :
4645 request_data = {'url' : url }
4746 if cookies is not None :
4847 request_data ['cookies' ] = cookies_list_to_string (cookies )
@@ -56,29 +55,97 @@ def general_request(
5655 request_data ['wait_for_selector' ] = wait_for_selector
5756 request_data ['return_text' ] = return_text
5857 request_data ['browser' ] = browser
58+ return request_data
5959
60- response = self .requests_session .post (
61- SCRAPINGANT_API_BASE_URL + '/general' ,
62- json = request_data ,
63- headers = convert_headers (headers ),
64- )
65- if response .status_code == 403 :
60+ def _parse_response (self , response_status_code : int , response_data : Dict , url : str ) -> Response :
61+ if response_status_code == 403 :
6662 raise ScrapingantInvalidTokenException ()
67- elif response . status_code == 404 :
63+ elif response_status_code == 404 :
6864 raise ScrapingantSiteNotReachableException (url )
69- elif response . status_code == 422 :
70- raise ScrapingantInvalidInputException (response . text )
71- elif response . status_code == 423 :
65+ elif response_status_code == 422 :
66+ raise ScrapingantInvalidInputException (response_data )
67+ elif response_status_code == 423 :
7268 raise ScrapingantDetectedException ()
73- elif response . status_code == 500 :
69+ elif response_status_code == 500 :
7470 raise ScrapingantInternalException ()
75- json_response = response .json ()
76- content = json_response ['content' ]
77- cookies_string = json_response ['cookies' ]
78- status_code = json_response ['status_code' ]
71+ content = response_data ['content' ]
72+ cookies_string = response_data ['cookies' ]
73+ status_code = response_data ['status_code' ]
7974 cookies_list = cookies_list_from_string (cookies_string )
8075 return Response (
8176 content = content ,
8277 cookies = cookies_list ,
8378 status_code = status_code
8479 )
80+
81+ def general_request (
82+ self ,
83+ url : str ,
84+ cookies : Optional [List [Cookie ]] = None ,
85+ headers : Optional [Dict [str , str ]] = None ,
86+ js_snippet : Optional [str ] = None ,
87+ proxy_type : ProxyType = ProxyType .datacenter ,
88+ proxy_country : Optional [str ] = None ,
89+ return_text : bool = False ,
90+ wait_for_selector : Optional [str ] = None ,
91+ browser : bool = True ,
92+ ) -> Response :
93+ request_data = self ._form_payload (
94+ url = url ,
95+ cookies = cookies ,
96+ js_snippet = js_snippet ,
97+ proxy_type = proxy_type ,
98+ proxy_country = proxy_country ,
99+ return_text = return_text ,
100+ wait_for_selector = wait_for_selector ,
101+ browser = browser ,
102+ )
103+ response = self .requests_session .post (
104+ SCRAPINGANT_API_BASE_URL + '/general' ,
105+ json = request_data ,
106+ headers = convert_headers (headers ),
107+ )
108+ response_status_code = response .status_code
109+ response_data = response .json ()
110+ parsed_response : Response = self ._parse_response (response_status_code , response_data , url )
111+ return parsed_response
112+
113+ async def general_request_async (
114+ self ,
115+ url : str ,
116+ cookies : Optional [List [Cookie ]] = None ,
117+ headers : Optional [Dict [str , str ]] = None ,
118+ js_snippet : Optional [str ] = None ,
119+ proxy_type : ProxyType = ProxyType .datacenter ,
120+ proxy_country : Optional [str ] = None ,
121+ return_text : bool = False ,
122+ wait_for_selector : Optional [str ] = None ,
123+ browser : bool = True ,
124+ ) -> Response :
125+ import httpx
126+
127+ request_data = self ._form_payload (
128+ url = url ,
129+ cookies = cookies ,
130+ js_snippet = js_snippet ,
131+ proxy_type = proxy_type ,
132+ proxy_country = proxy_country ,
133+ return_text = return_text ,
134+ wait_for_selector = wait_for_selector ,
135+ browser = browser ,
136+ )
137+ async with httpx .AsyncClient (
138+ headers = {
139+ 'x-api-key' : self .token ,
140+ 'User-Agent' : self .user_agent ,
141+ }
142+ ) as client :
143+ response = await client .post (
144+ SCRAPINGANT_API_BASE_URL + '/general' ,
145+ json = request_data ,
146+ headers = convert_headers (headers ),
147+ )
148+ response_status_code = response .status_code
149+ response_data = response .json ()
150+ parsed_response : Response = self ._parse_response (response_status_code , response_data , url )
151+ return parsed_response
0 commit comments