The website is the API......(未来的数据都是通过网络来提供的,website本身对爬虫来讲就是自动获取数据的API)。掌握定向网络数据爬取和网页解析的基本能力。
##Requests 库的使用,此库是Python公认的优秀的第三方网络爬虫库。能够自动的爬取HTML页面;自动的生成网络请求提交。
##robots.tex 协议 网络爬虫排除标准 (网络爬虫的盗亦有道)
1.安装Requests库 以管理员权限进入cmd控制台, 通过" pip install requests "命令安装Requests库
#测试安装Requests库的效果,以爬取百度主页为例 >>> import requests >>> r = requests.get("http://www.baidu.com")##一行代码就可以获取任何对应的URL的资源 >>> r.status_code() #状态码 200 >>> r.encoding = "utf-8" #将编码更改为UTF-8编码 >>> r.text #打印网页内容
......百度主页的内容......
2. requests 的主要方法:
##2.1 r = requests.get(url) : get 方法为获得一个网页最常用的方法 ,此方法构建一个向服务器发送请求的Request(requests库内部生产的)对象;返回一个包含服务器资源的Response(包含了网络爬虫返回的内容)对象。
requests.get(url,params=None,**kwargs)
url :获取URL页面的链接
parmas:url 中额外的参数,可以是字典或字节流格式,可选
**kwargs:12个控制访问参数
其实get 方法采用request方法进行封装,其他的方法也通过调用request方法来实现的。可以理解为requests库只有一种request方法,为了编程方便才提供额外的6种方法。
3.Response对象包含了服务器返回的所有信息,同时也包含了向服务器发送请求的信息
##Response 对象的5个属性
3.1. r.status_code HTTP请求的返回状态,200表示连接成功,404表示连接失败;(有可能返回的是其他的值,只要不是200,都表示连接是失败的)
3.2.r.text HTTP响应内容的所有字符串形式,即URL对应的网页内容
3.3. r.encoding 从 HTTP header中猜测响应内容的编码方式(如果header中不存在charst字段,则默认的是ISO--8859--1编码)
3.4.r.apparent_encoding 从内容中分析出响应内容编码方式(根据网页内容分析出编码方式,更加准确)
3.5.r.content 表示响应内容的二进制形式
############################################################################################################
##爬取网页的通用代码框架
##爬取网页有风险,有可能有些网站不允许爬或者因为其他的原因无法爬取
理解requests库的异常:
# requests.ConnectionError 网络连接错误异常,如查询DNS失败或者服务器的防火墙拒绝连接等
# requests.HTTPError :HTTP错误异常
# requests.URLRequirde: URL缺失异常
# requests.TooManyRediecrts :重定向异常,超过最大重定向次数(对一些复杂的连接访问的时候,容易产生这样的错误)
# requests.ConnectTimeout :连接远程服务器超时异常(与服务器连接超过一个预定的时间而产生的异常)
# requests.Timeout :发起URL请求到获取URL内容,产生的超时异常
##Response 作为一个返回的对象,它提供了一个方法
r.raise_for_status() --->与异常打交道的方法,能够判定返回的状态码是不是200,如果返回的不是200,将产生一个requests.HTTPError 异常
##爬取网页的通用代码框架 import requests def getHTMLText(url): try: r = requests.get(url,timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "产生异常" if _name_ == "_main_": url ="http://www.baidu.com" print(getHTMLText(url))
####通用代码框架可以有效的处理,在访问或者爬取网页的时候产生的异常、错误,以及由于网络不稳定等因素产生的异常。用户在使用通用代码框架后可以使得爬取网页变得更加有效、稳定可靠###
####requests库的7个主要方法:
1. requests.request()
2.requests.get()
3.requests.head()
4.requests.post()
5.requests.put()
6.requests.patch()
7.requests.delete()
HTTP 协议,超文本传输协议,是一种基于“”请求与响应“”模式的,无状态的应用层协议。(无状态指的是第一次请求与第二次请求并无关联)
HTTP协议采用URL作为定位网络资源的标识
URL的格式 http://host[:port][path](URL是通过HTTP协议存取网络资源的Internet路径,一个URL对应一个数据资源)
host: 合法的主机域名和IP地址
port:端口号 ,缺省的端口号为80
path:请求的资源在服务器上的路径
HTTP协议对资源的操作(其实这6个方法也是requests库6个函数对应的功能):
GET :请求获取URL位置资源 与 requests.get() 方法一致
POST :请求向URL的资源后增加新的信息,不改变现有的内容 与 requests.post()方法一致
HEAD :请求获取URL资源的响应消息报告,即获取该资源的头部信息与 requsts.head()方法一致
PUT :请求向URL的位置存取一个资源,原来的资源将被覆盖 与 requests.put()方法一致
PATCH:请求向URL位置处的资源进行局部更新,改变该出资源的部分信息与 requests.patch()方法一致
DELETE:请求删除URL位置处的相关资源 与 requests.delete()方法一致
##理解PATCH和PUT的区别
假设URL位置有一组数据UserInfo,包括UserID,UserName等20个字段;
需求:用户修改UserName其他不变
*使用PATCH,仅向URL提交UserName的局部更新请求(主要好处:节省网络带宽)
*采用PUT,必须将所以的20个字段一并提交到URL,未提交的文字段将被删除(覆盖)
####requests库的head() 方法
#requests库的head()方法 import requests r = requests.head("http://httpbin.org/get")#用很少的网络流量获取网络资源的概要信息 print(r.headers) >>> {'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Date': 'Thu, 01 Nov 2018 14:33:19 GMT', 'Content-Type': 'application/json', 'Content-Length': '265', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true', 'Via': '1.1 vegur'} >>>r.text ..........(无)