网络爬虫——Requests库

博客简介

对于小规模的网页我们常用Requests库来进行爬取,本篇博客介绍的是网络爬虫常用到的Requests库,以及使用get方法的基本框架和异常处理,内容如下:

  • http协议
  • Requests库方法
  • Response对象的属性
  • 异常处理
  • 爬虫基本框架
    在这里插入图片描述

http协议

HTTP , Hypertext Transfer Protocol ,超文本传输协议。是一个基于“请求与响应”模式的、无状态的应用层协议,HTTP协议采用URL作为定位网络资源的标识,URL是通过HTTP协议存取资源的Internet路径, -一个URL对应-个数据资源

  • URL格式如:http://host[ :port] [path]
  • host:合法的Internet主机域名或IP地址
  • port:端口号,缺省端口为80
  • path:请求资源的路径
https://www.baidu.com/
http://220.181.111.188/ duty

HTTP协议对资源的操作

HTTP协议对资源有种方法:

方法 属性
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源

Requests库方法

Requests库有许多方法,其中常用的是以下7种,功能与http协议一一对应,其中request方法是其他6种方法的基础,可以指定request方法中的method参数类型,即可实现相应的子功能。但是使用子方法更为直观:

方法 属性
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

requests.request() 方法以及参数属性

requests.request()是Requests库的基础方法,其包含了3个参数:requests.request(method,url,**kwargs)

  • method : 请求方式 GET/HEAD/PUT/POST/PATCH/delete/OPTIONS
  • url:资源访问URL
  • **kwargs控制访问的参数,可选,需要用关键字方式指定参数,13个可选参数如下:
参数 属性
params 字典或字节序列,作为参数增加到ur1中
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证书路径
  • 举例:
r=requests.request('GET'https://www.csdn.net/')
#timeout
r=requests.request('GET'https://www.csdn.net/',timeout=10)
#params
kv={
    'key1':'value1',
    'key2':'value2'
}
r = requests.request('GET', 'https://www.csdn.net/',params=kv)

#data
body='text,主体内容'
r = requests.request('POST', 'https://www.csdn.net/',data=body)

#json
kv={
    'key1':'value1'
}
r = requests.request('POST', 'https://www.csdn.net/',json=kv)

#headers
hd={
    'user-agent':'Chrome/10'
}
r=requests.request('POST','https://www.csdn.net/',headers=hd)

#files
fs={'files':open('data.xsl','rb')}
r=requests.request('POST','https://www.csdn.net/',files=fs)

#proxies
pxs = { 'http': 'http://user:[email protected]:1234',
        'https': 'https://10.10.10.1:4321'
    }
r=requests.request('GET',' http://www.baidu.com',proxies=pxs)

requests.get()方法以及参数属性

  • 调用形式:requests.get(url,params=None,**kwargs)
  • url:拟获取页面的ur1链接
  • params:URL中的额外参数,字典或字节流格式,可选
  • ** kwargs: 12个控制访问的参数:
参数 属性
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.head(url,**kwargs)

  • 调用形式:requests.head(url,**kwargs)
  • url:拟获取页面的URL链接
  • **kwargs:13个控制访问参数
参数 属性
params 字典或字节序列,作为参数增加到ur1中
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.post()

  • 调用方式:requests.post(url,data=None,json=None,**kwargs)
  • url:拟更新页面的ur1链接
  • data:字典、字节序列或文件, Request的内容
  • json: JSON格式的数据,Request的内容
  • **kwargs: 剩余11个控制访问的参数(见request方法)

request.put()

  • 调用方法:request.put(url,data=None,**kwargs)
  • url:拟更新页面的url链接
  • data:字典、字节序列或文件,Request的内容
  • **kwargs: 剩余12个 控制访问的参数(见request方法)

request.patch()

  • 调用方法:request.patch(url,data=None,**kwargs)
  • url:拟更新页面的url链接
  • data:字典、字节序列或文件,Request的内容
  • **kwargs: 12个 控制访问的参数(见request方法)

request.delete()

  • 调用方法:request.delete(url,**kwargs)
  • url:拟删除页面的URL
  • **kwargs: 13个 控制访问的参数(见request方法)

Response对象属性

r=requests.get(url)

当我们使用request方法获取信息之后,这个信息保存在一个Response对象中(r),我们可以访问这个对象的相应属性来获取信息,属性如下:

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

在这里插入图片描述

  • 举例:
def getinfomation1(url):
    r=requests.get(url)
    print(r.status_code)
    print('r.encoding=',r.encoding)
    print("r.apparent_encoding=",r.apparent_encoding)
    r.encoding='utf-8'
    print(r.headers)
    print(r.text)

异常处理

为什么进行异常处理?网络链接有风险,异常处理很重要,Requests库的异常如下:

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

使用response对象的raise_for_status()方法

r.raise_ for_ status ()在方法内部判断r . status_ _code是否等于200 ,不需要增加额外的if语句,该语句便于利用try-except进行异常处理:

代码框架

import requests
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()#如果状态不是200,引发httpError异常
        return r.text
    except:
        return '产生异常'
def main():
    url='https://www.csdn.net/'
    text=getHTMLText(url)
    print(text)

if __name__ == '__main__':
    main()

原创文章 236 获赞 430 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/105177882