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 模块有想知道的使用场景, 请在评论中指出,