导学:掌握定向网络数据爬取和网页解析的基本能力
一、 Requests库入门
公认的爬取网页最好的第三方库,简单和简洁
import requests
r = requests.get('http://www.baidu.com')
num = r.status_code #状态码
print(num)
r.encoding =
'utf-8'
print(r.text)
requesrs库主要有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() #向网页提交局部修改请求,对应于http的patch
requests.delete() #向页面提交删除请求,对应于http的delete
1、requests.get()
r = requests.get(url,params = None,**kwargs) #涉及Request和Response两个对象,其中Response对象包含爬虫返回的所有内容
Response对象的属性:
r.status_code #http请求的返回状态,200表示连接成功,404表示失败
r.text #http响应内容的字符串形式,即URL对应的页面内容
r.encoding #从http header中猜测的响应内容
编码方式,
r.apparent_encoding #从
内容中分析的响应内容编码方式(备选编码方式),能更准确解码
r.content #http响应内容的二进制形式,可用于
还原二进制形式的图片等;
基本流程:
2、爬取网页的通用代码框架
requests库的异常:
requests.ConnectionError #网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPError #http错误异常
requests.URLRequired #URL缺失异常
requests.TooManyRedirects #超过最大重定向次数,产生重向异常
requests.ConnectTimeout #连接远程服务器超时异常
requests.Timeout #请求URL超时,产生超时异常,指发出到获得整个过程的
理解requests库的异常:
r.raise_for_status() #如果返回不是200,产生 requests.HTTPError
涉及到异常,采用try和except。
通用代码框架:实际上意义在于使得代码更有效和稳定!!
3、http协议与requests库
http协议:hypertext transfer protocol ,超文本传输协议,一个基于请求和响应,的无状态的应用层协议。
http协议采用url作为定位网络资源的标识:
URL格式:http://host[:port][path]
host——合法的Internet主机域名或IP地址
port——端口号,缺省端口为80
path——请求资源的路径(内部路径)
实例:
http://www.bit.edu.cn #北京理工大学校园网首页
http://220.181.111.188/duty #这样一台IP主机上duty目录下的相关资源
http url的理解:
url是通过http协议存取资源的Internet路径,一个url对应一个数据资源。
http协议对资源的操作:
get ——请求获取url位置的资源(全部资源)
head——请求获取url位置资源的响应消息报告,即获得该资源的头部信息
post——请求向url位置的资源后
附加新的数据
put——请求向url位置存储一个资源,
覆盖原url位置的资源
patch——请求
局部更新url位置的资源,即改变该处资源的部分内容(
节省网络带宽)
delete——请求删除url位置存储的资源
理解:
把互联网(Internet)当成一个云端,那么云端上存储的资源,则以url来标识(
可以通过url进行定位),可以通过上面六大操作对资源进行管理!!
注意:
http协议方法与requests库方法一一对应,另外,在更改资源时,会根据提交的资源的类型进行整理,放到对应相关字段下,例如post一个字典,会自动编码为form(表单),放到表单字段下,而当post一个字符串时,则会自动编码为data,从而放到data字段下。
4、requests库主要方法解析:
requests.request(method,url,**kwargs) #**kwargs控制访问参数
method——请求方式,对应get/put/post等7种方法
r=requests.request('GET',url,**kwargs ) #效果等同于requests.get(),因为get方法是基于request方法封装起来的,下面的同理!!
r=requests.request('
HEAD',url,**kwargs )
r=requests.request('POST',url,**kwargs )
r=requests.request('PUT',url,**kwargs )
r=requests.request('PATCH',url,**kwargs )
r=requests.request('
delete',url,**kwargs )
r=requests.request('
OPTIONS',url,**kwargs ) #获取服务器和客户端打交道的一些参数
url——获取页面的url链接
**kwargs——控制访问的参数,共13个(也就是可选项)
params——字典或字节序列,作为参数增加到url中
data——字典、字节序列或文件对象,作为request的内容(也就是url对应位置作为数据存储)
eg:body = "主体内容"
r = requests.request('post','http://python123.io/ws',data = body)
json——JSON格式的数据,作为request的内容
headers——字典,http定制头(http的头字段)
cookies——字典或CookieJar,request中的cookie
auth——元组类型,支持http认证功能
files——字典类型,传输文件
fs = {'file':open('data.xls','rb')} #字典
r = requests.request('post','http://python123.io/ws',files = fs) #用open的方式打开文件,并与file作为关联,对应到相关的url上
timeout——设定超时时间,以秒为单位
proxies——字典类型,设定访问代理服务器,可以增加登录认证
'https':'https://10.10.10.1:4321'} #增加两个代理,前一个是http访问时可以增加用户名,密码的设计;后一个是https的代理服务器:这样访问时使用的ip地址即为该代理服务器ip地址,可以隐藏爬取网页的原ip地址。
r = requests.request('GET','http://www.baidu.com',proxies = pxs)
allow_redirects——True/False,默认为true,重定向开关
stream——true/false,默认为true,获取内容立即下载开关
verify——true/false,默认为true,认证ssl证书开关
cert——本地ssl证书路径
requests.get(url,params=None,**kwargs) #参数与以上参数一样,其中**kwargs是上面提到的除了params参数以外的12个参数
requests.head(url,**kwargs) #**kwargs同理为以上提及的13个参数
requests.post(url,data = None, json = None, **kwargs) #同理,接下来的方法皆同理
requests.put(url,data = None, **kwargs)
requests.patch(url,data = None, **kwargs)
requests.delete(url, **kwargs)
注意:
网络连接有风险
异常处理很重要
r.raise_for_stastus()为核心代码,作用是指返回为200,连接正常,如果不是,则是异常!