2014年3月8日星期六

网页访问相关库使用总结

url解析相关

统一资源定位符(url)

scheme://domain:port/[path][;params][?query][#fragment]
  1. scheme:协议类型。
  2. domain:域名,如:mrlyc.blogspot.com
  3. port:端口号,默认是80。
  4. path:资源在服务器的逻辑路径,使用/分割。
  5. params:特殊参数,很少见,如:http://en.wikipedia.org/wiki/Robotics;Notes
  6. query:查询字符串。以?字符为起点,每个参数以&隔开,再以=分开参数名称与数据,通常以utf-8url编码,中文以%开头的16进制表示。
  7. fragment:信息段,指定了后会定位到指定id的位置。
注意:url应先编码再合并,先拆分再解码。

urlparse模块

urlparse

参数:

  1. url:指定的url。
  2. [scheme]:指定的协议。
  3. [allow_fragments]:是否允许指定信息段。

接受一个url字符串并将其分割成对应的6个部分,返回一个6元组。结果访问方法有两种,下标访问和属性引用。

url = "http://www.noaurl.com:8080/index.html;params?name=query#main"
p = urlparse.urlparse(url)
print p
print p[1]
print p.netloc

输出:

ParseResult(scheme=’http’, netloc=’www.noaurl.com:8080’, path=’/index.html’, params=’params’,query=’name=query’, fragment=’main’)
www.noaurl.com:8080
www.noaurl.com:8080

urlunparse

参数:

  1. dataurlparse对应的6元组。

urlparse的逆操作,构造一个url字符串。

urlsplit

urlparse,区别是没有对params的处理,params会向前合并,因此不推荐使用。

urlunsplit

urlsplit的逆操作,接受一个5元组,构造一个url字符串。

urljoin

参数:

  1. base:基址。
  2. url:相对地址。
  3. [allow_fragments]:是否允许指定信息段。

将相对地址根据基址成绝对地址。

urllib模块

推荐使用urllib2,因此只简单带过。

urlencode

参数:

  1. query:可以是二元元组或者字典。
  2. [doseq]:对参数值为列表的项是否拆分为多项,默认为False

将数据按照URL中的要求组成一个参数字符串。

data = (("q", 123), ("t", ("r", "w")))
print urllib.urlencode(data)
print urllib.urlencode(dict(data))
print urllib.urlencode(data, True)
print urllib.urlencode(data, False)

输出:

q=123&t=%28%27r%27%2C+%27w%27%29
q=123&t=%28%27r%27%2C+%27w%27%29
q=123&t=r&t=w
q=123&t=%28%27r%27%2C+%27w%27%29

网络访问相关

urllib2快速使用

暂基于python 2.x

quote

参数:

  1. s:待转码字符串。
  2. [safe]:不转码字符,默认不转换/

对url中特殊字符进行转码,如中文、空格和特殊符号。

unquote

参数:

  1. s:待反转码字符串。

quote的反函数,将已转码字符反转码。

urlopen

参数:

  1. url:请求的url,也可以是Request对象,会抛出urllib2.URLError异常。
  2. [data]:请求参数,字典类型。
  3. **timeout:设置超时,单位为秒,超时后抛出socket.timeout异常。

urlopen用于快速打开一个url,根据参数提交方式不同能够选择两种方式:

  • GET:参数位于url之后,data为空。
  • POST:将参数作为data提交。

返回值是一个类文件对象。

Request对象

构造参数:

  1. url:请求的url。
  2. [data]:查询字符串。
  3. [headers]:请求头。
  4. [origin_req_host]:请求的服务的地址,当服务器请求一个网页中的一幅图像时,origin_req_host就是该页面的url。
  5. [unverifiable]:说明请求是否是无法验证的。

参考文档:urllib.request — Extensible library for opening URLs
Request对象是一个url请求的抽象。

urllib2高级应用

Handlers一览

处理器类名 作用
ProxyHandler 处理代理操作
UnknownHandler Raise URLError异常
HTTPHandler 处理HTTP的GET和POST操作
HTTPDefaultErrorHandler 处理HTTP Error的通用处理,所有的响应都会抛出HTTPError异常
HTTPRedirectHandler 处理HTTP重定向操作,如301、302、303等和HEAD请求的307都会执行重定向操作
FTPHandler 处理FTP操作
FileHandler 处理文件
HTTPErrorProcessor 处理非200异常
HTTPCookieProcessor 处理cookie
HTTPBasicAuthHandler 处理Auth
ProxyBasicAuthHandler 处理Proxy和Auth
HTTPDigestAuthHandler 处理DigestAuth
ProxyDigestAuthHandler 处理ProxyDigest
HTTPSHandler 处理HTTPS请求
CacheFTPHandler 比FTPHandler多点功能

ProxyHandler

使用代理来访问网络。
构造参数:

  1. [proxies]:需要代理的协议和地址。
import urllib2
proxy_handler = urllib2.ProxyHandler({"http":"127.0.0.1:8087","https":"127.0.0.1:8087"})

HTTPCookieProcessor

添加对cookies的处理,依赖cookielib库。添加后能从HTTP请求中提取cookies,并在HTTP响应中回发。

import urllib2
import cookielib

cj = cookielib.CookieJar()
cookie_processor = urllib2.HTTPCookieProcessor(cj)

opener

build_opener

生成opener。

opener = urllib2.build_opener(cookie_processor,proxy_handler)

open

使用opener打开网址或请求。

response = opener.open(url)

install_opener

将指定opener装载为全局opener,影响urllib2.urlopen

urllib2.install_opener(opener)

更多资料

Python 标准库 urllib2 的使用细节
python模块学习之—- urllib2模块详解
Python Urllib2使用:代理及其它


@LYC
转载请注明出处

0 评论:

发表评论