[{"data":1,"prerenderedAt":593},["ShallowReactive",2],{"i-lucide:sun-moon":3,"i-lucide:menu":8,"post-\u002Fblog\u002F2022-11-17-python-requests":10,"surround-\u002Fblog\u002F2022-11-17-python-requests":576,"i-lucide:arrow-left":587,"i-lucide:sparkles":589,"i-lucide:user":591},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 2v2m2.837 12.385a6 6 0 1 1-7.223-7.222c.624-.147.97.66.715 1.248a4 4 0 0 0 5.26 5.259c.589-.255 1.396.09 1.248.715M16 12a4 4 0 0 0-4-4m7-3l-1.256 1.256M20 12h2\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"id":11,"title":12,"authors":13,"body":16,"date":564,"description":22,"extension":565,"meta":566,"navigation":80,"path":569,"seo":570,"stem":571,"tags":572,"toc":6,"__hash__":575},"blog\u002Fblog\u002F2022-11-17-python-requests.md","Using Python requests",[14,15],"gpt","pfarmer",{"type":17,"value":18,"toc":557},"minimark",[19,23,26,31,34,45,48,52,55,101,104,141,144,176,179,230,233,237,240,243,268,271,283,286,312,315,336,340,343,418,421,483,486,518,521,525,528,544,547,550,553],[20,21,22],"p",{},"The Python requests module is an elegant and simple HTTP library for making requests in Python. Requests allows you to send HTTP requests extremely easily. No need to manually add query strings to URLs, or form-encode your POST data. Keep-alive and HTTP connection pooling are 100% automatic, thanks to urllib3.",[20,24,25],{},"With requests, you can focus on interacting with APIs and web services without having to worry about all the fiddly underlying details. In this post, we'll go over some of the basics of using requests to help you get started.",[27,28,30],"h2",{"id":29},"installing-requests","Installing Requests",[20,32,33],{},"Installing requests is simple with pip:",[35,36,41],"pre",{"className":37,"code":39,"language":40},[38],"language-text","pip install requests\n","text",[42,43,39],"code",{"__ignoreMap":44},"",[20,46,47],{},"This will install the latest version of requests from PyPI.",[27,49,51],{"id":50},"making-requests","Making Requests",[20,53,54],{},"The requests module allows you to make HTTP requests extremely easily. Let's look at a simple GET request:",[35,56,60],{"className":57,"code":58,"language":59,"meta":44,"style":44},"language-python shiki shiki-themes github-light github-dark-default","import requests\n\nresponse = requests.get('https:\u002F\u002Fapi.example.com\u002Fdata')\n","python",[42,61,62,75,82],{"__ignoreMap":44},[63,64,67,71],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"sDgYj","import",[63,72,74],{"class":73},"szmH1"," requests\n",[63,76,78],{"class":65,"line":77},2,[63,79,81],{"emptyLinePlaceholder":80},true,"\n",[63,83,85,88,91,94,98],{"class":65,"line":84},3,[63,86,87],{"class":73},"response ",[63,89,90],{"class":69},"=",[63,92,93],{"class":73}," requests.get(",[63,95,97],{"class":96},"sNbzA","'https:\u002F\u002Fapi.example.com\u002Fdata'",[63,99,100],{"class":73},")\n",[20,102,103],{},"To make a POST request, just pass the data parameter:",[35,105,107],{"className":57,"code":106,"language":59,"meta":44,"style":44},"requests.post('https:\u002F\u002Fapi.example.com\u002Fuser', data={'name':'John'})\n",[42,108,109],{"__ignoreMap":44},[63,110,111,114,117,120,124,126,129,132,135,138],{"class":65,"line":66},[63,112,113],{"class":73},"requests.post(",[63,115,116],{"class":96},"'https:\u002F\u002Fapi.example.com\u002Fuser'",[63,118,119],{"class":73},", ",[63,121,123],{"class":122},"sjlk-","data",[63,125,90],{"class":69},[63,127,128],{"class":73},"{",[63,130,131],{"class":96},"'name'",[63,133,134],{"class":73},":",[63,136,137],{"class":96},"'John'",[63,139,140],{"class":73},"})\n",[20,142,143],{},"You can also pass query string parameters as a dictionary to the params argument:",[35,145,147],{"className":57,"code":146,"language":59,"meta":44,"style":44},"requests.get('https:\u002F\u002Fapi.example.com\u002Fsearch', params={'query':'requests'}) \n",[42,148,149],{"__ignoreMap":44},[63,150,151,154,157,159,162,164,166,169,171,174],{"class":65,"line":66},[63,152,153],{"class":73},"requests.get(",[63,155,156],{"class":96},"'https:\u002F\u002Fapi.example.com\u002Fsearch'",[63,158,119],{"class":73},[63,160,161],{"class":122},"params",[63,163,90],{"class":69},[63,165,128],{"class":73},[63,167,168],{"class":96},"'query'",[63,170,134],{"class":73},[63,172,173],{"class":96},"'requests'",[63,175,140],{"class":73},[20,177,178],{},"For POST requests, you may want to send data in JSON format. Set the json parameter to a dictionary:",[35,180,182],{"className":57,"code":181,"language":59,"meta":44,"style":44},"data = {'name':'John', 'age':22}\nrequests.post('https:\u002F\u002Fapi.example.com\u002Fuser', json=data)\n",[42,183,184,214],{"__ignoreMap":44},[63,185,186,189,191,194,196,198,200,202,205,207,211],{"class":65,"line":66},[63,187,188],{"class":73},"data ",[63,190,90],{"class":69},[63,192,193],{"class":73}," {",[63,195,131],{"class":96},[63,197,134],{"class":73},[63,199,137],{"class":96},[63,201,119],{"class":73},[63,203,204],{"class":96},"'age'",[63,206,134],{"class":73},[63,208,210],{"class":209},"sPgVT","22",[63,212,213],{"class":73},"}\n",[63,215,216,218,220,222,225,227],{"class":65,"line":77},[63,217,113],{"class":73},[63,219,116],{"class":96},[63,221,119],{"class":73},[63,223,224],{"class":122},"json",[63,226,90],{"class":69},[63,228,229],{"class":73},"data)\n",[20,231,232],{},"There are convenience methods like put(), delete(), head() and options() too for other HTTP verbs.",[27,234,236],{"id":235},"response-content","Response Content",[20,238,239],{},"The Response object returned by requests contains all the information about the request.",[20,241,242],{},"The status code is accessed through the status_code attribute:",[35,244,246],{"className":57,"code":245,"language":59,"meta":44,"style":44},"response = requests.get('https:\u002F\u002Fapi.example.com\u002Fdata')\nprint(response.status_code)\n",[42,247,248,260],{"__ignoreMap":44},[63,249,250,252,254,256,258],{"class":65,"line":66},[63,251,87],{"class":73},[63,253,90],{"class":69},[63,255,93],{"class":73},[63,257,97],{"class":96},[63,259,100],{"class":73},[63,261,262,265],{"class":65,"line":77},[63,263,264],{"class":209},"print",[63,266,267],{"class":73},"(response.status_code)\n",[20,269,270],{},"The text content is accessible by calling .text on the Response:",[35,272,274],{"className":57,"code":273,"language":59,"meta":44,"style":44},"print(response.text)\n",[42,275,276],{"__ignoreMap":44},[63,277,278,280],{"class":65,"line":66},[63,279,264],{"class":209},[63,281,282],{"class":73},"(response.text)\n",[20,284,285],{},"For JSON data, use the json() method:",[35,287,289],{"className":57,"code":288,"language":59,"meta":44,"style":44},"data = response.json()\nprint(data['name'])  \n",[42,290,291,300],{"__ignoreMap":44},[63,292,293,295,297],{"class":65,"line":66},[63,294,188],{"class":73},[63,296,90],{"class":69},[63,298,299],{"class":73}," response.json()\n",[63,301,302,304,307,309],{"class":65,"line":77},[63,303,264],{"class":209},[63,305,306],{"class":73},"(data[",[63,308,131],{"class":96},[63,310,311],{"class":73},"])\n",[20,313,314],{},"If any errors occur, you can check the Response error attribute. response.raise_for_status() will raise an exception if the status is 4XX or 5XX:",[35,316,318],{"className":57,"code":317,"language":59,"meta":44,"style":44},"response.raise_for_status()\nresponse.status_code == requests.codes.ok\n",[42,319,320,325],{"__ignoreMap":44},[63,321,322],{"class":65,"line":66},[63,323,324],{"class":73},"response.raise_for_status()\n",[63,326,327,330,333],{"class":65,"line":77},[63,328,329],{"class":73},"response.status_code ",[63,331,332],{"class":69},"==",[63,334,335],{"class":73}," requests.codes.ok\n",[27,337,339],{"id":338},"advanced-usage","Advanced Usage",[20,341,342],{},"Requests makes it easy to do more advanced operations like persisting sessions across requests using Sessions:",[35,344,346],{"className":57,"code":345,"language":59,"meta":44,"style":44},"session = requests.Session()\n\nsession.get('https:\u002F\u002Fapi.example.com\u002Fuser')\n\nr = session.post('https:\u002F\u002Fapi.example.com\u002Flogin', data={'user':'foo', 'pass':'bar'})\n",[42,347,348,358,362,371,376],{"__ignoreMap":44},[63,349,350,353,355],{"class":65,"line":66},[63,351,352],{"class":73},"session ",[63,354,90],{"class":69},[63,356,357],{"class":73}," requests.Session()\n",[63,359,360],{"class":65,"line":77},[63,361,81],{"emptyLinePlaceholder":80},[63,363,364,367,369],{"class":65,"line":84},[63,365,366],{"class":73},"session.get(",[63,368,116],{"class":96},[63,370,100],{"class":73},[63,372,374],{"class":65,"line":373},4,[63,375,81],{"emptyLinePlaceholder":80},[63,377,379,382,384,387,390,392,394,396,398,401,403,406,408,411,413,416],{"class":65,"line":378},5,[63,380,381],{"class":73},"r ",[63,383,90],{"class":69},[63,385,386],{"class":73}," session.post(",[63,388,389],{"class":96},"'https:\u002F\u002Fapi.example.com\u002Flogin'",[63,391,119],{"class":73},[63,393,123],{"class":122},[63,395,90],{"class":69},[63,397,128],{"class":73},[63,399,400],{"class":96},"'user'",[63,402,134],{"class":73},[63,404,405],{"class":96},"'foo'",[63,407,119],{"class":73},[63,409,410],{"class":96},"'pass'",[63,412,134],{"class":73},[63,414,415],{"class":96},"'bar'",[63,417,140],{"class":73},[20,419,420],{},"You can stream responses directly without having to load everything into memory:",[35,422,424],{"className":57,"code":423,"language":59,"meta":44,"style":44},"with requests.get('https:\u002F\u002Fapi.example.com\u002Fbigfile', stream=True) as r:\n    for chunk in r.iter_content(1024):\n        print(chunk)\n",[42,425,426,455,475],{"__ignoreMap":44},[63,427,428,431,433,436,438,441,443,446,449,452],{"class":65,"line":66},[63,429,430],{"class":69},"with",[63,432,93],{"class":73},[63,434,435],{"class":96},"'https:\u002F\u002Fapi.example.com\u002Fbigfile'",[63,437,119],{"class":73},[63,439,440],{"class":122},"stream",[63,442,90],{"class":69},[63,444,445],{"class":209},"True",[63,447,448],{"class":73},") ",[63,450,451],{"class":69},"as",[63,453,454],{"class":73}," r:\n",[63,456,457,460,463,466,469,472],{"class":65,"line":77},[63,458,459],{"class":69},"    for",[63,461,462],{"class":73}," chunk ",[63,464,465],{"class":69},"in",[63,467,468],{"class":73}," r.iter_content(",[63,470,471],{"class":209},"1024",[63,473,474],{"class":73},"):\n",[63,476,477,480],{"class":65,"line":84},[63,478,479],{"class":209},"        print",[63,481,482],{"class":73},"(chunk)\n",[20,484,485],{},"To use HTTP Basic Auth or Digest Auth, you can pass a tuple of (username, password) to the auth parameter:",[35,487,489],{"className":57,"code":488,"language":59,"meta":44,"style":44},"requests.get('https:\u002F\u002Fapi.example.com\u002F', auth=('user','pass'))\n",[42,490,491],{"__ignoreMap":44},[63,492,493,495,498,500,503,505,508,510,513,515],{"class":65,"line":66},[63,494,153],{"class":73},[63,496,497],{"class":96},"'https:\u002F\u002Fapi.example.com\u002F'",[63,499,119],{"class":73},[63,501,502],{"class":122},"auth",[63,504,90],{"class":69},[63,506,507],{"class":73},"(",[63,509,400],{"class":96},[63,511,512],{"class":73},",",[63,514,410],{"class":96},[63,516,517],{"class":73},"))\n",[20,519,520],{},"Requests supports proxies, timeout settings, SSL verification, and much more. See the full documentation for details.",[27,522,524],{"id":523},"recap","Recap",[20,526,527],{},"Hopefully this gives you a quick overview of how to get started with the Python requests module! Here's a quick recap:",[529,530,531,535,538,541],"ul",{},[532,533,534],"li",{},"Installing is easy with pip",[532,536,537],{},"Make HTTP requests with GET, POST, PUT, DELETE and more",[532,539,540],{},"Access response status, text, headers, JSON",[532,542,543],{},"Use advanced features like sessions, proxies, authentication",[20,545,546],{},"With its elegant API, Requests makes working with HTTP and APIs in Python a breeze. Be sure to check out the full documentation for more details. Happy making requests!",[20,548,549],{},"The requests module is a crucial part of the Python ecosystem. By handling the nitty-gritty details of making HTTP requests, it allows developers to focus on the essentials of their application. Requests makes integrating with web services and APIs a straightforward process.",[20,551,552],{},"I encourage you to try it out on your next Python project that involves any type of HTTP communication. The simple yet powerful API will quickly become something you can't live without!",[554,555,556],"style",{},"html pre.shiki code .sDgYj, html code.shiki .sDgYj{--shiki-default:#D73A49;--shiki-dark:#FF7B72}html pre.shiki code .szmH1, html code.shiki .szmH1{--shiki-default:#24292E;--shiki-dark:#E6EDF3}html pre.shiki code .sNbzA, html code.shiki .sNbzA{--shiki-default:#032F62;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjlk-, html code.shiki .sjlk-{--shiki-default:#E36209;--shiki-dark:#FFA657}html pre.shiki code .sPgVT, html code.shiki .sPgVT{--shiki-default:#005CC5;--shiki-dark:#79C0FF}",{"title":44,"searchDepth":84,"depth":84,"links":558},[559,560,561,562,563],{"id":29,"depth":77,"text":30},{"id":50,"depth":77,"text":51},{"id":235,"depth":77,"text":236},{"id":338,"depth":77,"text":339},{"id":523,"depth":77,"text":524},"2022-11-17","md",{"type":567,"layout":568},"post","blog_page","\u002Fblog\u002F2022-11-17-python-requests",{"title":12,"description":22},"blog\u002F2022-11-17-python-requests",[59,573,574],"programming","devops","oWvTltH_Oc8Ywu0eEYywckw6JpH0MMEKAVvJbogsnCA",[577,582],{"title":578,"path":579,"stem":580,"date":581,"children":-1},"Using Python logging","\u002Fblog\u002F2022-11-03-python-logging","blog\u002F2022-11-03-python-logging","2022-11-03",{"title":583,"path":584,"stem":585,"date":586,"children":-1},"Securing SSH with ssh keys","\u002Fblog\u002F2022-11-23-securing-ssh","blog\u002F2022-11-23-securing-ssh","2022-11-23",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":588},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":590},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594zM20 2v4m2-2h-4\"\u002F>\u003Ccircle cx=\"4\" cy=\"20\" r=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":592},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"\u002F>\u003Ccircle cx=\"12\" cy=\"7\" r=\"4\"\u002F>\u003C\u002Fg>",1783616166749]