网络爬虫之requests内容——看一篇就让你受益匪浅
前言
网络爬虫使我们能够进行Website资源的引用,部署自身项目,并且能够让自己的项目依靠大数据为依托之一,是我们必学的内容。所以从这里我会用四个单元来讲到如何学习和使用网络爬虫。
首先我是在慕课网看北理工爬虫与信息提取课程学习,所讲的内容也会参考网上的部分,所打的字和图片都是依靠自己而来,在此先谢谢大家的阅读,希望能够为大家的学习推一把力。
1、Requests
Request库是用来获取网页信息,将网络的信息爬取到自己的项目中。
1.1 Requests安装
安装步骤如下:
首先以管理员身份运行cmd,其次执行下行代码:
pip install requests
像我这儿已经是安装过了,就可以看到已经能够显示版本内容。
其次可以尝试下面的内容。
1.2 Requests主要方法
因为我们进行爬虫不可能是完全依靠requests,所以我们可以简短的认识相关方法即可。
方法 | 描述 |
---|---|
requests.request() | 构建一个请求 |
requests.get() | 获取html网页的主要方法 |
requests.head() | 获取html网页头信息的方法 |
requests.post() | 向html网页提交POST请求 |
requests.put() | 向html网页提交PUT请求 |
requests.patch() | 向html网页提出局部修改请求 |
requests.delete() | 向html提出删除信息 |
其实我们学过web相关内容知道,我们在向html提交请求包括:GET、HEAD、POST、PUT、PATCH、DELETE。这些这些是我们在为了遵循Restful风格的编码内容所要记住的一些东西——比如删除、查询一个用户的网址格式等等…
这就是requests所包含的方法。
2、get方法
2.1 get方法的格式&内容
首先我们是使用过get方法来去获取百度的内容。
r=requests.get("http://www.baidu.com")
# 这里是构建一个向服务器请求资源的request对象,返回了一个包含服务器资源的响应(Response),即r。
#我们在调用r后就可以打印status_code内容可看出,其实我们的r是已经包括了url的资源。
首先格式如下:
requests.get(url,params=None,**kwargs)
- url:就是我们想获取的url链接——http://www.baidu.com此时就是我们想获取的url。
- params:url中的额外参数,就是表达字典或者字节流的格式。
- **keargs:12个控制访问的参数。
2.2 get方法中的Response
r=requests.get("http://www.baidu.com")
同样是这个代码内容,我们可以通过具体内容展示上述注释的内容。
Reponse对象包含着服务器所返回的内容信息,也包括请求的request信息。
我们继续研究Reponse对象的属性。
属性 | 描述 |
---|---|
r.status_code | http请求的返回状态 |
r.text | http响应内容的字符串形式 |
r.encoding | 从http header中猜测的响应内容的编码方式 |
r.apparent_encoding | 从内容中分析出响应内容的编码方式 |
r.content | http响应内容的二进制形式 |
这里说明的是,如果我们并没有成功获取reponse信息,其实上述表格中只有第一个属性才能做出返回。
其实我们可以看到,我们在使用encoding和apparent_encoding返回的内容不一样。
前者中,如果header中不存在charset,就认为编码为ISO-8859-1。后者中,是根据网页内容分析出来的编码方式。
3、网页获取所要遇到的异常
我们在获取网页中不可能完全百分百完成我们的业务需要,在面对异常我们也要了解是什么样的问题。
首先先了解request发生的异常吧。
异常 | 描述 |
---|---|
requests.ConnectionError | 网络连接错误异常 |
requests.HTTPError | http错误异常 |
requests.URLRequired | url缺失异常 |
requests.TooManyRedirects | 重定向次数超过规定次数 |
requests.ConnectTimeout | 连接远程服务器超时 |
requests.Timeout | 请求url超时 |
当然,reponse异常就是在非200产生的异常信息。
r.raise_for_status()
##这里是判断是否等于200,并且内置方法已经添加额外的if,所以不需要我们自身去进行if-else
接下来是通用代码的框架:
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))
4、HTTP协议
4.1 url内容
HTTP协议就是超文本传输协议,是一种基于请求和响应模式的、无状态的应用层协议。
这种协议采用URL作为定位网络资源地址的标识。
其格式如下:
http://host[:port][path]
host:比如我们的host应该是127.0.0.1
port:端口号,缺省端口为80
path:请求的资源路径
比如如下例子:
http://www.bit.edu.cn
http://192.168.91.133
4.2 http协议对资源的操作
我们客户端能够向服务器发送put\post\patch\delete请求,而服务器通过get\head返回对客户端的内容。
我们不必太过在意协议内部的网络通道或者服务器本身,所以这时我们的信号传输是一种黑盒操作。
方法 | 描述 |
---|---|
requests.get() | 获取html网页的主要方法 |
requests.head() | 获取html网页头信息的方法 |
requests.post() | 向html网页提交POST请求 |
requests.put() | 向html网页提交PUT请求 |
requests.patch() | 向html网页提出局部修改请求 |
requests.delete() | 向html提出删除信息 |
总结
以上就是我今天学到的Requests相关内容,使用requests是获取网页的工具,是今后学习其他第三方库的基础。谢谢大家的阅读。