Python网络爬虫与信息提取笔记01-Requests库入门

既然选择学习网络爬虫,我们一定要知道,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)
  • url:拟获取页面的url链接
  • params:url中的额外参数,字典或字节流格式,可选
  • **kwargs:12个控制访问的参数

其实,我们可以理解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响应内容的二进制形式
  • 使用get()方法获取网页内容的时候,有一个基本的流程:首先,我们用r.status_code来检查返回的Response对象的状态,状态码为200,则继续使用其他方法进行解析,如果返回状态码为404或其他,则表示本次请求出现错误。

下面我们看一下实际的一个例子,我们接着刚才的输入,

刚才的操作是先查看返回的内容,然后发现看不懂,我们看一下这些内容的编码方式,发现是“ISO-8859-1”,我们将其转化为“utf-8”的编码方式,再查看一下,就发现这其实就是百度的主页内容。

  • 理解Response的编码:

其实r.encoding 是从r.headers返回的charset字段中找打它的编码方式,若header中不存在charset,则认为编码为ISO-8859-1,但这样的编码并不能解析中文,所以有了r.apprent_encoding这种备选的编码方式,而且这种方式是根据的网页内容分析出的编码方式,所以我们就可以读到其中的中文了。

2、爬取网页的通用代码框架

上面我们所说的拍网页的方法,但是这种方法并不是一定适用的,因为网页连接是有风险的,我们还需要像C++那样的异常处理的语句。

  • 理解Requests库的异常:
异常 说明
requests.ConnectionError 网路连接错误异常,如DNS查询失败、拒绝连接
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
requests.ToolManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时,产生超时异常
  • requests库提供了一个判断返回状态码是否为两百
异常 说明
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]。

  • host:合法的Internet主机域名或IP地址
  • port:端口号,缺省端口为80
  • path:请求资源的内部路径

如:http://www.bit.edu.cn,北京理工大学官网首页

http://220.181.111.188/duty,主机220.181.111.188上duty文件夹

怎么理解URL呢,这里我们简单理解URL就是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。

  • HTTP协议通过以下6个操作对资源进行操作,对应Requests库的6个主要方法
方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应信息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源
  • 理解PATCH和PUT的区别

假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段。

需求:用户修改了UserName,其他不变。

采用PATCH,仅向URL提交UserName的局部更新请求。

采用PUT,必须将所有20个字段一并交到URL,未提交字段被删除。

PTACH的最主要好处是:节省网络带宽。

  • Requests库的head()方法

我们发现,用这个方法获取到的是全部信息的简述概要版,即用r.headers展示的就是全部信息,此时再用r.text想要展示全部文本信息已经为空。注意,一个head()方法和一个headers关键字不一样。

  • Requests库的post()方法

注意,当我们用一个字典来添加两个键值对到URL时,键值对会默认到存储到表单form字段下。

而这时我们向URL再POST一个字符串,则自动编码到data字段

put方法和post方法类似,但是put方法会将原来的覆盖掉

4、Requests库主要方法解析

前面我们说到,Requests库的requests方法是所有方法的基础方法,它有以下三个参数:

requests.request(method,url,**kwargs)
  • method:请求方式,对应get/put/post等7种

requests的method请求方式一共有7种,除了刚才所说对应get/put/post这六种之外,还有下面这种:

r = requests.request('OPTIONS',url,**kwargs)

OPTIONS这种是向服务器获取一些服务器与客户端打交道的一些参数,并不与获取资源直接相关,所以使用较少。

如果我们要实现某种操作,我们可以使用requests库直接实现,也可以使用request的对应6种方法来实现。

  • url:拟获取页面的url链接
  • **kwargs:控制访问参数,共13个,均为可选项

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()请求。后续我们会实际使用这些来实践

猜你喜欢

转载自blog.csdn.net/MARS_098/article/details/104124373