python 爬虫之Requests 模块简介

󰃭 2017-04-04

安装

一行命令即可完成安装

pip install requests

请求

Get 请求

使用requests 发起GET请求的方式如下

不带参数的请求

import requests

if __name__ == '__main__':
    resp = requests.get('http://www.baidu.com')
    print(resp)

结果如下

<Response [200]>

得到的是一个响应状态吗为200的response 对象, 这个对象我们后面解释

以上就获取到了一个不带参数的请求

带参数的请求

当get请求格式如下时, 是怎么发起请求的呢

https://www.baidu.com/s?wd=test

如下

params = {'wd': 'test'}
resp = requests.get('https://www.baidu.com/s', params=params)
print(resp) # <Response [200]>
print(resp.url) # https://www.baidu.com/s?wd=test

也可以得到一个200的response对象

POST 请求

如果是 post 请求, 如何发起请求呢

一般的post 请求, 比如模仿 html的form 表单, 向服务器 post 表单数据, 格式如下即可


params = {'name': 'tony', 'age': '22'}
resp = requests.post('http://hostname.com/form/request', data=params)
print(resp)

即可

文件上传的方式暂时不做讲解, 一般爬虫并不会用到

设置header

很多请情况下, 我们需要设置请求 header, 比如refer, user-agent, 防止被爬取的对象封禁我们,

通过设置请求的 header 我们可以更真实的模仿浏览器的请求行为

 params = {'wd': 'test'}
 headers = {'User-Agent': ':Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
 resp = requests.get('https://www.baidu.com/s', params=params, headers=headers)
 print(resp)
 print(resp.url)

响应

请求发送出去后, 我们就获得了响应, 响应的内容是我们将要解析的主体.

当request是发送请求后, 获取到的就是响应的对象.

通过这个响应的对象, 我们可以获取很多的信息

请求url

带参数的get请求部分, 我们已经通过响应获得到了请求的url

resp.url # https://www.baidu.com/s?wd=test

响应状态码

resp.status_code # 200

响应头信息

resp.headers 
# {'Cache-control': 'no-cache', 'Content-Encoding': 'gzip', 'Date': 'Tue, 04 Apr 2017 13:49:26 GMT', 'Transfer-Encoding': 'chunked', 'Pragma': 'no-cache', 'Strict-Transport-Security': 'max-age=0', 'Server': 'bfe/1.0.8.18', 'Content-Type': 'text/html', 'P3P': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Set-Cookie': 'BD_NOT_HTTPS=1; path=/; Max-Age=300, BIDUPSID=7B1F39E2A8B96CBA2D9468C19E87D653; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1491313766; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, __bsi=16854702175177099500_00_13_N_N_4_0301_002F_N_N_N_0; expires=Tue, 04-Apr-17 13:49:31 GMT; domain=www.baidu.com; path=/', 'Connection': 'keep-alive', 'X-UA-Compatible': 'IE=Edge,chrome=1', 'Last-Modified': 'Tue, 14 Mar 2017 07:30:00 GMT'}

响应内容

resp.text
#'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>'
resp.content
#b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>'

resp.text 得到的是文本模式的响应内容, 一般都使用这种响应内容

resp.content 得到的是二进制模式的响应内容, 当返回的数据需要进行二进制解析的时候, 需要这种响应结果, 比如: 响应的内容就是图片的二进制结果

json格式响应

如果响应是 json 格式的, 我们也可以直接获取到json格式的响应

resp.json()

请求对象

通过响应对象, 我们还可以获取请求对象

request = resp.request
# <PreparedRequest [GET]>

通过这个request 对象, 我们就能直接获取请求的信息(request body, request url, request header…)


以上就是requests 包的常用内容,

下一篇我们将讲解 xpath 解析网页内容, 然后是requests + xpath 爬取网页并解析我们需要的结果,

如果在使用的过程中, 有对requests这个模块新的使用场景, 也将会继续补充本篇内容

另外, 如果以上内容有错误, 或者你有对requests 模块有想知道的使用场景, 请在评论中指出,