Requests库:基于Urllib,更为简单¶
请求:¶
-
各种请求方式
- 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')
- requests.get('http://httpbin.org/get')
-
解析json
- response.json()
- json.loads(response.text)
-
获取二进制数据
- response.content
-
添加headers(一般做爬虫都需要添加的嘞)
- header使用字典的格式传递: response = requests.get("https://www.zhihu.com/explore", headers=headers)
-
基本POST请求
- data以字典的格式进行传递: response = requests.post("http://httpbin.org/post", data=data)
响应¶
-
reponse属性
- print(type(response.status_code), response.status_code)
- print(type(response.headers), response.headers)
- print(type(response.cookies), response.cookies)
- print(type(response.url), response.url)
- print(type(response.history), response.history)
-
状态码判断
- response.status_code == requests.codes.not_found
- 很多的状态码,用到了再查询(课程文档也有)
文件上传¶
- requests.post("http://httpbin.org/post", files=files)
获取cookie¶
- 直接就有这个属性: print(response.cookies)
会话维持¶
- s = requests.Session() #使用会话
证书验证¶
-
https会检测证书是不是合法
- verify=False 取消证书验证
代理设置¶
- requests.get("https://www.taobao.com", proxies=proxies)
超时设置¶
- requests.get("http://httpbin.org/get", timeout = 0.5)
认证设置¶
- requests.get('http://120.27.34.24:9001', auth=HTTPBasicAuth('user', '123'))
- requests.get('http://120.27.34.24:9001', auth=('user', '123'))
异常处理¶
- ConnectionError, RequestException
- 查API
requests¶
实例引入¶
1 2 3 4 5 6 7 8 | import requests response = requests.get('https://www.baidu.com/') print(type(response)) print(response.status_code) print(type(response.text)) print(response.text) print(response.cookies) |
各种请求方式¶
1 2 3 4 5 6 | 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请求¶
基本写法¶
1 2 3 4 | import requests response = requests.get('http://httpbin.org/get') #get请求 print(response.text) |
1 2 3 4 5 6 7 8 9 10 11 12 | { "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.24.0", "X-Amzn-Trace-Id": "Root=1-5f0d4b0d-aa2e34e8979e8cba714124c0" }, "origin": "183.207.182.162", "url": "http://httpbin.org/get" } |
带参数GET请求¶
1 2 3 | import requests response = requests.get("http://httpbin.org/get?name=germey&age=22") #带参数 print(response.text) |
1 2 3 4 5 6 7 8 | import requests data = { 'name': 'germey', 'age': 22 } response = requests.get("http://httpbin.org/get", params=data) #将需要传递的参数使用字典传递,然后就可以自动的连接 print(response.text) |
解析json¶
1 2 3 4 5 6 7 8 9 | import requests import json response = requests.get("http://httpbin.org/get") print(type(response.text)) print(response.encoding) print(response.json()) #直接调用json方法 print(json.loads(response.text)) #利用json解析 print(type(response.json())) |
获取二进制数据¶
1 2 3 4 5 6 | import requests response = requests.get("https://github.com/favicon.ico") print(type(response.text), type(response.content)) #两种内容的类型 print(response.text) #str类型是乱码的,需要解析成二进制 print(response.content) #图片的二进制内容 |
1 2 3 4 5 6 | import requests response = requests.get("https://github.com/favicon.ico") with open('favicon.ico', 'wb') as f: #wb的格式打开 f.write(response.content) #二进制数据写入到本地 f.close() |
添加headers¶
1 2 3 4 5 | import requests response = requests.get("https://www.zhihu.com/explore") print(response.text) # 不加请求头可能就会出问题的 |
1 2 3 4 5 6 7 | import requests headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' } response = requests.get("https://www.zhihu.com/explore", headers=headers) print(response.text) |
基本POST请求¶
1 2 3 4 5 | import requests data = {'name': 'germey', 'age': '22'} response = requests.post("http://httpbin.org/post", data=data) print(response.text) |
1 2 3 4 5 6 7 8 | import requests data = {'name': 'germey', 'age': '22'} headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' } response = requests.post("http://httpbin.org/post", data=data, headers=headers) print(response.json()) |
响应¶
reponse属性¶
1 2 3 4 5 6 7 8 | import requests response = requests.get('http://www.baidu.com') print(type(response.status_code), response.status_code) print(type(response.headers), response.headers) print(type(response.cookies), response.cookies) print(type(response.url), response.url) print(type(response.history), response.history) |
状态码判断¶
1 2 3 4 | import requests response = requests.get('http://www.jianshu.com') print("请求成功") if not response.status_code == 200 else print('Request Successfully') |
1 2 3 4 | import requests response = requests.get('http://www.jianshu.com') exit() if not response.status_code == 200 else print('Request Successfully') |
1 2 3 | import requests print(requests.codes.gateway_timeout) print(requests.codes.not_found) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | 100: ('continue',), 101: ('switching_protocols',), 102: ('processing',), 103: ('checkpoint',), 122: ('uri_too_long', 'request_uri_too_long'), 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), 201: ('created',), 202: ('accepted',), 203: ('non_authoritative_info', 'non_authoritative_information'), 204: ('no_content',), 205: ('reset_content', 'reset'), 206: ('partial_content', 'partial'), 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), 208: ('already_reported',), 226: ('im_used',), # Redirection. 300: ('multiple_choices',), 301: ('moved_permanently', 'moved', '\\o-'), 302: ('found',), 303: ('see_other', 'other'), 304: ('not_modified',), 305: ('use_proxy',), 306: ('switch_proxy',), 307: ('temporary_redirect', 'temporary_moved', 'temporary'), 308: ('permanent_redirect', 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 # Client Error. 400: ('bad_request', 'bad'), 401: ('unauthorized',), 402: ('payment_required', 'payment'), 403: ('forbidden',), 404: ('not_founresponse.status_code == requests.codes.not_foundd', '-o-'), 405: ('method_not_allowed', 'not_allowed'), 406: ('not_acceptable',), 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), 408: ('request_timeout', 'timeout'), 409: ('conflict',), 410: ('gone',), 411: ('length_required',), 412: ('precondition_failed', 'precondition'), 413: ('request_entity_too_large',), 414: ('request_uri_too_large',), 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), 417: ('expectation_failed',), 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), 421: ('misdirected_request',), 422: ('unprocessable_entity', 'unprocessable'), 423: ('locked',), 424: ('failed_dependency', 'dependency'), 425: ('unordered_collection', 'unordered'), 426: ('upgrade_required', 'upgrade'), 428: ('precondition_required', 'precondition'), 429: ('too_many_requests', 'too_many'), 431: ('header_fields_too_large', 'fields_too_large'), 444: ('no_response', 'none'), 449: ('retry_with', 'retry'), 450: ('blocked_by_windows_parental_controls', 'parental_controls'), 451: ('unavailable_for_legal_reasons', 'legal_reasons'), 499: ('client_closed_request',), # Server Error. 500: ('internal_server_error', 'server_error', '/o\\', '✗'), 501: ('not_implemented',), 502: ('bad_gateway',), 503: ('service_unavailable', 'unavailable'), 504: ('gateway_timeout',), 505: ('http_version_not_supported', 'http_version'), 506: ('variant_also_negotiates',), 507: ('insufficient_storage',), 509: ('bandwidth_limit_exceeded', 'bandwidth'), 510: ('not_extended',), 511: ('network_authentication_required', 'network_auth', 'network_authentication'), |
高级操作¶
文件上传¶
1 2 3 4 5 | import requests files = {'file': open('favicon.ico', 'rb')} response = requests.post("http://httpbin.org/post", files=files) print(response.text) |
获取cookie¶
1 2 3 4 5 6 | import requests response = requests.get("https://www.baidu.com") print(response.cookies) for key, value in response.cookies.items(): print(key + '=' + value) |
会话维持¶
模拟登录
1 2 3 4 5 | import requests requests.get('http://httpbin.org/cookies/set/number/123456789') response = requests.get('http://httpbin.org/cookies') print(response.text) |
1 2 3 4 5 6 7 | # 维持 import requests s = requests.Session() #使用会话 s.get('http://httpbin.org/cookies/set/number/123456789') #设置cookie response = s.get('http://httpbin.org/cookies') #获取cookie print(response.text) |
证书验证¶
1 2 3 4 | import requests response = requests.get('https://www.12306.cn') print(response.status_code) |
1 2 3 4 5 | import requests from requests.packages import urllib3 urllib3.disable_warnings() #取消显示警告信息 response = requests.get('https://www.12306.cn', verify=False) print(response.status_code) |
1 2 3 4 | import requests response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key')) #手动指定证书 print(response.status_code) |
1 2 3 | import requests response = requests.get("https://www.12306.cn/mormhweb/") print( response.text) |
代理设置¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import requests def proxy(): # 代理服务器 proxyHost = "u2999.10.tn.16yun.cn" proxyPort = "6442" # # # 代理隧道验证信息 proxyUser = "16VNOVSV" proxyPass = "050601" proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % { "host": proxyHost, "port": proxyPort, "user": proxyUser, "pass": proxyPass, } proxy = { "http": proxyMeta, "https": proxyMeta, } return proxy proxies = proxy() print(proxies) response = requests.get("https://www.baidu.com", proxies=proxies) print(response.status_code) print(response.text) |
超时设置¶
1 2 3 4 5 6 7 | import requests from requests.exceptions import ReadTimeout try: response = requests.get("http://httpbin.org/get", timeout = 0.5) print(response.status_code) except ReadTimeout: print('Timeout') |
认证设置¶
1 2 3 4 5 6 7 8 9 10 | import requests from requests.auth import AuthBase from requests.auth import HTTPBasicAuth # 用户名以及密码 auth = HTTPBasicAuth("tom枫明".encode('utf-8'),"123456") resopnse = requests.post("http://pythonscraping.com/pages/auth/login.php",auth=auth) print(response.status_code) |
异常处理¶
1 2 3 4 5 6 7 8 9 10 11 | import requests from requests.exceptions import ReadTimeout, ConnectionError, RequestException try: response = requests.get("http://httpbin.org/get", timeout = 0.5) print(response.status_code) except ReadTimeout: #超时 print('Timeout') except ConnectionError: #连接 print('Connection error') except RequestException: #请求异常 print('Error') |