知识点一:Requests的详解及其基本使用方法
-
什么是requests库
Requests库是用Python编写的,基于urllib,采用Apache2 Licensed开源协议的HTTP库,相比urllib库,Requests库更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。
Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其实urllib还是非常不方便的,
而Requests它会比urllib更加方便,可以节约我们大量的工作。(用了requests之后,你基本都不愿意用urllib了)一句话,requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。
默认安装好python之后,是没有安装requests模块的,需要单独通过pip安装
-
安装
pip insatll request
-
Requests库的用法详解
-
试例
import requests response = requests.get('http://www.baidu.com/')#首先调用requests的get方法 print(type(response)) print(response.status_code) print(type(response.text)) print(response.text)#不需要解码就可以直接打印信息print(response.cookies) print(response.cookies)
-
各种请求方式(HTTP测试网站:http://httpbin.org/)
import requests requests.post('http://httpbin.org/post') requests.put('http://httpbin.org/put') requests.delete('http://httpbin.org/delete') requests.head('http://httpbin.org/get') requests.options('http://httpbin.org/get')
-
请求
-
GET请求
-
基本get请求
import requests response = requests.get('http://httpbin.org/get') print(response.text)#对比urllib,无需用decode解码
-
带参GET请求
import requests response = requests.get('http://httpbin.org/get?name=Arise&age=22') print(response.text)
另一种写法:
import requests data = { 'name':'Arise', 'age':22 }
#直接使用requests.get的params参数即可实现以上的操作 response = requests.get('http://httpbin.org/get',params = data) print(response.text) -
解析JSON
import requests response = requests.get('http://httpbin.org/get') print(type(response.text)) print(response.json()) #可以对比一下Json转化的和直接调用response的Json方法的区别print(response.json()) print(type(response.json()))
另一种方式比较:
import requests import json response = requests.get('http://httpbin.org/get') print(type(response.text)) print(response.json()) print(json.loads(response.text)) print(type(response.json()))
-
获取二进制数据(图片,音频的下载)
import requests response2 = requests.get('https://github.com/favicon.ico')
print(type(response2.text),type(response2.content)) print(response2.text) print(response2.content)将图片抓取下来:
import requests response2 = requests.get('https://github.com/favicon.ico') with open('E://favicon.ico','wb')as f: f.write(response2.content) f.close()
-
添加headers
-
没有headers时,有可能获取不了网页源代码
import requests #不加headers有可能会被禁,造成爬取失败 response = requests.get('http://www.zhihu.com/explore') print(response.text)
获取的结果:
400 Bad Request "white">400 Bad Request
openresty -
有headers情况下,获取网页源代码
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'} response = requests.get('http://www.zhihu.com/explore', headers=headers) print(response.text)
获取的结果:
"zh-CN" dropEffect="none" class="no-js no-auth "> "utf-8" /> "X-UA-Compatible" content="IE=edge,chrome=1" /> "renderer" content="webkit" /> "X-ZA-Response-Id" content="1f0be26a2a6632839cfb9ce762ba9d07"> "X-ZA-Experiment" content="default:None,ge3:ge3_9,ge2:ge2_1,nwebQAGrowth:experiment,is_office:false,nweb_growth_people:default,is_show_unicom_free_entry:unicom_free_entry_off,app_store_rate_dialog:close,android_profile_panel:panel_b,search_advert_position:1,live_store:ls_a2_b2_c1_f2,nweb_search:nweb_search_heifetz,search_hybrid_tabs:pin-3#album-7,new_live_feed_mediacard:new,hybrid_zhmore_video:yes,new_mobile_column_appheader:new_header,search_tab:collapse,rt:y,ad_r:a,growth_search:s2,qaweb_related_readings_content_control:close,android_pass_through_push:all,new_sign_bg:new,new_mobile_app_header:true,np:1,android_search_tab_style:search_tab_style_b,u_re:0,android_db_recommend_action:open,zcm-lighting:zcm,android_db_feed_hash_tag_style:button,mobile_feed_guide:block,qrcode_login:qrcode,is_new_noti_panel:no,nweb_search_suggest:default">
发现 - 知乎 ... ... ... ...
-
-
-
POST请求
-
基本POST请求
import requests data ={'name':'Arise','age':22} response = requests.post('http://httpbin.org/post',data = data) print(response.text)
获取的结果:
{ "args": {}, "data": "", "files": {}, "form": { "age": "22", "name": "Arise" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "17", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "112.91.182.26", "url": "http://httpbin.org/post" }
-
加headers的请求
import requests data ={'name':'Arise','age':22} headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} response2 = requests.post('http://httpbin.org/post',data = data,headers = headers) print(response2.json())
获取的结果:
{'args': {}, 'data': '', 'files': {}, 'form': {'age': '22', 'name': 'Arise'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Content-Length': '17', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}, 'json': None, 'origin': '112.91.182.26', 'url': 'http://httpbin.org/post'}
-
-
-
响应
-
response属性
import requests #常用的response属性 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} response3 = requests.get('http://www.jianshu.com',headers = headers) print(type(response3.status_code),response3.status_code) print(type(response3.headers),response3.headers) print(type(response3.cookies),response3.cookies) print(type(response3.url),response3.url) print(type(response3.history),response3.history)
获得的结果:
<class 'int'> 200 <class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Tue, 07 Aug 2018 03:47:28 GMT', 'Server': 'Tengine', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'ETag': 'W/"679a5982b15c1b6676846b75321c20c4"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': 'locale=zh-CN; path=/', 'X-Request-Id': 'afbf2087-b6d0-42e9-8c10-f5fc13a8568e', 'X-Runtime': '0.007606', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'Content-Encoding': 'gzip', 'X-Via': '1.1 wj29:0 (Cdn Cache Server V2.0), 1.1 PSlndlwtvb8:10 (Cdn Cache Server V2.0), 1.1 PSgdgzwt5yu38:1 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive', 'X-Dscp-Value': '0'} <class 'requests.cookies.RequestsCookieJar'>
for www.jianshu.com/>]> <class 'str'> https://www.jianshu.com/ <class 'list'> [ ] -
状态码判断
import requests response4 = requests.get('http://www.baidu.com') exit() if not response4.status_code ==requests.codes.ok else print('Requst Successfully') #判断响应的状态码,如果为200,打印“Request Sucessfully”,否则退出!
另一种方式:
import requests response4 = requests.get('http://www.baidu.com') exit() if not response4.status_code ==200 else print('Requst Successfully') #exit() if not response4.status_code ==requests.codes.ok else print('Requst Successfully')
一些状态码对应的内容:
1 100: ('continue',), 2 101: ('switching_protocols',), 3 102: ('processing',), 4 103: ('checkpoint',), 5 122: ('uri_too_long', 'request_uri_too_long'), 6 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\o/', '✓'), 7 201: ('created',), 8 202: ('accepted',), 9 203: ('non_authoritative_info', 'non_authoritative_information'), 10 204: ('no_content',), 11 205: ('reset_content', 'reset'), 12 206: ('partial_content', 'partial'), 13 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), 14 208: ('already_reported',), 15 226: ('im_used',), 16 17 Redirection. 18 300: ('multiple_choices',), 19 301: ('moved_permanently', 'moved', '\o-'), 20 302: ('found',), 21 303: ('see_other', 'other'), 22 304: ('not_modified',), 23 305: ('use_proxy',), 24 306: ('switch_proxy',), 25 307: ('temporary_redirect', 'temporary_moved', 'temporary'), 26 308: ('permanent_redirect', 27 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 28 29 Client Error. 30 400: ('bad_request', 'bad'), 31 401: ('unauthorized',), 32 402: ('payment_required', 'payment'), 33 403: ('forbidden',), 34 404: ('not_found', '-o-'), 35 405: ('method_not_allowed', 'not_allowed'), 36 406: ('not_acceptable',), 37 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), 38 408: ('request_timeout', 'timeout'), 39 409: ('conflict',), 40 410: ('gone',), 41 411: ('length_required',), 42 412: ('precondition_failed', 'precondition'), 43 413: ('request_entity_too_large',), 44 414: ('request_uri_too_large',), 45 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), 46 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), 47 417: ('expectation_failed',), 48 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), 49 421: ('misdirected_request',), 50 422: ('unprocessable_entity', 'unprocessable'), 51 423: ('locked',), 52 424: ('failed_dependency', 'dependency'), 53 425: ('unordered_collection', 'unordered'), 54 426: ('upgrade_required', 'upgrade'), 55 428: ('precondition_required', 'precondition'), 56 429: ('too_many_requests', 'too_many'), 57 431: ('header_fields_too_large', 'fields_too_large'), 58 444: ('no_response', 'none'), 59 449: ('retry_with', 'retry'), 60 450: ('blocked_by_windows_parental_controls', 'parental_controls'), 61 451: ('unavailable_for_legal_reasons', 'legal_reasons'), 62 499: ('client_closed_request',), 63 64 Server Error. 65 500: ('internal_server_error', 'server_error', '/o\', '✗'), 66 501: ('not_implemented',), 67 502: ('bad_gateway',), 68 503: ('service_unavailable', 'unavailable'), 69 504: ('gateway_timeout',), 70 505: ('http_version_not_supported', 'http_version'), 71 506: ('variant_also_negotiates',), 72 507: ('insufficient_storage',), 73 509: ('bandwidth_limit_exceeded', 'bandwidth'), 74 510: ('not_extended',), 75 511: ('network_authentication_required', 'network_auth', 'network_authentication'),
1 1.信息提示 2 3 0代表本地响应成功 4 5 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分 6 7 101 - Switching Protocols 服务器将遵从客户的请求转换到另外一种协议 8 9 2.请求成功 10 11 200 - OK 一切正常,对GET和POST请求的应答文档跟在后面 12 13 201 - Created 服务器已经创建了文档,Location头给出了它的URL 14 15 202 - Accepted 已经接受请求,但处理尚未完成 16 17 203 - Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝,非权威性信息 18 19 204 - No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的 20 21 205 - Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容 22 23 206 - Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它 24 25 3.重定向 26 27 300 - Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。 28 29 301 - Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。 30 31 302 - Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求 http://host/~user (缺少了后面的斜杠),有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。 32 33 303 - See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。 34 35 304 - Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 36 37 305 - Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取 38 39 307 - Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。 40 41 4.客户端错误 42 43 400 - Bad Request 请求出现语法错误。 44 45 401 - Unauthorized 访问被拒绝,客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: 46 47 401.1 - 登录失败。 48 49 401.2 - 服务器配置导致登录失败。 50 51 401.3 - 由于 ACL 对资源的限制而未获得授权。 52 53 401.4 - 筛选器授权失败。 54 55 401.5 - ISAPI/CGI 应用程序授权失败。 56 57 401.7 – 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。 58 59 403 - Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因: 60 61 403.1 - 执行访问被禁止。 62 63 403.2 - 读访问被禁止。 64 65 403.3 - 写访问被禁止。 66 67 403.4 - 要求 SSL。 68 69 403.5 - 要求 SSL 128。 70 71 403.6 - IP 地址被拒绝。 72 73 403.7 - 要求客户端证书。 74 75 403.8 - 站点访问被拒绝。 76 77 403.9 - 用户数过多。 78 79 403.10 - 配置无效。 80 81 403.11 - 密码更改。 82 83 403.12 - 拒绝访问映射表。 84 85 403.13 - 客户端证书被吊销。 86 87 403.14 - 拒绝目录列表。 88 89 403.15 - 超出客户端访问许可。 90 91 403.16 - 客户端证书不受信任或无效。 92 93 403.17 - 客户端证书已过期或尚未生效。 94 95 403.18 - 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。 96 97 403.19 - 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。 98 99 403.20 - Passport 登录失败。这个错误代码为 IIS 6.0 所专用。 100 101 404 - Not Found 无法找到指定位置的资源。这也是一个常用的应答 102 103 404.0 -(无) – 没有找到文件或目录 104 105 404.1 - 无法在所请求的端口上访问 Web 站点 106 107 404.2 - Web 服务扩展锁定策略阻止本请求 108 109 404.3 - MIME 映射策略阻止本请求 110 111 405 - Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用,用来访问本页面的 HTTP 谓词不被允许(方法不被允许) 112 113 406 - Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容,客户端浏览器不接受所请求页面的 MIME 类型 114 115 407 - Proxy Authentication Required 要求进行代理身份验证,类似于401,表示客户必须先经过代理服务器的授权 116 117 408 - Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求 118 119 409 - Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。 120 121 410 - Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用 122 123 411 - Length Required 服务器不能处理请求,除非客户发送一个Content-Length头 124 125 412 - Precondition Failed 请求头中指定的一些前提条件失败器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头 126 127 414 - Request URI Too Long URI太长 128 129 415 – 不支持的媒体类型 130 131 416 – Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头 132 133 417 – 执行失败 134 135 423 – 锁定的错误 136 137 5.服务器错误 138 139 500 - Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。 140 141 500.12 - 应用程序正忙于在 Web 服务器上重新启动。 142 143 500.13 - Web 服务器太忙。 144 145 500.15 - 不允许直接请求 Global.asa。 146 147 500.16 – UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。 148 149 500.18 – URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。 150 151 500.100 - 内部 ASP 错误。 152 153 501 - Not Implemented 服务器不支持实现请求所需要的功能,页眉值指定了未实现的配置。例如,客户发出了一个服务器不支持的PUT请求。 154 155 502 - Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。 亦说Web 服务器用作网关或代理服务器时收到了无效响应。 156 157 502.1 - CGI 应用程序超时。 158 159 502.2 - CGI 应用程序出错。 160 161 503 - Service Unavailable 服务不可用,服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。这个错误代码为 IIS 6.0 所专用。 162 163 504 - Gateway Timeout 网关超时,由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新) 。 164 165 · 505 - HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。
-
-
高级操作
-
文件上传
file = {'file':open('favicon.ico','rb')}#将之前抓取的github图标以二进制格式读取 response = requests.post('http://httpbin.org/post',files = file) print(response.text)
获取的内容:
{ "args": {}, "data": "", "files": { "file": "data:application/octet-stream;base64,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AAAAAAAAKysrBhYWGUcWFhiVFRUYvxUVGNkWFhfzFhYX8xUVGNkVFRi/FhYYlRYWGUcrKysGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" }, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "6665", "Content-Type": "multipart/form-data; boundary=f955136a56ab4e4880a9e7de31f96a96", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "112.91.182.26", "url": "http://httpbin.org/post" }
-
获取cookie
import requests response = requests.get('http://www.baidu.com') #相比urllib,就不需要声明任何变量print(response.cookies) print(response.cookies) for key,value in response.cookies.items(): print(key + '=' + value)
获得的内容:
for .baidu.com/>]> BDORZ=27315 -
会话维持(一般用于模拟登陆)
import requests requests.get('http://httpbin.org/cookies/set/number/123456789')#为网站的访问设置cookie response = requests.get('http://httpbin.org/cookies')#与上面的行为时独立的,所以获取不到任何与cookie相关的信息 print(response.text)
{ "cookies": {} }
可以发现,我们传入的cookie,然而并没有获取到,这是因为没有确定是一个会话。解决方法如下:
import requests s = requests.Session()#通过声明Session对象,在使用这个对象发起两次GET请求(相当于同一个浏览器发出来的请求) s.get('http://httpbin.org/cookies/set/number/123456789') response = s.get('http://httpbin.org/cookies') print(response.text)
{ "cookies": { "number": "123456789" } }
-
证书验证
import requests response = requests.get('https://www.12306.cn') print(response.status_code) #因为这个网站的https证书,不是官方的,认为是伪证书,会报错
解决方法:
import requests response = requests.get('https://www.12306.cn',verify=False)#设置参数解决 print(response.status_code)
或者:
import requests #通过一下两行代码即可把警报消除,即使verify=False,报警还是存在的 from requests.packages import urllib3 urllib3.disable_warnings() #首先会检测证书是否合法,通过verify就可以设置成False就可关闭错误提示 response = requests.get('https://www.12306.cn',verify = False) print(response.status_code)
-
代理设置
import requests proxies = { "http":"http://hk.tiyun.tk:4613", "https":"https://hk.tiyun.tk:4613" } response = requests.get('http://www.taobao.com',proxies = proxies) print(response.status_code)
-
有密码的设置:
import requests proxies = { "http":"http://user:[email protected]:4613", "https":"https://user:[email protected]:4613", } response = requests.get('http://www.taobao.com',proxies = proxies) print(response.status_code)
-
socket代理设置
- 安装
pip install requests[socks]
- 使用
import requests proxies = { 'http':'socks5//127.0.0.1:1080/pac?auth=HgT2fpms98njlh9QGpsP&t=201803030916114202', 'https':'socks5//127.0.0.1:1080/pac?auth=HgT2fpms98njlh9QGpsP&t=201803030916114202', } response = requests.get('http://www.taobao.com',proxies = proxies) print(response.status_code)
-
-
超时设置
#可以通过修改时间或是访问国外网站,会出现ReaTimeout报警 import requests from requests.exceptions import ReadTimeout try: response = requests.get('http://www.baidu.com',timeout = 0.1) print(response.status_code) except ReadTimeout: print('TIMEOUT')
-
认证设置(登录验证)
import requests from requests.auth import HTTPBasicAuth #也可以是auth={'user','123'}以字典的形式传入 r = requests.get('http://120.27.34.24.9001',auth = HTTPBasicAuth('user','123')) print(r.status_cde)
-
异常处理(官方文档)
import requests #首先先捕获ReadTimeout,网络不通捕获ConnectionError,抓取异常捕获RequestException from requests.exceptions import ReadTimeout,ConnectionError,RequestException try: response1 = requests.get('http://httpbin.org/get',timeout = 0.1) print(response.status_code) except ReadTimeout: print('TIMEOUUT') except ConnectionError: print('Connection Error') except RequestException: print('Error')
-