urllib

有以下几种模块:

1.urllib.request 请求模块

2.urllib.error 异常处理模块

3.urllib.parse url 解析模块

4.urllib.robotparser robots.txt 解析模块

urllib.request

一、urlopen

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,
 capath=None, cadefault=False, context=None)

参数说明:

url:需要打开的网址; data: Post 提交的数据, 默认为 None ,
当 data 不为 None 时, urlopen() 提交方式为 Post; 
timeout:设置网站访问超时时间


import urllib.request

# 可以是 from urllib  import request,语句等价

response = urllib.request.urlopen('https://www.baidu.com')

print("查看 response 响应信息类型: ",type(response))

page = response.read()

print(page.decode('utf-8'))

urlopen 返回一个类文件对象,并提供了如下方法:
read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样;
info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息;可以通过Quick Reference to Http Headers查看 Http Header 列表。
getcode():返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到;
geturl():返回获取页面的真实 URL。在 urlopen(或 opener 对象)可能带一个重定向时,此方法很有帮助。获取的页面 URL 不一定跟真实请求的 URL 相同。



实例

import urllib.request
response = urllib.request.urlopen('https://www.baidu.com')
print("查看 response 的返回类型:",type(response))
print("查看响应地址信息: ",response)
print("查看头部信息1(http header):\n",response.info())
print("查看头部信息2(http header):\n",response.getheaders())
print("输出头部属性信息:",response.getheader("Server"))
print("查看响应状态信息1(http status):\n",response.status)
print("查看响应状态信息2(http status):\n",response.getcode())
print("查看响应 url 地址:\n",response.geturl())
page = response.read()
print("输出网页源码:",page.decode('utf-8'))


post实例

import urllib.request,urllib.parse

url = 'https://httpbin.org/post'

headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
'Chrome/63.0.3239.108 Safari/537.36',

'Referer': 'https://httpbin.org/post',

'Connection': 'keep-alive'

}

# 模拟表单提交

dict = {

'name':'MIka',

'old:':18

}

data = urllib.parse.urlencode(dict).encode('utf-8')

# data 数如果要传bytes(字节流)类型的,如果是一个字典,先用urllib.parse.urlencode()编码。

req = urllib.request.Request(url = url,data = data,headers = headers)

response = urllib.request.urlopen(req)

page = response.read().decode('utf-8')

print(page)


注解:
如实例易知,在 urlopen 参数 data 不为 None 时,urlopen() 数据提交方式 为 Post。urllib.parse.urlencode()方法将参数字典转化为字符串。
提交的网址是httpbin.org,它可以提供HTTP请求测试。 https://httpbin.org/post 这个地址可以用来测试 POST 请求,它可以输出请求和响应信息,其中就包含我们传递的 data 参数。

关于 timeout 参数
timeout参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它支持 HTTP 、 HTTPS 、 FTP 请求。

import urllib.request

response = urllib.request.urlopen("https://httpbin.org/get",timeout=1)

print(response.read().decode("utf-8"))```


我们试着给timeout一个更小的值,例如timeout=0.1,此时抛出 urllib.error.URLError 异常,错误原因为 time out 。因为常理下 0.1 s 内根本就不可能得到服务器响应。所以通过设置参数 timeout 的值对于应对网页响应的速度具有一定的意义。同时,可以通过设置这个超长时间来控制一个网页如果长时间未响应就跳过它的抓取(可以通过try-catch 语句)。
try-catch 实现异常处理:

import urllib.request

import socket

import urllib.error

try:

response = urllib.request.urlopen('https://httpbin.org/get',timeout=0.1)

except urllib.error.URLError as e:

if  isinstance(e.reason, socket.timeout):

print("Time out!")

二、Request

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

实例

import urllib.request

url = "https://www.lagou.com/zhaopin/Python/?labelWords=label"

headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',

'Referer': 'https://www.lagou.com/zhaopin/Python/?labelWords=label',

'Connection': 'keep-alive'

}

req = request.Request(url, headers=headers)

page = request.urlopen(req).read()

page = page.decode('utf-8')

print(page)


headers 的参数设置:
User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言。这个数据可以从 网页开发工具上的请求反应信息中获取(浏览器上一般按 F12 打开开发工具)。作用是用于伪装浏览器。
Referer:可以用来防止盗链,有一些网站图片显示来源 https://***.com ,就是检查 Referer 来鉴定的。
Connection:表示连接状态,记录 Session 的状态。
origin_req_host:请求方的 host 名称或者 IP 地址。
unverifiable:指请求无法验证,默认为 False。用户并没有足够的权限来选择接收这个请求结果,例如请求一个 HTML 文档中的图片,但没有自动抓取图像的权限,这时 unverifiable 为 True。
method:指定请求使用的方法,例如 GET、POST、PUT 等。


三. cookies

cookies设置

#! /usr/bin/env python3

import http.cookiejar, urllib.request

cookie = http.cookiejar.CookieJar()

handler = urllib.request.HTTPCookieProcessor(cookie)

opener = urllib.request.build_opener(handler)

response = opener.open('https://www.baidu.com')

for item in cookie:

print(item.name+"="+item.value)

首先声明一个CookieJar对象,接下来利用HTTPCookieProcessor构建一个 handler ,最后利用 build_opener 方法构建出 opener ,执行 open() 即可。

查看输出可以发现每一条 Cookie 有相应的名称和值。

文本储存cookies

filename = 'cookie.txt'

cookie = http.cookiejar.MozillaCookieJar(filename)

handler = urllib.request.HTTPCookieProcessor(cookie)

opener = urllib.request.build_opener(handler)

response = opener.open('https://www.baidu.com')

cookie.save(ignore_discard=True, ignore_expires=True)


四. Openers 和 Handlers

当需要获取一个 URL 时需要使用一个 opener (这是一个不容易理解的对象—-urllib.request.OpenerDirector的实例)。一般情况下通过 urlopen 使用默认的 opener ,但允许自己创建不同的 opener 。Opener 会使用 handlers 。handler 承担”重活”并知道如何以某个特定的协议(如http,ftp等)打开 URL、知道如何处理 URL的某些行为(比如 Http 重定向或是 Cookie等)。
引入 Opener(即 OpenerDirector 类)的目的是为了能够实现更高级的功能,一般情况下使用的 Request 、 urlopen() 相当于类库封装好了的极其常用的请求方法,利用这两个就可以完成基本的请求。但当需要实现更高级的功能时就需要更高级的实例来完成操作。所以,这里就用到了比调用 urlopen() 的对象的更普遍的对象—-Opener 。
Opener 通过 Handler 构建,可以使用 open() 方法,返回的类型和 urlopen() 相同。
OpenerDirector操作类是一个管理很多处理类(Handler)的类。这些 Handler 类都对应处理相应的协议,或者特殊功能。
分别有下面的处理类(即 Handler 类):
BaseHandler、HTTPErrorProcessor、HTTPDefaultErrorHandler、HTTPRedirectHandler、ProxyHandler、AbstractBasicAuthHandler、HTTPBasicAuthHandler、ProxyBasicAuthHandler、AbstractDigestAuthHandler、
ProxyDigestAuthHandler、AbstractHTTPHandler、HTTPHandler、HTTPCookieProcessor、UnknownHandler、
FileHandler、FTPHandler、CacheFTPHandler
其中,urllib.request.BaseHandler 是所有其他 Handler 的父类,其提供了最基本的Handler方法。例如:default_open()、protocol_request() 等。
常见的 BaseHandler 子类有:

HTTPDefaultErrorHandler :用于处理HTTP响应错误,错误都会抛出 HTTPError 类型的异常。
HTTPRedirectHandler :用于处理重定向。
HTTPCookieProcessor: 用于处理 Cookie 。
ProxyHandler :用于设置代理,默认代理为空
HTTPPasswordMgr : 用于管理密码,它维护了用户名密码的表。
HTTPBasicAuthHandler : 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。 另外还

基本认证

什么是基本认证?当访问网页信息时被要求需要认证(或授权)时,服务器会发送一个头信息(如果验证失败便返回 401 错误代码)请求认证。它指定了一个realm(领域)。这个头信息的形式看起来会像是:www-Authenticate:SCHEME realm=“REALM”,例如WWW-Authenticate: Basic realm=“cPanel Users”
接着,客户端应该使用正确的用户名和密码重新请求(请求头中应该包含对应的realm、用户名以及用户密码),这就是“基础认证”。
通过创建一个 HTTPBasicAuthHandler 并利用 opener 使用这个 handler 可以简化这个认证过程。
HTTPBasicAuthHandler使用一个叫做密码管理器(password manager)的对象处理 url 和 realm、用户名和密码之间的映射。如果你知道realm(领域)是什么(根据服务器发送的认证 headers 可以得知),那么你便可以使用 HTTPPasswordMgr。人们往往不在乎realm是什么。这种情况下,最方便的是使用HTTPPasswordMgrWithDefaultRealm。它允许你为一个url指定一个默认的用户名和密码。它会在你没有给某个realm提供用户名和密码的时候起作用。这种情况下,需要将 add_password 方法的 realm 参数设置为 None。
顶层 URL (top-level URL)就是第一个需要认证的 URL,只有是比你传递给.add_password() 的 URL更“深层”的 URL 也可以匹配得上。

# -*- coding: utf-8 -*- 

import urllib

# 创建一个密码管理者 

password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()

# 添加用户名和密码 

top_level_url = "https://example.com/foo/"`

# 如果知道 realm, 我们可以使用他代替 None. 

password_mgr.add_password(None, top_level_url,'username','password') 

# 创建了一个新的handler 

handler = urllib.request.HTTPBasicAuthHandler(password_mgr) 

# 创建 "opener"`(OpenerDirector 实例) 

opener = urllib.request.build_opener(handler) 

# 使用 opener 获取一个URL 

a_url = 'https://www.python.org/'`

x = opener.open(a_url) 

print(x.read().decode("utf-8"))

# 安装 opener. 

# 现在所有调用 urllib.request.urlopen 将用我们的 opener. 

urllib.request.install_opener(opener)


此处代码为实例代码,用于说明Handler和Opener的使用方法。在这里,首先实例化了一个HTTPPasswordMgrWithDefaultRealm 对象,然后利用 add_password() 添加进用户名和密码,相当于建立了一个处理认证的处理器。接下来利用 urllib.request.build_opener() 方法来利用这个处理器构建一个 Opener ,那么这个 Opener 在发送请求的时候就具备了认证功能了。最后通过 Opener 的 open() 方法打开 URL,即可以完成认证

说明几点:
1.上面实例中,只将HTTPBasicAuthHandler提供给 build_opener 。
2.默认情况下,opener可以处理一般情况的 handler—-ProxyHandler(已经设置了代理环境变量如 http_proxy)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、FileHandler、DataHandler、HTTPErrorProcessor。

实际上,toplevel_url 要么是一个完整的 URL(包括“http:”模式部分以及主机名和可选的端口号)比如“https://example.com/”,要么是一个“authority”(即主机名和可选的端口号)例如“example.com”或“example.com:8080”(后者包含了端口号)。该“authority”如果出现的话,不能包含“用户信息(userinfo)“元素——如“joe@password:example.com” 是不被允许的



以上是关于 urllib.request 模块的常用知识以及重点内容的总结, 还具体说明了 urllib.request,urlopen() 的详细介绍以及用法。可以查看 python doc 。
下面是 urllib.request 模块的其他 方法或者类的简要介绍:
方法:
1. install_opener()

urllib.request.install_opener(opener)

安装一个 OpenerDirector实例作为全球默认的opener 。如果你想让 urlopen 使用这个opener,那么安装一个opener是必要的;否则可以简单地调用OpenerDirector.open()而不是urlopen()。这样代码不会检查一个真实的 OpenerDirector 并且任何类的适当的接口都可以运作。
2.build_opener()

urllib.request.build_opener([handler, …])

返回一个顺序链的处理程序OpenerDirector的实例。处理程序可以是BaseHandler的实例,或者 BaseHandler 的子类(在这种情况下,必须调用没有参数的构造函数)。下面这些类的实例将提前处理程序,除非处理程序包含它们,或者它们子类的实例:ProxyHandler(如果检测到代理设置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、FileHandler、HTTPErrorProcessor。
如果 Python 安装 SSL 支持(即如果 ssl 模块可以被导入), HTTPSHandler 也将被添加。
一个 BaseHandler 子类也可以通过改变它的 handler_order 属性来修改它再处理程序列表中的位置。
3.pathname2url()

urllib.request.pathname2url(path)

将路径名转换成路径,从本地语法形式的路径中使用一个URL的路径组成部分。这不会产生一个完整的URL。它将返回引用 quote() 函数的值。
4.url2pathname()

urllib.request.url2pathname(path)

将路径组件转换为本地路径的语法。这个不接受一个完整的URL。这个函数使用 unquote() 解码的通路。
5.getproxies()

urllib.request.getproxies()

这个 helper 函数返回一个日程表 dictionary 去代理服务器的 URL 映射。扫描指定的环境变量 _proxy 大小写不敏感的方法,对所有的操作系统,当它不能找到它,从 Mac OS X 的 Mac OSX 系统配置和 Windows 系统注册表中寻找代理信息。如果两个大写和小写环境变量存在(或不一样),小写优先。
请注意,如果环境变量 REQUEST_METHOD 已被设置,这通常表明你在 CGI 脚本运行环境,此时环境变量 HTTP_PROXY(大写 _PROXY) 将被忽略。这是因为该变量可以被客户端使用注射 “代理:” HTTP 头。如果你需要使用一个 HTTP 代理在 CGI 环境中,要么使用 ProxyHandler 明确,或者确保变量名小写(或至少是 _proxy后缀)。
类:

urllib.request.Request(url,data=None,headers={}, origin_req_host=None, unverifiable=False, method=None)

1.这个类是一个抽象的 URL 请求。
2.url 应该是一个字符串包含一个有效的 URL 。
3.数据必须是一个字节对象指定额外的数据发送到服务器 或 None。如果没有这样的数据是必要的,数据也可能是一个 iterable 对象而且在这种情况下必须在最开始时指定内容的长度。目前 HTTP 是唯一一个这样请求数据的,当数据参数被提供时,HTTP 请求将会执行 POST 请求而不是 GET 请求。
4.数据应该是一个缓冲的在标准应用程序中以x-www-form-urlencoded的格式。 urllib.parse.urlencode() 函数接受一个映射或序列集合,并返回一个 ASCII 文本字符串的格式。它应该在被用作数据参数之前,被编码为字节。
5.headers 应该是一个字典,如果 add_header() 被称为与每个键和值作为参数。这通常是用来“恶搞” User-Agent 头的值,因为使用一个浏览器识别本身——一些常见HTTP服务器只允许请求来自浏览器而不是脚本。例如,Mozilla Firefox可能识别本身 “Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。而 urllib 默认的用户代理字符串 是”Python-urllib/2.6”在Python 2.6()。
6.一个Content-Type header的例子: 用数据论证将发送一个字典 {“Content-Type”:”application/x-www-form-urlencoded”}。
7.最后两个参数只是正确处理第三方 HTTP cookie:
origin_req_host应该请求原始的主机交易,就像定义的 RFC 2965。它默认为 http.cookiejar.request_host(self)。这是原始请求的主机名或 IP 地址,由用户发起。例如。如果请求是一个图像在 HTML文档中,这应该是请求的请求主机包含图像的页面。
8.无法核实的表明是否应该请求是无法核实的,这由 RFC 2965 定义。它默认为 False。一个无法核实的请求的 URL 的用户没有允许的选择。例如,如果请求是一个图像在一个HTML文档,和用户没有选择通过图像的自动抓取,这应该是正确的。
9.这个方法应该是一个字符串,表示将使用(如 headers 请求头部信息)。如果提供,其值是存储在 method 属性和使用 get_method()。通过设置子类可能表明一个默认的方法 method类 本身的属性。

urllib.request.OpenerDirector

OpenerDirector 类打开 url 并通过 BaseHandler 连接在一起。它管理处理程序的连接,和恢复错误。

urllib.request.BaseHandler

这是对于所有已注册的处理程序的基类。

urllib.request.HTTPRedirectHandler

一个类来处理重定向。

urllib.request.HTTPCookieProcessor(cookiejar=None)

一个类来处理HTTP cookie。

urllib.request.ProxyHandler(proxies=None)

导致请求通过一个代理。如果代理是给定的,它必须是一个字典的代理协议名称映射到 ur l。默认值是从环境变量的列表 _proxy 中读取代理。如果没有代理设置环境变量,那么在 Windows 环境中代理设置了从注册表部分的网络设置,在 Mac OS X 环境代理信息检索的 OS X 系统配置框架。
禁用一个代理传递一个空的字典。
no_proxy 环境变量可以被用来指定主机不能通过代理;如果设置,它应该是一个以逗号分隔的主机名后缀。可选 :port 附加为例 cern.ch,ncsa.uiuc.edu,some.host:8080。
**请注意 **:HTTP_PROXY 如果一个变量将被忽略 REQUEST_METHOD 设置;参见文档 getproxies()。

urllib.request.HTTPPasswordMgr

保持一个(realm, uri) -> (user, password) 映射的数据库 。

urllib.request.HTTPPasswordMgrWithDefaultRealm

保持一个 (realm, uri) -> (user, password) 映射的数据库 。如果没有其他搜索领域,一个值为 None 的领域 (realm) 被认为是一个全方位领域。

urllib.request.HTTPPasswordMgrWithPriorAuth

保持一个 HTTPPasswordMgrWithDefaultRealm 变量 还有一个uri -> is_authenticated 映射的数据库 。当发送身份认证可以马上使用 BasicAuth handler 确认身份, 而不是等待 401 报错响应。

urllib.request.AbstractBasicAuthHandler(password_mgr=None)

这是 mixin 类,处理远程主机身份认证和代理。使用 is_authenticated 值对于一个给定的URI 来决定是否发送请求来进行身份认证。如果 s_authenticated 返回 True 则发送凭证。如果 is_authenticated 是 False ,则凭证不发送。如果 返回 401 错误响应信息,则身份认证失败。如果身份验证成功, update_authenticated 被称为设置 True。

urllib.request.HTTPBasicAuthHandler(password_mgr=None)

处理远程主机的身份认证。

urllib.request.ProxyBasicAuthHandler(password_mgr=None)

处理身份认证与代理。

urllib.request.AbstractDigestAuthHandler(password_mgr=None)

这是 mixin 类,处理远程主机身份认证和代理。

urllib.request.HTTPDigestAuthHandler(password_mgr=None)

实现远程主机的身份认证。如果有password_mgr,应该是兼容HTTPPasswordMgr的;请参阅章节 HTTPPasswordMgr以获取很多接口信息。Digest认证处理器和基本认证处理器都被加入,Digest认证处理器总是首先进行验证。如果主机再次返回一个40X 响应,它发送到基本认证处理器进行处理。当出现除了 Digest 或基本身份的其他身份认证时,这个处理程序方法将提高 ValueError 3.3版本的变化:提高 ValueError不支持的身份验证方案。

urllib.request.ProxyDigestAuthHandler(password_mgr=None)

处理代理身份的验证。如果有password_mgr,应该是兼容HTTPPasswordMgr的;请参阅章节HTTPPasswordMgr 获取更多接口信息。

urllib.request.HTTPHandler

处理HTTP URLs。

urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None)

处理开放的 HTTPS URLs 。在 http.client.HTTPSConnection 中 context 和 check_hostname 有相同的意义 。

urllib.request.FileHandler

打开本地文件。

urllib.request.DataHandler

开放数据 URLs。

urllib.request.FTPHandler

开放的 FTP URLs。

urllib.request.CacheFTPHandler

打开 FTP URLS,保持打开的 FTP 连接缓存来减少延迟。

urllib.request.UnknownHandler

全方位类处理未知的 URLs。

urllib.request.HTTPErrorProcessor

HTTP 错误响应过程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值