Python3 urllib常用操作

urllib库

python内置的HTTP请求库

四个模块:request,parse,error,rebotparser

一。request模块

请求对象组成:url,参数,请求头,请求体四部分。

response = urllib.request.urlopen(url,data=None,timeout,..)

response = urllib.request.urlopen(Request对象)

Request对象

urllib.request.Request(url,data,headers,method)

data是作为请求体进行传递的

data = bytes(utllib.parse.urlencode(map),'utf-8')

headers的一些属性:

User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求

Referer:有的服务器会识别headers中的referer是不是自己

Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。

application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用

application/json : 在 JSON RPC 调用时使用

application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务

例如

headers={

    'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',

    'Referer':'http://www.zhihu.com/articles'

}

response对象

响应对象组成:状态码,响应头,响应主体

状态码,响应头,响应主体

response.status

response.getheaders()    /   response.getheaders("server")

response.read().decode('utf-8')    # 如果不加decode,则返回的是bytes类型的流

二。parse模块(URL解析和URL引用)

1.URL解析:urlparse将url解析成各个组件和urlunparse将组件拼装成url

urlparse

urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)

# scheme指定协议类型,如果url中已经存在,则scheme不起作用

#allow_fragments为false时,fragment将为空,#后的内容将前移至path中,如果path之后的参数全为空

#URL组成

URL:scheme://netloc/path;parameters?query#fragment

urljoin

将前后两个url进行拼接,每个url分成6个部分,后面那个参数会被分割后会填充前面那个参数中分割后不存在的那个部分,双方都有的话,将以前者为准

urljoin('http://www.cwi.nl/%7Eguido/Python.html','FAQ.html')

>>>'http://www.cwi.nl/%7Eguido/FAQ.html'

urlencode

将字典转为query的形式

from urllib.parse import urlencode

params = {

    'name' :'tim',

    'age' :23

}

print(urlencode(params))

>>> name='tim'&age=23

urlunparse

将url的6个部分拼接成url

data = {'','',...}

三。error模块

由request产生。主要存在两个类:URLError,HTTPError(继承URLError)

URLError属性:reason

HTTPError属性:code,reason,headers

四。rebotparser模块

用来解析robots.txt文件,不常用。

五。高级用法

1. Opener

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。

如果我们需要用到Cookie或者Proxy,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie和Proxy的设置。

2. proxy代理

import urllib.request

proxy_handler = ProxyHandler({'http':'http://127.0.0.1:9999',...})

opener = build_opener(proxy_handler)

response = opener.open('http://..')

3. Cookielib

主要用来提供可存储的cookie对象。可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。可以通过F12->Application->Cookies中查看

CookieJar —-派生—->FileCookieJar  —-派生—–>MozillaCookieJar和LWPCookieJar

import http.cookiejar

#声明一个CookieJar对象实例来保存cookie

cookie = http.cookiejar,CookieJar()


#利用urllib库request模块的HTTPCookieProcessor对象来创建cookie处理器

handler=urllib.request.HTTPCookieProcessor(cookie)

#通过handler来构建opener

opener=urllib.request.build_opener(handler)

#此处的open方法同urllib2的urlopen方法,也可以传入request

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

for item in cookie:

    print'Name = '+item.name

    print'Value = '+item.value

使用MozillaCookieJar和LWPCookieJar可以将cookie保存到文件中,使用save来存储,使用load来加载。

#设置保存cookie的文件,同级目录下的cookie.txt

filename='cookie.txt'

#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件

cookie=http.cookiejar.MozillaCookieJar(filename)

#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器

handler=urllib2.request.HTTPCookieProcessor(cookie)

#通过handler来构建opener

opener=urllib.request.build_opener(handler)

#创建一个请求,原理同urllib2的urlopen

response=opener.open("http://www.baidu.com")

#保存cookie到文件

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

使用load来加载cookie文件到cookie

cookie = http.cookiejar.MozillaCookieJar()

cookie.load(filename,ignore_discard=True,ignore_expires=True)

handler=urllib2.request.HTTPCookieProcessor(cookie)

#通过handler来构建opener

opener=urllib.request.build_opener(handler)

#创建一个请求,原理同urllib2的urlopen

response=opener.open("http://www.baidu.com")




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容