【Python入門】30.常用內(nèi)置模塊之 HTTP請(qǐng)求庫urllib & 實(shí)現(xiàn)簡(jiǎn)單爬蟲 和 自動(dòng)登錄微博

摘要:教你如何快速爬取一個(gè)網(wǎng)頁信息卡乾;urllib模塊中常用的方法介紹;通過修改頭信息來偽裝成瀏覽器訪問頁面信卡;Get請(qǐng)求和Post請(qǐng)求的介紹


*寫在前面:為了更好的學(xué)習(xí)python隔缀,博主記錄下自己的學(xué)習(xí)路程。本學(xué)習(xí)筆記基于廖雪峰的Python教程傍菇,如有侵權(quán)猾瘸,請(qǐng)告知?jiǎng)h除。歡迎與博主一起學(xué)習(xí)Pythonヽ( ̄▽ ̄)? *


目錄

常用內(nèi)置模塊
urllib
簡(jiǎn)單爬蟲
urlopen
urllib的常用方法
模擬瀏覽器
Get請(qǐng)求(百度搜索關(guān)鍵字)
Post請(qǐng)求(登錄新浪微博)
小結(jié)

常用內(nèi)置模塊

urllib

Urllib是Python內(nèi)置的HTTP請(qǐng)求庫丢习,或者說牵触,就是用來操作URL的。在爬蟲的時(shí)候常用到這個(gè)庫咐低。

簡(jiǎn)單爬蟲

要爬取網(wǎng)頁信息揽思,首先我們要引入urllib.request模塊,這是一個(gè)請(qǐng)求模塊见擦。

然后通過urllib.requesturlopen( )方法來打開一個(gè)網(wǎng)頁钉汗。

最后使用read( )方法來獲取網(wǎng)頁信息。

我們以百度http://www.baidu.com為例

import urllib.request
f = urllib.request.urlopen ('http://www.baidu.com')
data = f.read()

這樣我們就獲取了該網(wǎng)頁的內(nèi)容鲤屡,此外损痰,我們還要把它保存下來。

添加一個(gè)html文件酒来,然后把data寫進(jìn)去:

import urllib.request
f = urllib.request.urlopen ('http://www.baidu.com')
data = f.read()

with open('./1.html','wb') as fh:
    fh.write(date)

此時(shí)卢未,我們打開指定目錄下的1.html,就能看到我們爬取的網(wǎng)頁了堰汉。(是不是炒雞簡(jiǎn)單(* ̄︶ ̄))

urlopen

我們都知道urlopen()函數(shù)是用來打開url的辽社,實(shí)際上它參數(shù)不止url一個(gè)。

urllib.request.urlopen()函數(shù)參數(shù)介紹:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

常用的參數(shù)是前三個(gè):url衡奥,data爹袁,timeout远荠。

url 是需要打開的網(wǎng)址矮固;
data 是需要傳入的數(shù)據(jù),一般在get請(qǐng)求方式使用譬淳;
timeout 是超時(shí)時(shí)間档址,當(dāng)網(wǎng)絡(luò)請(qǐng)求過慢,超過timeout設(shè)置的時(shí)間邻梆,就會(huì)給出異常守伸,而不是一直等待結(jié)果。

urllib的常用方法

下面看一些簡(jiǎn)單常用的urllib用法浦妄。

方法 作用
info() 返回網(wǎng)頁的當(dāng)前環(huán)境有關(guān)信息
getcode() 返回網(wǎng)頁狀態(tài)碼尼摹,若為200則正確见芹,若為其他則錯(cuò)誤
geturl() 返回網(wǎng)頁的url
urllib.request.quote() 對(duì)網(wǎng)址進(jìn)行編碼
urllib.request.unquote() 對(duì)網(wǎng)址進(jìn)行解碼

例子:

>>>import urllib.request
>>>f = urllib.request.urlopen ('http://www.baidu.com')
>>>f.info()
Bdpagetype: 1 
Bdqid: 0x8915e4020002cb95 
...
Transfer-Encoding: chunked 
>>>f.getcode()
200
>>>f.geturl()
http://www.baidu.com
>>>urllib.request.quote('http://www.baidu.com')
http%3A//www.baidu.com
>>>urllib.request.unquote('http%3A//www.baidu.com')
http://www.baidu.com

模擬瀏覽器

有時(shí)候,我們爬取網(wǎng)頁的時(shí)候會(huì)出現(xiàn)錯(cuò)誤蠢涝,這是因?yàn)檫@些網(wǎng)頁為防止惡意獲取信息進(jìn)行了反爬蟲設(shè)置玄呛。

為避免這種情況,一般而言我們會(huì)模擬成瀏覽器去訪問網(wǎng)頁和二。

要模擬成瀏覽器徘铝,就需要添加Headers信息,即頭信息惯吕。通過設(shè)置User-Agent可以讓爬蟲模擬成瀏覽器惕它。

如何添加Headers信息呢?這里需要用到urllib模塊中的urllib.request.Requset()函數(shù)废登。

調(diào)用urllib.request.Requset()函數(shù)可以創(chuàng)建一個(gè)request對(duì)象淹魄,調(diào)用時(shí)傳入三個(gè)參數(shù),第一個(gè)為url即網(wǎng)址信息钳宪,第二個(gè)為數(shù)據(jù)揭北,默認(rèn)為0,第三個(gè)為headers吏颖,即需要添加的頭信息搔体,要以dict類型傳入,默認(rèn)為不傳頭部半醉。

隨后疚俱,調(diào)用urllib.request.urlopen()打開request對(duì)象,就能實(shí)現(xiàn)模擬成瀏覽器訪問網(wǎng)頁了缩多。

看一下具體的代碼:

import urllib.request
 
url='http://www.baidu.com'                                     # 設(shè)置url的值

header={                                                       # 設(shè)置header的值
   'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'
}

request = urllib.request.Request(url, headers = header)        # 調(diào)用Request函數(shù)
data = urllib.request.urlopen(request).read()                  # 訪問網(wǎng)頁

with open('./1.html', 'wb') as fh:                             # 創(chuàng)建html文件并把數(shù)據(jù)保存下來
    fh.write(data)

還有個(gè)問題是怎么得到這個(gè)User-Agent的信息呢呆奕?

有個(gè)簡(jiǎn)單的方法:使用瀏覽器打開任意一個(gè)網(wǎng)頁,按F12衬吆,在彈出的界面的上方找到Network梁钾,點(diǎn)擊后會(huì)出現(xiàn)一些文件,點(diǎn)擊其中的一個(gè)逊抡,點(diǎn)擊右邊的header姆泻,在里面就有User-Agent信息。

(參考下圖進(jìn)行操作(`?ω?′))


如何獲取User-Agent

那么User-Agent表示什么呢冒嫡?

User Agent中文名為用戶代理拇勃,簡(jiǎn)稱 UA,它是一個(gè)特殊字符串頭孝凌,使得服務(wù)器能夠識(shí)別客戶使用的操作系統(tǒng)及版本方咆、CPU 類型、瀏覽器及版本蟀架、瀏覽器渲染引擎瓣赂、瀏覽器語言榆骚、瀏覽器插件等。

標(biāo)準(zhǔn)格式為: 瀏覽器標(biāo)識(shí) (操作系統(tǒng)標(biāo)識(shí); 加密等級(jí)標(biāo)識(shí); 瀏覽器語言) 渲染引擎標(biāo)識(shí) 版本信息
——百度百科

Get請(qǐng)求(百度搜索關(guān)鍵字)

如果要進(jìn)行客戶端與服務(wù)器端之間的消息傳遞煌集,我們可以使用HTTP協(xié)議請(qǐng)求進(jìn)行寨躁。

在本節(jié)內(nèi)容中介紹兩種常用的請(qǐng)求:Get和Post。先來看一下Get請(qǐng)求牙勘。

Get請(qǐng)求职恳,通過URL網(wǎng)址傳遞信息。我們可以把數(shù)據(jù)直接放在URL中方面,從而得到想要的信息放钦。

以百度搜索為例子。

當(dāng)我們用百度搜索Python時(shí)恭金,仔細(xì)觀察url會(huì)發(fā)現(xiàn)操禀,其中有wd=Python的字段。

事實(shí)上横腿,wd字段就是表示搜索的關(guān)鍵字颓屑,那么通過Get請(qǐng)求,就可以實(shí)現(xiàn)用爬蟲自動(dòng)使用百度搜索了:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import urllib.request

url='http://www.baidu.com/s?wd=' 
key=urllib.request.quote('三貝的博客')                   # 由于URL含有中文耿焊,需要編碼
url_all=url+key
header={                                                # 頭部信息
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'
}  
                                      
request = urllib.request.Request(url_all, headers=header)
data = urllib.request.urlopen(request).read()

with open('./search三貝的博客.html', 'wb') as f:        # 寫入文件中
    f.write(data)

打開指定目錄下的html文件揪惦,顯示的就是搜索指定關(guān)鍵字的頁面啦( ̄▽ ̄)~*。


搜索三貝的博客

Post請(qǐng)求(登錄新浪微博)

Post請(qǐng)求即向服務(wù)器發(fā)送數(shù)據(jù)罗侯,然后請(qǐng)求執(zhí)行相應(yīng)的操作器腋。比如登錄用戶。

我們只要把需要發(fā)送的數(shù)據(jù)放進(jìn)data里面钩杰,然后傳進(jìn)urlopen的data參數(shù)即可纫塌。

下面以登錄新浪微博為例(以下代碼除注釋轉(zhuǎn)自廖雪峰官網(wǎng))

from urllib import request, parse

print('Login to weibo.cn...')
email = input('Email: ')                    # 用戶輸入登錄的郵箱名
passwd = input('Password: ')                # 用戶輸入登錄的密碼
login_data = parse.urlencode([              # 登錄數(shù)據(jù),用dict類型儲(chǔ)存讲弄,parse.urlencode將dict轉(zhuǎn)為url參數(shù)
    ('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)             # 返回頁面執(zhí)行的狀態(tài)
    for k, v in f.getheaders():                      # 得到HTTP相應(yīng)的頭和JSON數(shù)據(jù)
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))         # 得到頁面信息

如果登錄成功( ̄▽ ̄)/措左,我們獲得的響應(yīng)如下:

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

如果登錄失敗(T▽T)/,我們獲得的響應(yīng)如下:

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

小結(jié)

urllib提供的功能就是利用程序去執(zhí)行各種HTTP請(qǐng)求避除。

關(guān)于Python爬蟲的知識(shí)點(diǎn)還有很多怎披,本節(jié)只是對(duì)urllib模塊進(jìn)行簡(jiǎn)單的介紹,供想Python入門的人兒學(xué)習(xí)驹饺,往后會(huì)有更詳細(xì)的內(nèi)容介紹ヾ(o?ω?)?钳枕。


以上就是本節(jié)的全部?jī)?nèi)容缴渊,感謝你的閱讀赏壹。

下一節(jié)內(nèi)容:常用內(nèi)置模塊之 XML

有任何問題與想法独泞,歡迎評(píng)論與吐槽撑帖。

和博主一起學(xué)習(xí)Python吧( ̄▽ ̄)~*

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昆咽,更是在濱河造成了極大的恐慌,老刑警劉巖蓖捶,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剑逃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稍坯,警方通過查閱死者的電腦和手機(jī)酬荞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞧哟,“玉大人混巧,你說我怎么就攤上這事∏诳” “怎么了咧党?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陨亡。 經(jīng)常有香客問我傍衡,道長(zhǎng),這世上最難降的妖魔是什么负蠕? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任蛙埂,我火速辦了婚禮,結(jié)果婚禮上遮糖,老公的妹妹穿的比我還像新娘箱残。我一直安慰自己,他們只是感情好止吁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布被辑。 她就那樣靜靜地躺著,像睡著了一般敬惦。 火紅的嫁衣襯著肌膚如雪盼理。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天俄删,我揣著相機(jī)與錄音宏怔,去河邊找鬼。 笑死畴椰,一個(gè)胖子當(dāng)著我的面吹牛臊诊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斜脂,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼抓艳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了帚戳?” 一聲冷哼從身側(cè)響起玷或,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤儡首,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后偏友,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔬胯,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年位他,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氛濒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹅髓,死狀恐怖泼橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迈勋,我是刑警寧澤炬灭,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站靡菇,受9級(jí)特大地震影響重归,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厦凤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一鼻吮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧较鼓,春花似錦椎木、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禽篱,卻和暖如春畜伐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躺率。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工玛界, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悼吱。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓慎框,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親后添。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笨枯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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