urllib的使用

Get:

urllib的request模塊可以非常方便地抓取URL內(nèi)容,也就是發(fā)送一個GET請求到指定的頁面,然后返回HTTP的響應:

例如屡拨,對豆瓣的一個URLhttps://api.douban.com/v2/book/2129650進行抓取谷饿,并返回響應:


from urllib import request

with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
    data = f.read()
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', data.decode('utf-8'))

HTTP響應的頭和JSON數(shù)據(jù):

Status: 200 OK
Server: nginx
Date: Tue, 26 May 2015 10:02:27 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2049
Connection: close
Expires: Sun, 1 Jan 2006 01:00:00 GMT
Pragma: no-cache
Cache-Control: must-revalidate, no-cache, private
X-DAE-Node: pidl1
Data: {"rating":{"max":10,"numRaters":16,"average":"7.4","min":0},"subtitle":"","author":["廖雪峰編著"],"pubdate":"2007-6",...}

如果我們要想模擬瀏覽器發(fā)送GET請求,就需要使用Request對象横辆,通過往Request對象添加HTTP頭,我們就可以把請求偽裝成瀏覽器茄猫。例如狈蚤,模擬iPhone 6去請求豆瓣首頁:

from urllib import request

req = request.Request('http://www.douban.com/')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
with request.urlopen(req) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

豆瓣會返回適合iPhone的移動版網(wǎng)頁:

 <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="format-detection" content="telephone=no">
    <link rel="apple-touch-icon" sizes="57x57"  />

Post:

如果要以POST發(fā)送一個請求,只需要把參數(shù)data以bytes形式傳入划纽。
我們模擬一個微博登錄脆侮,先讀取登錄的郵箱和口令,然后按照weibo.cn的登錄頁的格式以username=xxx&password=xxx的編碼傳入:

from urllib import request, parse

print('Login to weibo.cn...')
email = input('Email: ')
passwd = input('Password: ')
login_data = parse.urlencode([
    ('username', email),
    ('password', passwd),
    ('entry', 'mweibo'),
    ('client_id', ''),
    ('savestate', '1'),
    ('ec', ''),
    ('pagerefer', 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')
])

req = request.Request('https://passport.weibo.cn/sso/login')
req.add_header('Origin', 'https://passport.weibo.cn')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')

with request.urlopen(req, data=login_data.encode('utf-8')) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

如果登錄成功勇劣,我們獲得的響應如下:

Status: 200 OK
Server: nginx/1.2.0
...
Set-Cookie: SSOLoginState=1432620126; path=/; domain=weibo.cn
...
Data: {"retcode":20000000,"msg":"","data":{...,"uid":"1658384301"}}

如果登錄失敗靖避,我們獲得的響應如下:

Data: {"retcode":50011015,"msg":"\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef","data":{"username":"example@python.org","errline":536}}

Handler:

如果還需要更復雜的控制,比如通過一個Proxy去訪問網(wǎng)站比默,我們需要利用ProxyHandler來處理幻捏,示例代碼如下:

proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
with opener.open('http://www.example.com/login.html') as f:
    pass

總結(jié):

urllib提供的功能就是利用程序去執(zhí)行各種HTTP請求。如果要模擬瀏覽器完成特定功能命咐,需要把請求偽裝成瀏覽器篡九。偽裝的方法是先監(jiān)控瀏覽器發(fā)出的請求,再根據(jù)瀏覽器的請求頭來偽裝醋奠,User-Agent頭就是用來標識瀏覽器的榛臼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窜司,隨后出現(xiàn)的幾起案子沛善,更是在濱河造成了極大的恐慌,老刑警劉巖塞祈,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件金刁,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機尤蛮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門漠秋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抵屿,你說我怎么就攤上這事庆锦。” “怎么了轧葛?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵搂抒,是天一觀的道長。 經(jīng)常有香客問我尿扯,道長求晶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任衷笋,我火速辦了婚禮芳杏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辟宗。我一直安慰自己爵赵,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布泊脐。 她就那樣靜靜地躺著空幻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪容客。 梳的紋絲不亂的頭發(fā)上秕铛,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 文/蒼蘭香墨 我猛地睜開眼士袄,長吁一口氣:“原來是場噩夢啊……” “哼悲关!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娄柳,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎艘绍,沒想到半個月后赤拒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年挎挖,在試婚紗的時候發(fā)現(xiàn)自己被綠了这敬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蕉朵,死狀恐怖崔涂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情始衅,我是刑警寧澤冷蚂,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站汛闸,受9級特大地震影響蝙茶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诸老,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一隆夯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧别伏,春花似錦蹄衷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轴脐,卻和暖如春调卑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背大咱。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工恬涧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碴巾。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓溯捆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厦瓢。 傳聞我的和親對象是個殘疾皇子提揍,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Get urllib的request模塊可以非常方便地抓取URL內(nèi)容,也就是發(fā)送一個GET請求到指定的頁面煮仇,然后返...
    改變自己_now閱讀 1,121評論 0 2
  • urllib是python自帶的一個包劳跃,主要用于做爬蟲的(暫時接觸到的是這樣)。爬蟲也叫網(wǎng)絡蜘蛛浙垫,主要功能是獲取網(wǎng)...
    _Clown_閱讀 1,124評論 0 1
  • urllib庫是python內(nèi)置的HTTP請求庫刨仑。 包含以下四個模塊: 1.request 模塊 1.1 url...
    Fizz翊閱讀 595評論 0 1
  • 在Python3.x中郑诺,urllib包下有四個模塊分別是 urllib.request(python2.x的url...
    shenyoujian閱讀 423評論 0 1
  • Python3中將python2.7的urllib和urllib2兩個包合并成了一個urllib庫Python3中...
    meetliuxin閱讀 275評論 0 0