以前咱们用了 urllib 库,这个做为入门的工具仍是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助。入门以后,咱们就须要学习一些更加高级的内容和工具来方便咱们的爬取。那么这一节来简单介绍一下 requests 库的基本用法。python
利用 pip 安装git
$ pip install requests
或者利用 easy_installgithub
$ easy_install requests
经过以上两种方法都可以完成安装。json
首先咱们引入一个小例子来感觉一下服务器
import requests r = requests.get('http://cuiqingcai.com') print type(r) print r.status_code print r.encoding #print r.text print r.cookies
以上代码咱们请求了本站点的网址,而后打印出了返回结果的类型,状态码,编码方式,Cookies等内容。cookie
运行结果以下app
<class 'requests.models.Response'> 200 UTF-8 <RequestsCookieJar[]>
怎样,是否是很方便。别急,更方便的在后面呢。工具
requests库提供了http全部的基本请求方式。例如post
r = requests.post("http://httpbin.org/post") r = requests.put("http://httpbin.org/put") r = requests.delete("http://httpbin.org/delete") r = requests.head("http://httpbin.org/get") r = requests.options("http://httpbin.org/get")
嗯,一句话搞定。学习
最基本的GET请求能够直接用get方法
r = requests.get("http://httpbin.org/get")
若是想要加参数,能够利用 params 参数
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get("http://httpbin.org/get", params=payload) print r.url
运行结果
http://httpbin.org/get?key2=value2&key1=value1
若是想请求JSON文件,能够利用 json() 方法解析
例如本身写一个JSON文件命名为a.json,内容以下
["foo", "bar", { "foo": "bar" }]
利用以下程序请求并解析
import requests r = requests.get("a.json") print r.text print r.json()
运行结果以下,其中一个是直接输出内容,另一个方法是利用 json() 方法解析,感觉下它们的不一样
["foo", "bar", { "foo": "bar" }] [u'foo', u'bar', {u'foo': u'bar'}]
若是想获取来自服务器的原始套接字响应,能够取得 r.raw 。 不过须要在初始请求中设置 stream=True 。
r = requests.get('https://github.com/timeline.json', stream=True) r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
这样就获取了网页原始套接字内容。
若是想添加 headers,能够传 headers 参数
import requests payload = {'key1': 'value1', 'key2': 'value2'} headers = {'content-type': 'application/json'} r = requests.get("http://httpbin.org/get", params=payload, headers=headers) print r.url
经过headers参数能够增长请求头中的headers信息
对于 POST 请求来讲,咱们通常须要为它增长一些参数。那么最基本的传参方法能够利用 data 这个参数。
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post("http://httpbin.org/post", data=payload) print r.text
运行结果
{ "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": null, "url": "http://httpbin.org/post" }
能够看到参数传成功了,而后服务器返回了咱们传的数据。
有时候咱们须要传送的信息不是表单形式的,须要咱们传JSON格式的数据过去,因此咱们能够用 json.dumps() 方法把表单数据序列化。
import json import requests url = 'http://httpbin.org/post' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) print r.text
运行结果
{ "args": {}, "data": "{\"some\": \"data\"}", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "16", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": { "some": "data" }, "url": "http://httpbin.org/post" }
经过上述方法,咱们能够POST JSON格式的数据
若是想要上传文件,那么直接用 file 参数便可
新建一个 a.txt 的文件,内容写上 Hello World!
import requests url = 'http://httpbin.org/post' files = {'file': open('test.txt', 'rb')} r = requests.post(url, files=files) print r.text
能够看到运行结果以下
{ "args": {}, "data": "", "files": { "file": "Hello World!" }, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "156", "Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": null, "url": "http://httpbin.org/post" }
这样咱们便成功完成了一个文件的上传。
requests 是支持流式上传的,这容许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象便可
with open('massive-body') as f: requests.post('http://some.url/streamed', data=f)
这是一个很是实用方便的功能。