urllib的高级用法
Handler简介
我们可以把他理解为各种处理器,有专门处理登录验证的,有处理cookies的,有处理代理设置的。利用他们,我们几乎可以做到HTTP请求中的所有事情。
首先,介绍一下 urllib.request模块里的 BaseHandler 类,它是所有其他 Handler 的父类,它提供了最基本的方法,例如 default_open ()、 protocol_request ()等。
接下来,就有各种Handler子类继承这个BaseHandler类,举例如下。
HTTPDefaultErrorHandler: 用于处理HTTPError类型的异常。
HTTPRedirectHandler:用于处理重定向。
HTTPCookiesProcessor:用于处理cookies。
ProxyHandler:用于设置代理,默认代理为空。
HTTPpasswordMgr:用于管理密码,它维护了用户名和密码的表。
HTTPBasicAuthHandler:用于管理认证,如果一个了解打开时需要认证,那么可以用它来解决认证问题。
另外,还有其他的Handler类,这里就不一一举例了,详情可以参考官方文档:https://docs.python.org/3/library/urllib.request.html#urllib.request.BaseHandler.
关于怎么使用它们,现在先不用着急,后面会有实例演示 。
另一个比较重要的类就是 Op enerDirector ,我们可以称为 Opener 。 我们之前用过 urlopen ()这个
方法,实际上它就是 urllib 为我们提供的一个 Opener 。
那么,为什么要引人 Opener 呢?因为需要实现更高级的功能 。 之前使用的 Request 和 urlopen( )
相当于类库为你封装好了极其常用的请求方法,利用它们可以完成基本的请求,但是现在不一样了,
我们需要实现更高级的功能,所以需要深入一层进行配置,使用更底层的实例来完成操作,所以这里
就用到了 Opener 。
Opener 可以使用 open ()方法,返回的类型和 urlopen ()如出 一辙 。 那么,它和 Handler 有什么关
系呢?简而言之,就是利用 Handler 来构建 Opener 。
下面用几个实例来看看它们的用法 。
那么,如果要请求这样的页面,该怎么办呢?借助 HTTPBasicAuthHandler 就可以完成,相关代码
如下:
from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.error import URLError
username = username
password =’ password ’
url = ’ http: //localhost:sooo/'
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None, url, username , password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler) try:
result = opener.open(url)
html = result. read(). decode (’ utf 8 ’)
print(html)
except URLError as e:
print(e.reason)
这里首先实例化 HTTPBasicAuthHandler 对象,其参数是 HTTPPasswordMgrWithDefaultRealm 对象,
它利用 add_password ()添加进去用户名和密码,这样就建立了一个处理验证的 Handler.
接下来,利用这个 Handler 并使用 build_opener ()方法构建一个 Opener ,这个 Opener 在发送请求
时就相当于已经验证成功了 。
接下来,利用 Opener 的 open ()方法打开链接,就可以完成验证了 。 这里获取到的结果就是验证
后的页面源码内容 。
#·代理
#在做爬虫的时候,免不了要使用代理,如果要添加代理,可以这样做:
from urllib.error import URLError
from urllib.request import ProxyHandler, build opener
proxy _handler = ProxyHandler({
'http':’ http://127.0.0.1:9743',
'https':'https://127.0 .0.1:9743'
})
opener = build_opener(proxy_handler)
try:
response = opener.open (’ https://www.baidu.com')
print(response.read() .decode (’ utf-8'))
except URLError as e:
print(e.reason)
这里我们在本地搭建了一个代理,它运行在 9743 端口上 。
这里使用了 ProxyHand l er ,其参数是一个字典,键名是协议类型(比如 HTTP 或者 HTTPS 等),
键值是代理链接,可以添加多个代理。
然后,利用这个 Handler 及 build_opener ()方法构造一个 Opener ,之后发送请求即可 。
•
Cookies
Cookies 的处理就需要相关的 Handler 了 。
我们先用实例来看看怎样将网站的 Cookies 获取下来,相关代码如下:
import http .cookiejar, urllib.request
cookie = http. cookie jar. CookieJar()
handler = urllib . request.HTTPCookieProcessor (cookie)
opener = urllib.request . build opener(handler )
response = opener. open (’ http://www.baidu.com')
for item in cookie:
print(item.name +”= ”+ i tem.value)
首先 ,我们必须声 明一个 CookieJar 对象 。 接下来,就需要利用 HTTPCookieProcessor 来构建一个
Handler ,最后利用 build_opener ()方法构建出 Opener ,执行 open () 函数即可 。
BAIDUID=2E6SA683F8A8BA3DF521469DF8EFF1E1 :FG=1
BIDUPSID=2E6SA683F8A8BA3DF521469DF8EFF1E1
H PS PSSID=20987 1421 18282 17949 21122 17001 21227 21189 21161 20927
PST问= 1474900615
BDSVRTM=O
BD HOME=O
可以看到,这里输州了每条 Cookie 的名称和值 。
不过既然能输出,那可不可以输出成文件格式呢?我们知道 Cookies 实际上也是以文本形式保存
的。
答案当然是肯定的,这里通过下面 的实例来看看:
filename = 'cookies. txt ’
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open (’ http://www .baidu.com')
cookie.save(ignore_discard=True , ignore_expires=True)
这时 CookieJar 就需要换成问ozillaCookieJar ,它在生成文件时会用到,是 CookieJar 的子类,可
以用来处理 Cookies 和文件相关的事件,比如读取和保存 Cookies ,可以将 Cookies 保存成 Mozilla 型
浏览器的 Cookies 格式 。
运行之后,可 以发现生成了一个 cookies.txt 文件,其内容如下:
另外, LWPCookieJar 同样可以读取和保存 Cookies ,但是保存的格式和 MozillaCookieJar 不一样,
它会保存成 libwww-perl(LWP)格式的 Cookies 文件 。
要保存成 LWP 格式的 Cookies 文件,可以在声明时就改为:
cookie = http. cookiejar. LWPCookieJar (filename)
此时生成的内容如下:
由此看来,生成的格式还是有比较大差异的 。
那么,生成了 Cookies 文件后,怎样从文件中读取并利用呢?
下面我们以 LWPCookieJar 格式为例来看一下:
可以看到,这里调用 load ()方法来读取本地的 Cookies 文件,获取到了 Cookies 的内容 。 不过前
提是我们首先生成了 LWPCooki eJar 格式的 Cookies ,并保存成文件,然后读取 Cookies 之后使用同样
的方法构建 Handler 和l Opener 即可完成操作 。
运行结果正常的话,会输出百度网页的源代码 。
通过上面的方法,我们可以实现绝大多数请求功能的设置了 。
这便是 urllib 库中 request 模块的基本用法,如果想实现更多的功能,可以参考官方文档的说明:
https ://docs. p ython.org/3/library/urllib . request.html#basehandler-objects 。
urllib的高级用法的更多相关文章
- Python爬虫入门之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- Python爬虫Urllib库的高级用法
Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...
- Python爬虫入门四之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 转 Python爬虫入门四之Urllib库的高级用法
静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...
- 爬虫 requests模块高级用法
一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内 ...
- Visual Studio 宏的高级用法
因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...
- SolrNet高级用法(分页、Facet查询、任意分组)
前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...
- sqlalchemy(二)高级用法
sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...
- Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...
随机推荐
- Could not find leader nimbus
运行storm ui, 然后访问storm ui 的网页的时候,死活跑不起来.后面,根据下面这篇文章的说法, 停止zookeeper 之后,删掉zookeeper 上面的storm 节点, 然后再重启 ...
- Android中的图片查看器
本案例,使用Eclipse来开发Android2.1版本号的图片查看器. 1)首先,打开Eclipse.新建一个Android2.1版本号的项目ShowTu,打开res/values中文件夹下的str ...
- Office EXCEL 如何保留一位小数,并且单击这个单元格的时候没有一大串小数
左侧有一列数据,即便我设置单元格格式,把小数位数设为1,看上去的确四舍五入,保留一位小数了,但是实际上我鼠标双击任意单元格,还是原来的数值,这样的数据如果是要发给别人的,肯定不好 如果进行选择性粘 ...
- Win7 丢失MSVCR110.DLL的解决办法
1 从下面的网站下载dll文件 http://www.ddooo.com/softdown/27034.htm 2 把该文件放到C:\Windows\SysWOW64目录下(64位系统)或者C:\ ...
- PHP开发者实用的代码
一.查看邮件是否已被阅读 当你在发送邮件时,你或许很想知道该邮件是否被对方已阅读.这里有段非常有趣的代码片段能够显示对方IP地址记录阅读的实际日期和时间. <? error_reporting( ...
- react-grid-layout
一个好用的拖拽.自适应布局 react 插件 基本使用: // 显示全部 chart 内容区域 import React,{PureComponent} from 'react'; import {R ...
- 使用JDBC 插入向数据库插入对象
package com.ctl.util; import java.io.IOException; import java.lang.reflect.Field; import java.lang.r ...
- WWDC笔记:2011 Session 125 UITableView Changes, Tips and Tricks
What’s New Automatic Dimensions - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSect ...
- Intellig Idea2017新建Web项目(tu'wen)
1.新建新工程项目 2.选择Java 和JDK版本 3.下一步Next(默认不勾选) 4.设置Project Name ,点击More Setting图标可以折叠.展开 然后Finish 我们可以看 ...
- create python project steps
Setting Up Your First Project You don't have to manually create the structure above, many tools will ...