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
..........(无)