目录
- 知识准备
- requests库相关参数解释
- Requests库的7个主要方法
- Response对象的属性
- 控制访问参数
- requests库的异常处理
- 爬取网页的通用框架
- 关键词提交接口
- 升级版框架(虽然还是很丑陋0.0)
知识准备
在学习后面requests库之前,我们需要先了解一下http协议
在此之前呢,我们需要了解一下http协议,才能做好后面的工作
http即超文本传输协议,是基于一个“请求与响应”模式的,无状态的应用层协议。它采用url作为定位网络资源的标识符,url格式如下:
http://host[:port][path]
host:主机域名或ip地址
port:端口号,默认80
path:请求资源的路径
http协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
requests是用python编写的,使用Apache2 licensed 许可证的HTTP库,使用起来比urllib简洁很多。首先我们需要安装requests库,命令:
pip install requests
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 |
那么在这些方法中用的最多的就是get方法了。下面解释下这个方法
r = requests.get(url,kwargs)
r:表示返回一个包含服务器资源的response对象(也就是爬虫返回的对象)
url:准备爬取的页面
get:表示构造一个向服务器请求资源的request对象
Kwargs:访问控制参数,可选
还有一种通用格式,如下
requests.request(method,url,kwargs)
method就是请求的方法
Response对象的属性
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串形式,即,url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
r.encoding | 如果header中不存在charset,则认为编码为ISO‐8859‐1 r.text根据r.encoding显示网页内容 |
r.apparent_encoding | 根据网页内容分析出的编码方式 可以看作是r.encoding的备选 |
控制访问参数
参数 | 描述 |
---|---|
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证书路径 |
requests库的异常处理
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 requests.HTTPError |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
r.raise_for_status() | 如果不是200,产生异常requests.HTTPError |
爬取网页的通用框架
import requests
def getHTMLtext(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status() #如果状态不为200,引发httperror异常
r.encoding=r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__=="__main__":
url="http://www.baidu.com"
print(getHTMLtext(url))
关键词提交接口
import requests
keyword = input("请输入搜索的关键词:")
try:
kv = {'wd':keyword}
r = requests.get("http://www.baidu.com/s?",params=kv)
print(r.request.url)
r.raise_for_status()
print(r.text)
except:
print("爬取失败")
升级版框架(虽然还是很丑陋0.0)
# RequestsFrame.py
import requests
kv={'user-agent':'Mozilla/5.0'}
ls = ['get','head','post','put','patch','delete']
url=''
method=''
number=0
def requestmethod():
global method
method=input("请选择请求的方法(默认为get):")
if method =='':
method='get'
elif method in ls:
method=method
else:
print("方法错误")
exit()
return method
def requesturl():
global url
data = input("请输入要爬取的url:")
if data[0:4] in ['HTTP','http']:
url=data
else:
url='http://'+data
return url
def display():
global number
try:
number = input("请输入要爬取页面的字节数(默认all):")
if number != '':
number = int(number)
else:
number = None
return number
except:
print("输入错误")
exit()
def getHTMLtext():
try:
r=requests.request(method,url,timeout=30,headers=kv)
r.raise_for_status() #如果状态不为200,引发httperror异常
r.encoding=r.apparent_encoding
return r.text[0:number]
except:
return "请求状态异常"
if __name__=="__main__":
requestmethod()
print("爬取的网页为:{}".format(requesturl()))
display()
print(getHTMLtext())
还有很多地方可以补充,有想法可以加进去哦