目录
网络库urllib
urllib库是Python3内置的HTTP请求库,不需要单独安装,默认下载的Python就已经包含了该库。
urllib库有4个模块:
- request:最基本的HTTP请求模块,可以用法发送HTTP请求,并接收服务器的响应数据,这个过程就像在浏览器地址栏输入URL一样。
- parse:工具模块,提供了很多处理URL的API,如拆分、解析、合并等。
- robotparser:用来识别网站的robots.txt文件,然后判断哪些网站可以抓取,哪些不能抓取。
- error:异常处理。如果出现请求错误,可以捕获这些异常,然后根据代码的需要,进行处理。
下面,我们来分别介绍urllib库这4个模块。
request
request模块,包含发送请求,获得响应,Cookie,代理等相关API。这里,我们分别来介绍其使用的方式。
发送GET请求
首先,我们一般进行爬虫程序编写时,开始都需要发送请求,然后获得响应进行处理。比如通过GET请求获取网页源代码,示例如下:
import urllib.request
response=urllib.request.urlopen("https://www.csdn.net/")
print(response.read().decode("UTF-8"))
如上面代码所示,运行之后,我们会得到网页html源代码。
这里response是一个HTTPResponse对象,调用它多种方法及其属性,就可以进行多样的处理。
比如,我们这里来获取CSDN首页,调用其属性及其方法,示例如下:
import urllib.request
response = urllib.request.urlopen("https://www.csdn.net/")
print("status:", response.status, " msg:", response.msg, " version:", response.version)
print(response.getheaders())
这里,我们输出了CSDN首页的响应状态码,响应消息以及HTTP版本的属性,同时也打印其完整的响应头信息。
发送POST请求
默认request.urlopen()函数发送的GET请求,如果需要发送POST请求,我们需要使用data命令参数,该参数类型是bytes。示例代码如下:
import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({
'username': 'name', 'age': '123456'}), encoding="UTF-8")
response = urllib.request.urlopen("http://httpbin.org/post", data=data)
print(response.read().decode("UTF-8"))
运行之后,如果请求成功就会返回一大堆字符串数据。
请求超时处理
在实际的爬虫项目中,我们都需要考虑一个关键的问题,那就是请求超时。如果请求网址因为长时间没有响应,那么卡在这里往往浪费大量的资源。
所以,我们需要设置一个超时时间,如果在限定的时间没有响应,就应该重新抓取,或者不在抓取。示例代码如下:
import urllib.request
import urllib.parse
import urllib.error
import socket
data = bytes(urllib.parse.urlencode({
'username': 'name', 'age': '123456'}), encoding="UTF-8")
try:
response = urllib