美文网首页
2. urllib 请求库

2. urllib 请求库

作者: 柄志 | 来源:发表于2018-08-02 13:51 被阅读0次

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)
  1. url:必选参数,传递URL
  2. data:可选参数,必须传入字节流(bytes)类型,传递该参数后,请求方式为POST
  3. timeout:用于设置超时时间,单位为秒,若不指定则使用全局默认时间,支持HTTP、HTTPS、FTP请求
  4. cafile:指定CA证书
  5. capath:指定CA证书的路径
  6. 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)
  1. url:必选参数,用于请求URL
  2. data:可选参数,必须传入字节流(bytes)类型
  3. headers:请求头,是一个字典,也可通过调用请求实例的add_header()方法添加
  4. origin_req_host:请求方的host名称或IP地址
  5. unverifiable:表示请求是否无法验证,默认为False,即用户没有权限选择接收请求的结果
  6. 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个属性
  1. code:返回HTTP状态码
  2. reason:返回错误原因
  3. 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
  1. scheme:协议
  2. netloc:域名
  3. path:路径
  4. params:参数
  5. query:查询条件
  6. fragment:锚点,用于定位页面内部的下拉位置
  • urlparse()参数
urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
  1. urlstring:待解析的URL,必选参数
  2. scheme:默认协议,只有在URL中不包含scheme信息时生效
  3. 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文件的时间

相关文章

网友评论

      本文标题:2. urllib 请求库

      本文链接:https://www.haomeiwen.com/subject/lpgjvftx.html