Python3爬虫(三)urllib库的使用

2019-08-28| 发布者: admin| 查看: |

 Infi-chu:

http://www.cnblogs.com/Infi-chu/

 

一、urllib库:

1. 是Python内置的HTTP请求库

2. 在Python2中,由urllib和urllib2之分,而在Python3中,统一为urllib

3. 主要包含模块:

request:最基本的发送模块,用来模拟发送请求

error:异常处理模块

parse:一个工具模块

robotparser:主要用来识别robots.txt文件

 

二、发送请求:

1. urlopen

urllib.request:模块提供了最基本的构造HTTP请求的方法,同时还带有处理验证、重定向、浏览器Cookies等

import urllib.request
r = urllib.request.openurl
print.decode)
print) # class 'http.client.HTTPResponse' 

HTTPResponse类型的对象包括的方法:read、readinto、getheader、getheaders、fileno等

HTTPResponse类型的对象包括的属性:msg、version、status、reason、debuglevel、closed等

urlopen函数的API:

urllib.request.urlopen

data参数:

1. 可选

2. 若是字节流编码格式的内容,即bytes类型,则需要通过bytes方法转化。若传递该参数,则请求方式会有GET变为POST

3. bytes第一个参数需为str类型,可用urllib.parse.urlencode方法是字典变为字符串

timeout参数:

1. 可选

2. 用于设置超时时间,单位是秒,默认使用全局默认时间

3. 支持HTTP、HTTPS、FTP请求

4. 例:

import urllib
 r = urllib.request.urlopen
except urllib.error.URLError as e:
 if isinstance:
 print

context参数:必须是ssl.SSLContext类型,用来指定SSL设置

cafile参数:指定CA证书

capath参数:指定CA证书的路径

cafile和capath一起在请求HTTPS时使用

cadefault参数:已被废弃,默认是False

2. Request

urlopen不足以构建一个完整的请求,若要加入Headers等信息,就可以用Request类

Request类的构造:

class urllib.request.Request

url参数:同urlopen

data参数:同urlopen

headers参数:

1. 请求头

2. 可以直接在字典中构造,也可以用add_header方法添加

3. 可将User-Agent改为Mozilla/5.0 AppleWebKit/537.36 伪造成浏览器访问

origin_req_host参数:指的是请求方的host名称或IP地址

unverifiable参数:请求是否是无法验证的,默认是False

method参数:是一个字符串,用来指示请求的方法

3. Handler:

Handler是各种处理器,可以处理登录验证,可以处理Cookies,可以处理代理。

urllib.request模块里面的BaseHandler类,是所有其他Handler的父类。

各种Handler子类继承这个BaseHandler类:

HTTPDefaultErrorHandler:用于处理HTTP响应错误,会抛出异常

HTTPRedirectHandler:用于处理重定向

HTTPCookieProcessor:用于处理Cookies

ProxyHandler:用于设置代理,默认为空

HTTPPasswordMgr:用于管理密码

HTTPBasicAuthHandler:用于管理认证

4. OpenDirector:

应用:验证、代理、Cookies

 

 

三、异常处理:

1. URLError:

a. 来自urllib库的error模块,他继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过它处理

b. reason属性,返回原因

2. HTTPError:

a. 是URLError的子类,专门用来处理HTTP请求错误

b. 三个属性:

code:返回状态码

reason:返回原因

headers:返回请求头

 

四、解析链接:

介绍parse模块中的方法,parse定义了处理URL的标准接口

1. urlparse

实现URL的识别分段。

API用法:

urllib.parse.urlparse

urlstring参数:必选,待解析的URL

scheme参数:它是默认的协议,urlstring没有时生效

allow_fragments参数:是否忽略fragment,False为忽略,当URL中不包含params和query时,fragment会被解析为path的一部分

2. urlunparse

与urlparse对立,接受的参数是一个可迭代对象,长度必须为6,可以是元组、字典等特定的数据结构,这样就可以实现URL的构造

3. urlsplit

与urlparse相似,不单独解析parse,返回5各部分,元组类型

4. urlunsplit

与urlunparse类似,将各个部分拼接,长度必须是5

5. urljoin

生成链接,提供一个base-url的scheme,netloc,和path 3个内容并对新链接缺失的部分进行补充。

两个都有取最新的,不全的话互补

6. urlencode

在构造GET请求参数的时候很有用,将字典序列化为GET请求参数

7. parse_qs

反序列化,将一串GET请求参数,转化为字典

8. parse_qsl

同parse_qs,将GET转化为元组组成的列表

9. quote

将内容转化为URL编码的格式,因为URL有中文编码格式时,可能会出现乱码,用它可以转化

10. unquote

进行URL解码

 

五、分析robots协议:

robotparser模块,该模块提供了一个RobotFileParser类

urllib.robotparser.RobotFileParser

此类的常用方法:

set_url 设置robots.txt文件的链接

read 读取文件并分析

parse 解析文件

can_fetch 传入两个参数,第一个是User-Agent,第二个是抓取的URL,返回是否可抓取

mtime 返回上回抓取和分析的时间

modified 将当前时间设置为上次抓取和分析的时间