既然选择学习网络爬虫,我们一定要知道,Requests是一个能够自动爬取HTML页面、自动网络请求提交的优秀的第三方库,入门第一步就是安装这个第三方库,我们默认此时你已经安装好了PythonIDLE,本人学习时安装的Python环境为Python3.7.4:
第一步:管理员权限打开cmd,输入“pip install requests”,即可下载安装(我的提示已经安装过了,如果你在此之前还没有安装pip以及下载太慢,请自行百度安装并切换镜像源,国内的像清华的,阿里云和豆瓣的都是网速杠杠滴)。
第二步:安装成功以后,我们win键呼出窗口,输入IDLE打开PythonIDLE窗口,输入以下代码测试是否安装成功
import requests
r = requests.get("http://www.baidu.com")
r.status_code
如果你选择的是交互式的窗口,此时会输出一个200的状态码,这表示访问成功,继续输入:
r.encoding = 'utf-8'
r.text
此时百度的主页已经被抓取出来,这也表示安装成功能正常使用。
Requests库的7个主要方法
方法 | 说明 |
---|---|
requests.requests() | 构造一个请求,支撑以下各方法的基础方法 |
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 |
1、requests.get()方法
获取一个网页最简单的方法就是这条语句r = requests.get(url),此时构造一个向服务器请求资源的Request对象(内部生成的),返回时返回一个包含服务器资源的Response对象。
get()方法的完整语句是这样的:
requests.get(url,params = None,**kwargs)
其实,我们可以理解requests库只有一个方法,其他另外六个常用方法都是通过调用requests()方法为基础来实现的。
接下来我们来看下Response对象(上面已经说Request对象在发送请求时内部已经生成):
(插个曲,我刚把pythonIDE字体修改为以下这种:options-->Configure IDE-->修改为Consolas(程序员标配字体),舒服多了)。
如图,返回的就是Response对象头部的信息。
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串形式,即url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
下面我们看一下实际的一个例子,我们接着刚才的输入,
刚才的操作是先查看返回的内容,然后发现看不懂,我们看一下这些内容的编码方式,发现是“ISO-8859-1”,我们将其转化为“utf-8”的编码方式,再查看一下,就发现这其实就是百度的主页内容。
其实r.encoding 是从r.headers返回的charset字段中找打它的编码方式,若header中不存在charset,则认为编码为ISO-8859-1,但这样的编码并不能解析中文,所以有了r.apprent_encoding这种备选的编码方式,而且这种方式是根据的网页内容分析出的编码方式,所以我们就可以读到其中的中文了。
2、爬取网页的通用代码框架
上面我们所说的拍网页的方法,但是这种方法并不是一定适用的,因为网页连接是有风险的,我们还需要像C++那样的异常处理的语句。
异常 | 说明 |
---|---|
requests.ConnectionError | 网路连接错误异常,如DNS查询失败、拒绝连接 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.ToolManyRedirects | 超过最大重定向次数,产生重定向异常 |
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,引发HTTPEroor异常
r.encoding = r.apprent_encoding
return r.text
except:
return "产生异常"
我们来测试一下,这里我们用创建一个文本文件来运行,加上以下代码:
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
运行结果为:
这里就是出错之后按照我们事先写好的异常处理来执行
3、HTTP协议及Requests库方法
上面第一点提到,Requests库由7个常用的方法,请上翻回顾,而关于HTTP协议,
Hypertext Transer Protocol,中文名称超文本传输协议,是一种基于“请求和响应”模式的、无状态的应用层协议。且前后两次的请求并无关联。HTTP协议一般采用URL作为定位网络资源标识,URL的格式为:http://host[:port][path]。
如:http://www.bit.edu.cn,北京理工大学官网首页
http://220.181.111.188/duty,主机220.181.111.188上duty文件夹
怎么理解URL呢,这里我们简单理解URL就是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应信息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段。
需求:用户修改了UserName,其他不变。
采用PATCH,仅向URL提交UserName的局部更新请求。
采用PUT,必须将所有20个字段一并交到URL,未提交字段被删除。
PTACH的最主要好处是:节省网络带宽。
我们发现,用这个方法获取到的是全部信息的简述概要版,即用r.headers展示的就是全部信息,此时再用r.text想要展示全部文本信息已经为空。注意,一个head()方法和一个headers关键字不一样。
注意,当我们用一个字典来添加两个键值对到URL时,键值对会默认到存储到表单form字段下。
而这时我们向URL再POST一个字符串,则自动编码到data字段
put方法和post方法类似,但是put方法会将原来的覆盖掉
4、Requests库主要方法解析
前面我们说到,Requests库的requests方法是所有方法的基础方法,它有以下三个参数:
requests.request(method,url,**kwargs)
requests的method请求方式一共有7种,除了刚才所说对应get/put/post这六种之外,还有下面这种:
r = requests.request('OPTIONS',url,**kwargs)
OPTIONS这种是向服务器获取一些服务器与客户端打交道的一些参数,并不与获取资源直接相关,所以使用较少。
如果我们要实现某种操作,我们可以使用requests库直接实现,也可以使用request的对应6种方法来实现。
1、params:字典或字节序列,作为参数增加到url中,看下面这个将键值对添加到url的实例
此时再去访问这个url时,就不止单纯访问这个资源,而是加入了一些参数,服务器可根据这些参数进行筛选等操作并返回。
2、data:字典、字节序列或文件对象,作为Request的内容
kv = {'key1':'value','key2':'value2'}
r = requests.request('POST','http://python123.io/ws',data = kv)
body = 'topic'
r = requests.request('POST','http://python123.io/ws',data = body)
其实第三行我们的主题内容可以设置为中文,但前面我们说了,默认的编码方式不是utf-8,所以我们如果要设置中文内容,可以这样:
这里,data所赋的数据并不放在url链接里,而是作为url链接数据的一部分。
3、json:JSON格式的数据,作为Requests的内容向服务器提交。
kv = {'key1':'value1'}
r = requests.request('POST','http://python123.io/ws',json = kv)
4、headers:字典,HTTP向url访问时定制头部
hd = {'user-agent':'Chrome/10'}
r = requests.request('POST','http://python123.io/ws',headers = hd)
访问某一个服务器时,可以使用这种方式模拟浏览器向服务器发起连接请求。
5、cookies:字典或CookieJar,Requests中的cookie。
6、元组:支持HTTP认证功能。
7、files:字典类型,传输文件时使用。
8、timeout:设定超时时间,秒为单位。
r = requests.request('GET','http://www,baidu.com',timeout = 10)
9、proxies:字典认证,设定访问代理服务器,可以增加登录认证。
pxs = {'http':'http://user:[email protected]:1234',
'http':'https://10.10.10.1:4321'}
r = requests.request('GET','http://www.baidu.com',proxies = pxs)
10、allow_redirects:True/false,默认打开为True,重定向开关。
11、stream:True、False,默认为True,获取内容立即下载开关。
12、verify:True/False,默认打开为True,认证SSL证书开关。
13、cert:本地SSL证书路径。
Requests库入门小结:
七个对外使用的方法
requests.requests() |
requests.get() |
requests.head() |
requests.post() |
requests.put() |
requests.patch() |
requests.delete() |
requests()方法是基础方法,get()和head()是最常使用的,事实上,由于网络连接风险的存在,我们很难使用post(),put(),patch(),delete()请求。后续我们会实际使用这些来实践