Python网络爬虫--Requests库

Requests库

7个主要方法

方法 说明
requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE

与HTTP协议一一对应

简单的使用

1
2
3
import requests
r = requests.get(url) //构造Request对象,返回Response对象
print(r.status_code) //打印状态码

重要方法 : requests.request()

原型 : requests.request(method,url,**kwargs)
method : 对应http的七种请求方法:get,post,put,delete等
url : 请求的url链接
**kwargs : 控制访问的参数

当查看其它方法,如get()、post()的源代码时,可以发现它们其实都是对request()方法的封装。

常用方法 : get() , head() , post()

因为安全的原因,一般不会支持对url资源的操作,所以像put,delete,patch,option请求都不常用。

requests.get()

原型 : requests.get(url,params=None,**kwargs)
url : 请求的url链接
params : url中的额外参数,字典或字节流格式,可选
**kwargs : 控制访问的参数

get请求方式因为参数是显式存在于url上所有传参可以这样写
方法一:

1
2
3
url = "https://www.baidu.com/s?wd=python"
r = requests.get(url)
print(r.url)

方法二:

1
2
3
4
5
6
url = "https://www.baidu.com/s"
params = {
"wd":"python"
}
r = requests.get(url,params=params)
print(r.url)

两种方法执行结果都是
https://www.baidu.com/s?wd=python

requests.post()

原型 : requests.post(url,data=None, json=None, **kwargs)
url : 请求的url链接
data : 请求的内容,可以是字典,字节序列或文件
json : JSON格式数据,也是请求的内容
**kwargs : 控制访问的参数

当POST字典时

1
2
3
url = ...
payload = {"key": "value"}
r=requests.post(url,data = payload)

会自动编码成form表单

当POST字符串时

1
2
url = ...
r = requests.post(url,data = "abc")

会自动编码成data

requests.head()

原型 : requests.head(url, **kwargs)
url : 请求的url链接
**kwargs : 控制访问的参数

只要header时使用

控制访问参数

参数 说明
params 字典或字节序列,作为参数增加到url中
data(常用) 字典、字节序列或文件对象,作为Request的内容
json JSON格式的数据,作为Request的内容
headers(常用) 字典,HTTP定制头
cookies(常用) 字典或CookieJar,Request中的cookie
auth 元组,支持HTTP认证功能
files 字典类型,传输文件
timeout 设定超时时间,秒为单位
proxies(常用) 字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects True/False,默认为True,重定向开关
stream True/False,默认为True,获取内容立即下载开关
verify True/False,默认为True,认证SSL证书开关
cert 本地SSL证书路径

headers选项

自定义head头

1
2
hd = {'user‐agent': 'Chrome/10'} 
r = requests.request('POST','http://www.baidu.com',headers = hd)

cookies选项

带cookies访问

1
2
ck = {'user': 'admin'} 
r = requests.request('POST','http://www.baidu.com',cookies = ck)

proxies选项

设置代理

1
2
3
4
5
pxs = {
'http': 'http://user:pass@10.10.10.1:1234'
'https': 'https://10.10.10.1:4321'
}
r = requests.request('GET','http://www.baidu.com',proxies = pxs)

Response对象

可以在交互式窗口使用dir(object)查看对象的属性和方法

1
2
3
>>>r=requests.get("https://www.baidu.com")
>>>dir(r)
...

常用属性

属性 说明
r.headers HTTP响应头
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
r.text HTTP响应内容的字符串形式,即url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式

编码问题

爬取中文页面时特别注重编码问题
r.encoding是从charset中判断编码,若头中没有则认为编码是ISO‐8859‐1
r.apparent_encoding则是从内容中分析出编码方式
所以一般都可以这么写

1
r.encoding = r.apparent_encoding

当然也可以自己指定

1
r.encoding = 'utf-8'

异常

Requests异常

异常 说明
requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLRequiredURL 缺失异常
requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时,产生超时异常

Response异常

r.raise_for_status()
当状态码不是200时都会产生requests.HTTPError异常

处理

爬网页应该是准确的,所以来个302跳转都不行
而且”网络连接有风险,异常处理很重要”

1
2
3
4
5
6
7
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "异常"

通用爬取框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests

def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "异常"

if __name__=="__main__":
url="https://www.baidu.com"
print(getHTMLText(url))
文章作者: SNCKER
文章链接: https://sncker.github.io/blog/2019/07/20/Python网络爬虫-Requests库/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SNCKER's blog