国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python常用標(biāo)準(zhǔn)庫 --- urllib與urllib2

2019-11-06 08:12:16
字體:
供稿:網(wǎng)友

轉(zhuǎn)自:http://lizhenliang.blog.51cto.com/7876557/1872538

打開URL。urllib2是urllib的增強(qiáng)版,新增了一些功能,比如Request()用來修改Header信息。但是urllib2還去掉了一些好用的方法,比如urlencode()編碼序列中的兩個(gè)元素(元組或字典)為URL查詢字符串。

一般情況下這兩個(gè)庫結(jié)合著用,那我們也結(jié)合著了解下。

描述

urllib.urlopen(url, data=None, PRoxies=None)讀取指定URL,創(chuàng)建類文件對(duì)象。data是隨著URL提交的數(shù)據(jù)(POST)
urllib/urllib2.quote(s, safe='/')

將字符串中的特殊符號(hào)轉(zhuǎn)十六進(jìn)制表示。如:

quote('abc def') -> 'abc%20def'

urllib/urllib2.unquote(s)與quote相反
urllib.urlencode(query, doseq=0)將序列中的兩個(gè)元素(元組或字典)轉(zhuǎn)換為URL查詢字符串
urllib.urlretrieve(url, filename=None, reporthook=None, data=None)將返回結(jié)果保存到文件,filename是文件名
urllib2.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False)

一般訪問URL用urllib.urlopen(),如果要修改header信息就會(huì)用到這個(gè)。

data是隨著URL提交的數(shù)據(jù),將會(huì)把HTTP請(qǐng)求GET改為POST。headers是一個(gè)字典,包含提交頭的鍵值對(duì)應(yīng)內(nèi)容。

urllib2.urlopen(url, data=None, timeout=<object object>)timeout 超時(shí)時(shí)間,單位秒
urllib2.build_opener(*handlers)構(gòu)造opener
urllib2.install_opener(opener)把新構(gòu)造的opener安裝到默認(rèn)的opener中,以后urlopen()會(huì)自動(dòng)調(diào)用
urllib2.HTTPCookieProcessor(cookiejar=None)Cookie處理器
urllib2.HTTPBasicAuthHandler認(rèn)證處理器
urllib2.ProxyHandler代理處理器

urllib.urlopen()有幾個(gè)常用的方法:

方法描述
getcode()獲取HTTP狀態(tài)碼
geturl()返回真實(shí)URL。有可能URL3xx跳轉(zhuǎn),那么這個(gè)將獲得跳轉(zhuǎn)后的URL
info()返回服務(wù)器返回的header信息。可以通過它的方法獲取相關(guān)值
next()獲取下一行,沒有數(shù)據(jù)拋出異常
read(size=-1)默認(rèn)讀取所有內(nèi)容。size正整數(shù)指定讀取多少字節(jié)
readline(size=-1)默認(rèn)讀取下一行。size正整數(shù)指定讀取多少字節(jié)
readlines(sizehint=0)默認(rèn)讀取所有內(nèi)容,以列表形式返回。sizehint正整數(shù)指定讀取多少字節(jié)

示例:

1)請(qǐng)求URL

>>> import urllib, urllib2>>> response = urllib.urlopen("http://www.baidu.com")   # 獲取的網(wǎng)站頁面源碼>>> response.readline()'<!DOCTYPE html>/n'>>> response.getcode()200>>> response.geturl()'http://www.baidu.com'2)偽裝Chrome瀏覽器訪問

>>> user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36">>> header = {"User-Agent": user_agent}>>> request = urllib2.Request("http://www.baidu.com", headers=header) # 也可以通過request.add_header('User-Agent', 'Mozilla...')方式添加    >>> response = urllib2.urlopen(request)>>> response.geturl()'https://www.baidu.com/'>>> print respose.info()  # 查看服務(wù)器返回的header信息Server: bfe/1.0.8.18Date: Sat, 12 Nov 2016 06:34:54 GMTContent-Type: text/html; charset=utf-8Transfer-Encoding: chunkedConnection: closeVary: Accept-EncodingSet-Cookie: BAIDUID=5979A74F742651531360C08F3BE06754:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.comSet-Cookie: BIDUPSID=5979A74F742651531360C08F3BE06754; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.comSet-Cookie: PSTM=1478932494; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.comSet-Cookie: BDSVRTM=0; path=/Set-Cookie: BD_HOME=0; path=/Set-Cookie: H_PS_PSSID=1426_18240_17945_21118_17001_21454_21408_21394_21377_21525_21192; path=/; domain=.baidu.comP3P: CP=" OTI DSP COR IVA OUR IND COM "Cache-Control: privateCxy_all: baidu+a24af77d41154f5fc0d314a73fd4c48fExpires: Sat, 12 Nov 2016 06:34:17 GMTX-Powered-By: HphpX-UA-Compatible: IE=Edge,chrome=1Strict-Transport-Security: max-age=604800BDPAGETYPE: 1BDQID: 0xf51e0c970000d938BDUSERID: 0Set-Cookie: __bsi=12824513216883597638_00_24_N_N_3_0303_C02F_N_N_N_0; expires=Sat, 12-Nov-16 06:34:59 GMT; domain=www.baidu.com; path=/

這里header只加了一個(gè)User-Agent,防止服務(wù)器當(dāng)做爬蟲屏蔽了,有時(shí)為了對(duì)付防盜鏈也會(huì)加Referer,說明是本站過來的請(qǐng)求。還有跟蹤用戶的cookie。

3)提交用戶表單

>>> post_data = {"loginform-username":"test","loginform-passWord":"123456"}>>> response = urllib2.urlopen("http://home.51cto.com/index", data=(urllib.urlencode(post_data)))>>> response.read() # 登錄后網(wǎng)頁內(nèi)容

提交用戶名和密碼表單登錄到51cto網(wǎng)站,鍵是表單元素的id。其中用到了urlencode()方法,上面講過是用于轉(zhuǎn)為字典格式為URL接受的編碼格式。

例如:

>>> urllib.urlencode(post_data)'loginform-password=123456&loginform-username=test'

4)保存cookie到變量中

#!/usr/bin/python# -*- coding: utf-8 -*-import urllib, urllib2import cookielib# 實(shí)例化CookieJar對(duì)象來保存cookiecookie = cookielib.CookieJar()# 創(chuàng)建cookie處理器handler = urllib2.HTTPCookieProcessor(cookie)# 通過handler構(gòu)造openeropener = urllib2.build_opener(handler)response = opener.open("http://www.baidu.com")for item in cookie:    print item.name, item.value     # python test.pyBAIDUID EB4BF619C95630EFD619B99C596744B0:FG=1BIDUPSID EB4BF619C95630EFD619B99C596744B0H_PS_PSSID 1437_20795_21099_21455_21408_21395_21377_21526_21190_21306PSTM 1478936429BDSVRTM 0BD_HOME 0

urlopen()本身就是一個(gè)opener,無法滿足對(duì)Cookie處理,所有就要新構(gòu)造一個(gè)opener。

這里用到了cookielib庫,cookielib庫是一個(gè)可存儲(chǔ)cookie的對(duì)象。CookieJar類來捕獲cookie。

cookie存儲(chǔ)在客戶端,用來跟蹤瀏覽器用戶身份的會(huì)話技術(shù)。

5)保存cookie到文件

#!/usr/bin/python# -*- coding: utf-8 -*-import urllib, urllib2import cookielibcookie_file = 'cookie.txt'# 保存cookie到文件cookie = cookielib.MozillaCookieJar(cookie_file)# 創(chuàng)建cookie處理器handler = urllib2.HTTPCookieProcessor(cookie)# 通過handler構(gòu)造openeropener = urllib2.build_opener(handler)response = opener.open("http://www.baidu.com")# 保存cookie.save(ignore_discard=True, ignore_expires=True)  # ignore_discard默認(rèn)是false,不保存將被丟失的。ignore_expires默認(rèn)flase,如果cookie存在,則不寫入。 # python test.py# cat cookie.txt # Netscape HTTP Cookie File# http://curl.haxx.se/rfc/cookie_spec.html# This is a generated file!  Do not edit..baidu.com    TRUE    /    FALSE    3626420835    BAIDUID    687544519EA906BD0DE5AE02FB25A5B3:FG=1.baidu.com    TRUE    /    FALSE    3626420835    BIDUPSID    687544519EA906BD0DE5AE02FB25A5B3.baidu.com    TRUE    /    FALSE        H_PS_PSSID    1420_21450_21097_18560_21455_21408_21395_21377_21526_21192_20927.baidu.com    TRUE    /    FALSE    3626420835    PSTM    1478937189www.baidu.com    FALSE    /    FALSE        BDSVRTM    0www.baidu.com    FALSE    /    FALSE        BD_HOME    0

MozillaCookieJar()這個(gè)類用來保存cookie到文件。

6)使用cookie訪問URL

#!/usr/bin/python# -*- coding: utf-8 -*-import urllib2import cookielib# 實(shí)例化對(duì)象cookie = cookielib.MozillaCookieJar()# 從文件中讀取cookiecookie.load("cookie.txt", ignore_discard=True, ignore_expires=True)# 創(chuàng)建cookie處理器handler = urllib2.HTTPCookieProcessor(cookie)# 通過handler構(gòu)造openeropener = urllib2.build_opener(handler)# request = urllib2.Request("http://www.baidu.com")response = opener.open("http://www.baidu.com")

7)使用代理服務(wù)器訪問URL

import urllib2proxy_address = {"http": "http://218.17.252.34:3128"}handler = urllib2.ProxyHandler(proxy_address)opener = urllib2.build_opener(handler)response = opener.open("http://www.baidu.com")print response.read()

8)URL訪問認(rèn)證

import urllib2auth = urllib2.HTTPBasicAuthHandler()# (realm, uri, user, passwd)auth.add_password(None, 'http://www.example.com','user','123456')opener = urllib2.build_opener(auth)response = opener.open('http://www.example.com/test.html')


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 门源| 黔西| 改则县| 花莲市| 鹤岗市| 黄骅市| 澄城县| 长兴县| 蒙自县| 赣榆县| 东丰县| 棋牌| 开原市| 东港市| 马关县| 肥城市| 新田县| 双桥区| 新昌县| 乐都县| 忻城县| 涞源县| 安化县| 吉木乃县| 镇远县| 柳河县| 阿瓦提县| 垣曲县| 德安县| 六安市| 大余县| 梧州市| 抚州市| 承德市| 平原县| 太谷县| 七台河市| 津市市| 包头市| 盐源县| 衡水市|