urllib 请求库
urllib是Python内置的HTTP请求库,包含request、error、parse、robotpaser这4个模块。
- request:HTTP请求模块,用于模拟发送请求
- error:异常处理模块,捕获异常并进行相应操作保证程序不会意外终止
- parse:工具模块,提供拆分、解析合并等URL处理方法
- robotpaser:主要用于识别网站的robots.txt文件
发送请求
urlopen()
- urlopen()参数
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,context=None)
- url:必选参数,传递URL
- data:可选参数,必须传入字节流(bytes)类型,传递该参数后,请求方式为POST
- timeout:用于设置超时时间,单位为秒,若不指定则使用全局默认时间,支持HTTP、HTTPS、FTP请求
- cafile:指定CA证书
- capath:指定CA证书的路径
- context:必须是ssl.SSLContext类型,指定SSL设置
- urlopen()返回的是HTTPResponse类型对象,是一个类文件对象
import urllib.request
response = urllib.request.urlopen('https://www.pythn.org')
text = response.read().decode('utf-8')
print(type(response))
>>> <class 'http.client.HTTPResponse'>
HTTPResponse类型方法
方法 | 描述 |
---|---|
read() | 获得返回的网页内容 |
readline() | 获得返回的网页的一行内容 |
getheaders() | 获得响应头信息 |
fileno() | 返回文件描述符 |
HTTPResponse类型属性(略)
Request()
- Request()参数
class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
- url:必选参数,用于请求URL
- data:可选参数,必须传入字节流(bytes)类型
- headers:请求头,是一个字典,也可通过调用请求实例的add_header()方法添加
- origin_req_host:请求方的host名称或IP地址
- unverifiable:表示请求是否无法验证,默认为False,即用户没有权限选择接收请求的结果
- method:指示请求使用的方法,例如GRT、POST、PUT
BaseHandler类
BaseHandler类是其他Handler类的父类
- HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出HTTPError类型异常
- HTTPRedirectHandler:用于处理重定向
- HTTPCookieProcessor:用于处理Cookies
- ProxyHandler:用于设置代理,默认代理为空
- HTTPPasswordMgr:用于管理密码,维护用户名和密码的表
- HTTPBasicAuthHandler:用于管理认证
OpenDirictor类
利用Handler来构建Opener,以实现更高级的功能,例如验证、代理、Cookies
处理异常
urllib的error模块定义了由request模块产生的异常,通过处理异常既避免了程序异常终止,又有效处理了异常
URLError
- URLError是error异常模块的基类,由request模块产生的异常都可以通过捕获该类处理
- URLError具有一个属性reason,即返回错误原因
HTTPError
- HTTPError是URLError的子类,用于处理HTTP请求错误
- HTTPError具有code、reason、headers这3个属性
- code:返回HTTP状态码
- reason:返回错误原因
- headers:返回请求头
import socket #This module provides access to the BSD socket interface
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('https://www.baidu.com',timeout = 0.01)
except urllib.error.HTTPError as e: #先捕获子类错误
print(e.reason,e.code,e.headers,sep='\n')
except urllib.error.URLError as e: #再捕获父类错误
print(type(e.reason))
if isinstance(e.reason,socket.timeout): #isinstance()判断一个对象(e.reason)是否是已知类型(socket.timeout),并考虑继承
print('TIME OUT')
解析链接
urllib库提供的parse模块定义了处理URL的标准接口,包括实现URL各部分的抽取、合并及链接转换等。
urlparse()
-
urlparse()实现URL的识别和分段
-
标准链接格式
scheme://netloc/path;params?query#fragment
- scheme:协议
- netloc:域名
- path:路径
- params:参数
- query:查询条件
- fragment:锚点,用于定位页面内部的下拉位置
- urlparse()参数
urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
- urlstring:待解析的URL,必选参数
- scheme:默认协议,只有在URL中不包含scheme信息时生效
- allow_fragments:是否允许fragment,设置为False时fragment部分被忽略,被解析为path、parameters或query的一部分
urlunparse()
- urlunparse()用于构造URL
- urlunparse()接受的参数为一个长度必须是6的可迭代对象
data = ['scheme','netloc','path','params','query','fragment']
urlsplit()
- urlsplit()类似于urlparse(),但只返回5个结果(params合并到path中)
urlunsplit()
- urlunsplit()类似于urlunparse(),但接受参数为一个长度必须是5的可迭代对象
urljoin()
- urljoin()用于URL的解析、拼合与生成
- urljoin()第一个参数为基础链接,第二个参数为新链接
- urljoin()方法分析基础链接的scheme、netloc和path,并对新链接缺失部分进行补充(如果新链接存在,则使用新链接的部分)
urlencode()
- urlencode()用于构造GET请求参数
- 先将参数用字典表示,再调用urlencode()方法将其序列化为GET请求参数
from urllib.parse import urlencode
params = {
'A':'a'
'b':'b'
}
base_url = 'http://www.baidu.com?'
url = base_url + urlrncode(parase)
parse_qs()
- parse_qs()用于将GET请求参数转为字典
parse_qsl()
- parse_qsl()用于将GET请求参数转为元组组成的列表
quote()
- quote()将内容(特别是中文字符)转化为URL编码的格式
- URL中带有中文参数时,可能会导致乱码
unquote()
- unquote()用于进行URL解码
分析Robots协议
Robots协议即“网络爬虫排除标准(Robots Exclusion Protocol)”,用于向爬虫和搜索引擎说明可抓取的范围,
- Robots协议一般以robots.txt的形式存放于网站根目录
禁止所有爬虫访问任何目录:
User-agent:*
Disallow:/
允许某个爬虫访问某些目录:
User-agent:BaiduSpider
Disallow:/
Allow:/public/
User-agent:*
Disallow:/
也可将robots.txt文件留空
robotparser
robotparser模块用于解析robots.txt,提供RobotFileParser类根据目标网站的析robots.txt判断爬虫是否有权限爬取目标页面。
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url('url') # 设置robot.txt文件链接,或rp = RobotFileParser('url')
rp.read() # 读取robot.txt文件并进行分析,必须调用
rp.can_fetch('*','url') #第一个参数是User-agent,第二个参数是要抓取的URL
rp.parse(urlopen('url').read().decode('utf-8').split('\n'))
# parse()用于解析取robot.txt文件
# mtime():返回上次抓取和分析robot.txt文件的时间
# modified():将当前时间设置为上次抓取和分析robot.txt文件的时间
网友评论