|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Stubborn 于 2019-2-16 00:37 编辑
有大神可以告诉我,这个请求模块有什么优点嘛?书本后面介绍的requests模块秒杀几条街,而且没有这么繁琐。
Urllib库包含4个模块
- request:是最基本的HTTP请求模块,可以模拟发送请求。
- error:异常处理模块。
- parse:工具模块,提供许多的URL处理方法,比如拆分,解析,合并等等。
- robotparser:识别网站的robots.txt文件
request模块:
1.urlopen():
- urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
复制代码
- url:目标资源在网路中的位置。可以是一个表示URL的字符串(如:https://www.baidu.com/)
- data:data用来指明发往服务器请求中的额外的参数信息(如:在线翻译,在线答题等提交的内容),data默认是None,此时以GET方式发送请求;当用户给出data参数的时候,改为POST方式发送请求。
- timeout:设置参数超时,单位为秒,如果访问网页超出设定时间,它会抛出一个URLError的异常,属于urllib.error模块,错误原因是超时,因此我们可以配合try来跳过当前访问超时的网页
- cafile、capath、cadefault 参数:用于实现可信任的CA证书的HTTP请求。(基本上很少用)
- context参数:实现SSL加密传输。(基本上很少用)
使用实例:
- import urllib.request
- response = urllib.request.urlopen("url")#url具体的网址
- print(response.read().decode("utf-8")
复制代码
如上面最简单的三行代码即可抓取网页的源代码。然后进行解析得到需要的数据。
同时response是一个HTTPResponse类型的对象,主要包含:
read(),readinto(),getheader(name),getheaders(),fileno()等方法以及msg,version,status,reason,debuglevel,closed等属性
通过response变量,可以调用这些方法和属性。得到返回结果的一些列信息。
2.Request():
- urllib.request.Request(url=url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
复制代码
- url是必选参数,用于请求URL,其他都是可选参数。
- data如果要传,必须传bytes(字节流)类型的。如果是字典,可以先用urllib.parse模块里面的urlencode()编码
- headers是一个字典,他就是请求头,用来伪装模拟。
- origin_req_host指的是请求方的host名称或者IP地址
- unverifiable表示这个请求时无法验证的,默认为False,意思就是说用户没有足够的权限来选择这个接收是请求的结果,例如,我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这是unverifiable的值为Ture
- method是一个字符串,用来指示请求使用的方法,比如GET,POST和PUT等
使用实例:
- from urllib import request, parse
- url = "http://httpbin.org/post"
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
- "Host": "httpbin.org"
- }
- dict = {
- "name": "Stubbron"
- }
- data = bytes(parse.urlencode(dict), encoding="utf-8")
- req = request.Request(url=url, data=data, headers=headers, method="POST")
- response = request.urlopen(req)
- print(response.read().decode("utf-8"))
复制代码
req中,我们通过了4个参数构造了一个请求,其中url为请求的网页,headers中指定了User-Agent和Host,参数data用urlencode()和bytes()方法转换成节流,指定了请求方法为POST。
另外headers(请求头)也可以用add_header这个来进行添加。
- req = request.Request(url=url, data=data, method="POST")
- req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
复制代码
error模块
URLError类都来自urllib库的error模块,它继承OSerror类,由request模块所产生的异常都会捕捉到
HTTPError是URLError的子类,专门用来处理HTTP的请求错误。它有如下三个属性。
- code:返回HTTP的状态码
- reson:用于返回错误的原因
- headers:返回请求头
以下例子:
- from urllib import request, error
- try:
- response = request.urlopen("https://cuiqingcai.com/index.html")
- except error.HTTPError as e:
- print(e.reason, e.code, e.headers)
- except error.URLError as e:
- print(e.reason)
- else:
- print("Resquest")
复制代码
返回结果:
- Not Found 404 Server: nginx/1.10.3 (Ubuntu)
- Date: Tue, 12 Feb 2019 14:22:03 GMT
- Content-Type: text/html; charset=UTF-8
- Transfer-Encoding: chunked
- Connection: close
- Vary: Cookie
- Expires: Wed, 11 Jan 1984 05:00:00 GMT
- Cache-Control: no-cache, must-revalidate, max-age=0
- Link: <https://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"
复制代码
由于HTTPError是URLError的子类,所以建议先捕获HTTPError,获取它的错误状态码,原因,headers等,如果不是HTTPError异常,就会捕获URLError异常,输出错误原因,最后用else来处理处理正常逻辑。
parse()模块:
urlparse()用于URL的识别与分段:
- urlparse(url=url,scheme="",allow_fragments=False)
复制代码
- url代表需要解析的网址
- scheme代表默认协议
- allow_fragments:代表是否忽略锚点(fragments)
最后注意ParseResult返回的是一个元祖,所以可以通过索引顺序来获取。
以下例子:
- from urllib.parse import urlparse
- result = urlparse("http://www.baidu.com/index.html;user?id=5#comment")
- print(type(result), result)
复制代码
结果如下:
- <class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
复制代码
分别代表了协议(scheme),域名(netloc),访问路径(path),参数(params),查询条件(query),锚点(fragment)
urlunparse()
用于构造url,实例
- from urllib.parse import urlunparse
- data = ['http', 'www.baidu.com', '/index.html', 'user', 'id=5', 'comment']
- print(urlunparse(data))
复制代码
结果如下:
- http://www.baidu.com/index.html;user?id=5#comment
复制代码
下面还有很多的URL构造,我看书看了很久,有大神有看的话,可以告诉我,花那么大的力气必要来构造一个URL有没有必要,是不是我学的太粗浅
urlsplit(),urlunsplit(),urljoin(),urlencode(),parse_qs(),parse_qsl(),quote(),unquote()
下面介绍几个高级操作:
比如另外一些高级操作,如Cookies处理,代理设置等,我们需要用到更强大的工具: Handler, 可以理解他为各种处理器,利用他们我们几乎可以做到HTTP请求中的所用事情
首先介绍下urllib.request模块里面的BaseHandler类,它是所有其他Handler的父类,它提供了最基本的方法,如default_open(), protcol_resquest()等
接下来就用各种Handler子类继承这个Basehandler类,举例如下:
- HTTPDefauktErroeHandler: 用于处理HTTP响应错误,错误都会抛出HTTPError异常。
- HTTPRedurectHandler: 用于处理重定向
- HTTPCookieProcessor: 用于处理Cookies
- ProxyHandler: 用于设置代理,默认为空
- HTTPPasswordMgr: 用于管理摩玛,维护用户和密码的表
- HTTPBasicAuthHandler: 用于管理认证,如果一个连接打开时需要认证,可以用它来进行解决认证问题
还有其他的handler类,参考官方文档:https://docs.python.org/3/librar ... request.BaseHandler
验证:
- from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
- from urllib.error import URLError
- username = "Stubbron"
- password = "password"
- url = "http://localhost:5000"
- p = HTTPPasswordMgrWithDefaultRealm()
- p.add_password(None, uri=url, user=username, passwd=password)
- auth_passwd = HTTPBasicAuthHandler(p)
- opener = build_opener(auth_passwd)
- 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
代理:
- from urllib.error import URLError
- from urllib.request import ProxyHandler, build_opener
- proxy = ProxyHandler({
- "https": "https://127.0.0.1:9473",
- "http": "http://127.0.0.0:9473"
- })
- opener = build_opener(proxy)
- try:
- response = opener.open("http://www.baidu.com", timeout=5)
- print(response.read().decode("utf-8"))
- except URLError as e:
- print(e.reason)
复制代码
如上已经搭建一个代理,然后利用这个Haddler以及build_opener()方法构造一个请求就可以。
Cookies:
将获取到的cookies以LWP格式保存在cookie.txt文本中
- import http.cookiejar, urllib.request
- filename = "cookie.txt"
- cookie = http.cookiejar.LWPCookieJar(filename=filename)
- handler = urllib.request.HTTPCookieProcessor(cookie)
- opener = urllib.request.build_opener(handler)
- response = opener.open("http://www.baidu.com")
- cookie.save(ignore_expires=True, ignore_discard=True)
复制代码
下面是读取以及利用cookies
- import http.cookiejar,urllib.request
- cookie = http.cookiejar.LWPCookieJar()
- cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
- handler = urllib.request.HTTPCookieProcessor(cookie)
- opener = urllib.request.build_opener(handler)
- response = opener.open("http://www.baidu.com")
- print(response.read().decode("utf-8"))
复制代码
robotparser模块
简单的说用来网站的robots.txt文件,这个文件说明你那些地方可以爬取,那些地方是禁止爬取的,它是一个网络协议。个人写的一些小爬虫,可以直接无视,不做多讲。 |
|