python网络爬虫--requests库

requests 安装

  • pip install requests
  • easy_install requests

requests库基础方法

requests库提供了http所有的基本请求方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
requests.request() : 
构造一个请求,支撑一下各方法的的基础方法

requests.get('http://www.baidu.com') :
获取HTML网页的主要方法,对应于HTTP的GET

requests.head('http://httpbin.org/get') :
获取HTML网页头信息的方法,对应于HTTP的HEAD

requests.post('http://httpbin.org/post', data = {'key':'value'}) :
向HTML网页提交POST请求的方法,对应于HTTP的POST

requests.put('http://httpbin.org/post', data = {'key':'value'}) :
向HTML网页提交PUT请求的方法,对应于HTTP的PUT

requests.patch() :
向网页提交局部修改请求,对应于HTTP的PATCH

requests.delete('http://httpbin.org/delete') :
行HTML页面提交删除请求,对应于HTTP的DELETE

requests.option('http://httpbin.org/get')

GET请求

  1. 最基本的GET请求可直接使用get方法,使用r.url打印出URL地址

    1
    2
    3
    4
    >>> import requests
    >>> r = requests.get('http://www.baidu.com')
    >>> print r.url
    http://www.baidu.com/
  2. 传递URL参数
    requests允许使用parmas关键字参数,以一个字符串字典来提供这些参数

    demo:

    1
    2
    3
    4
    5
    >>> import requests
    >>> payload = {'key_1':'value1','key_2':'value2'}
    >>> r = requests.get('http://www.baidu.com',params = payload)
    >>> print r.url
    http://www.baidu.com/?key_1=value1&key_2=value2

    注意:字典里值为none的键不会被添加到url的查询字典中

    或者可以将一个列表作为值传入:

    1
    2
    3
    4
    5
    >>> import requests
    >>> payload = {'key_1':'value1','key_2':['value2-1','value2-2']}
    >>> r = requests.get('http://www.baidu.com',params = payload)
    >>> print r.url
    http://www.baidu.com/?key_1=value1&key_2=value2-1&key_2=value2-2

响应内容

普通响应

使用r.text可以读取服务器响应内容。

1
2
3
4
>>> import requests
>>> r = requests.get('http://www.baidu.com')
>>> r.text
u'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv...

r.encoding设置编码

1
2
3
>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'

二进制响应

以字节的方式访问请求响应体,对于非文本请求:

1
2
>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://...

JSON 响应内容

Requests 中有一个内置的 JSON 解码器,可处理 JSON 数据:

1
2
3
4
5
>>> import requests

>>> r = requests.get('https://www.baidu.com')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://...

使用 r.raise_for_status() 或者检查 r.status_code 检查请求是否成功

原始响应内容

如果向获取来自服务器的原始套接字响应,可以使用r.raw。不过需要在初始请求中设置stream=True
demo:

1
2
3
4
5
6
>>> import requests
>>> r = requests.get('http://www.baidu.com',stream=True)
>>> print r.raw
<urllib3.response.HTTPResponse object at 0x03EA4F90>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

一般情况下,以下面的模式将文本流保存到文件:

1
2
3
with open(filename, 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)

定制请求头

如果想添加headers,可以传headers参数

1
2
3
4
5
6
>>> import requests
>>> payload = {'key_1':'value1','key_2':'value1'}
>>> headers = {'content-type':'application/json'}
>>> r = requests.get("http://www.baidu.com", params=payload, headers=headers)
>>> print r.url
http://www.baidu.com/?key_1=value1&key_2=value1

注意: 定制 header 的优先级低于某些特定的信息源,例如:

  • 如果在 .netrc中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth= 参数,.netrc 的设置就无效了。
  • 如果被重定向到别的主机,授权 header 就会被删除。
  • 代理授权 header 会被 URL 中提供的代理身份覆盖掉。
  • 在能判断内容长度的情况下,header 的 Content-Length 会被改写。
  • 所有的 header 值必须是 string、bytestring 或者 unicode

POST请求

最基本的传参方法可以利用data参数

1
2
3
4
5
import requests

payload = {'key_1': 'value_1', 'key_2': 'value_2'}
r = requests.post("http://www.baidu.com", data=payload)
print r.text