【前言】requests 模块是 python 基于 urllib的 HTTP 库,它比 urllib 更加方便,完全满足 HTTP 测试需求。这里之所以把它放在爬虫基础里介绍,是因为它在网络爬虫代码里最为常用。使用requests库,可以方便快捷地获取一个Web页面的源代码,用作下一步分析和提取需求数据。注意,使用这个模块之前需要先安装。
GET:使用GET请求方式获取URL位置的资源(最常用)
HEAD:获取资源的头部信息
POST:使用POST请求方式获取URL位置的资源
PUT:请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH:请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE:请求删除URL位置存储的资源
requests模块的GET方法,对应HTTP中的GET请求。主要用来向Web页面发送请求,得到响应数据,即Web页面的内容。这是网络爬虫迈出的第一步!
(一)基本语法
语法:resp = requests.get(url)
注释:
(二)常用参数
1、url
字符串类型,requests 发起请求的地址。
url为基准的url地址,不包含查询参数。
示例代码:
import requestsurl = 'https://www.baidu.com'resp = requests.get(url)print(resp)运行结果:<Response [200]>
【注】运行结果显示,requests的get方法返回的是一个Response对象,200是状态码,表示响应状态为正常(OK)。
2、params
字典类型,用来携带查询参数。
该方法会自动对params字典进行编码,然后和url拼接。
示例代码:
import requestsurl = 'https://www.baidu.com'params = {'wd' : 'python'}resp = requests.get(url, params = params)
【注】上面代码实际的请求地址是https://www.baidu.com/s?wd=python
3、headers
字典类型,请求头,用来携带请求标头信息。
有些网站为了防止爬虫,要求请求信息中必须携带标头信息。因为正常使用浏览器访问网站时,标头信息中会包含浏览者的操作系统、浏览器类型等信息,而爬虫是使用requests模块发送的请求,默认请求头内容为空,所以可以简单阻挡爬虫的访问。
请求头中最常用的参数是User-Agent,即很多网站需要检测的内容。获取User-Agent的方法和步骤如下(网络抓包):
以上过程的演示视频如下:
示例代码:
import requestsurl = 'https://www.baidu.com'params = {'wd': 'python'}headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48'}resp = requests.get(url, params=params, headers=headers)
【注】上面代码中的headers的内容,就是复制粘贴过来的User-Agent信息,需要自行改成字典格式。
4、cookies
字典类型,携带登录状态等信息。
有些网站需要请求中携带cookies信息,可以使用上面获取User-Agent信息的方法来获取,这里不再演示。
5、proxies
字典类型,用来设置代理 ip 服务器,获取和使用方法同上。
6、timeout
整数类型,用于设定请求超时时间, 单位为秒。
timeout参数在写爬虫时非常重要。
有时可能由于网络或服务器等原因,使得访问页面响应变得很慢或者干脆没有响应,如果我们的requests请求没有设置超时时间,那么程序就会卡死。因此在写爬虫时,如果爬取的url地址很多,那么就需要在requests的get方法中设置超时时间,超过时限就会跳过这个url地址继续爬取下面的url。
(三)response常用属性和方法
response即requests.get()的返回结果,通过response的属性和方法就可以获得目标页面的各种数据。
1、status_code属性
status_code即状态码,http请求的返回状态,若为200则表示请求成功。
在爬虫代码中,通常使用status_code属性,跳出响应异常的requests请求或者结束程序运行。
示例代码:
import requestsurl = 'https://www.baidu.com'resp = requests.get(url)if resp.status_code != 200: raise Exception('请求发生异常!')print(resp.status_code)
2、text属性
http响应内容的字符串形式,即返回的页面内容。爬虫就是解析这个内容,获取需要爬取的数据。
示例代码:
import requestsurl = 'https://www.baidu.com'resp = requests.get(url)if resp.status_code != 200: raise Exception('请求发生异常!')print(resp.text)运行结果:<!DOCTYPE html><!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>ç¾åº¦ä¸ä¸ï¼ä½ å°±ç¥é</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class='bg s_ipt_wr'><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class='bg s_btn_wr'><input type=submit id=su value=ç¾åº¦ä¸ä¸ class='bg s_btn' autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ°é»</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>å°å¾</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§é¢</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>ç»å½</a> </noscript> <script>document.write('<a href='http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === '' ? '?' : '&')+ 'bdorz_come=1')+ '' name='tj_login' class='lb'>ç»å½</a>'); </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style='display: block;'>æ´å¤äº§å</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å
³äºç¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使ç¨ç¾åº¦åå¿
读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>æè§åé¦</a> 京ICPè¯030173å· <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
3、content属性
http响应内容的二进制形式,语法同上。
4、encoding属性
用来设置response的编码格式,如果请求的页面中包含中文,那么就需要设置encoding属性。
示例代码:
resp.encoding = 'utf-8' 或 resp.encoding = 'gbk'
5、raise_for_status()方法
该方法判断status_code是否等于200,如果不等于,则抛出异常。功能与我们自己写的判断语句相同,但是不能自行设置错误提示信息。
6、json()方法
获取http响应内容的 json 格式数据
requests模块的POST方法,对应HTTP中的POST请求,功能和使用方法与GET方法大同小异。
POST方法需要将表单数据封装到data参数中,封装形式可以是字典、json、元组等。
示例代码:
import requestsurl = 'http://www.abc.com/post'# 字典数据dict_data = {'key1': 'value1', 'key2': 'value2'}# 元组数据tuple_data = (('key1', 'value1'), ('key1', 'value2'))# json数据json_data = json.dumps({'some': 'data'})resp1 = requests.post(url, data=dict_data)resp2 = requests.post(url, data=tuple_data)resp3 = requests.post(url, data=json_data)
联系客服