




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章
模塊Python程序設(shè)計(jì)01模塊、包和庫(kù)02常用標(biāo)準(zhǔn)庫(kù)模塊的使用03基于第三方庫(kù)的爬蟲(chóng)應(yīng)用04本章回顧01模塊、包和庫(kù)模塊是將功能封裝起來(lái),使用時(shí)直接導(dǎo)入,可提高代碼開(kāi)發(fā)效率、避免重復(fù)開(kāi)發(fā),類(lèi)似函數(shù)和類(lèi)有封裝思想,但模塊是更復(fù)雜功能的封裝容器。以洗衣機(jī)為例,將洗衣機(jī)類(lèi)比為模塊,人們使用洗衣機(jī)無(wú)需關(guān)心其工作原理,如同使用模塊無(wú)需了解其具體實(shí)現(xiàn),只需使用其功能。
在開(kāi)發(fā)過(guò)程中,總是會(huì)接觸到模塊、包、庫(kù)等概念,這些概念簡(jiǎn)單理解就是函數(shù)、類(lèi)、變量等可以封裝在模塊(module)中,多個(gè)模塊可以封裝到包(package)里面,多個(gè)包可以封裝到庫(kù)(library)里面。模塊及其導(dǎo)入方式我們?cè)诘谝徽碌臅r(shí)候,就接觸過(guò)模塊這個(gè)概念,那么到底什么是模塊呢?簡(jiǎn)單理解,模塊就是一個(gè)包含了許多功能/方法的文件,即每一個(gè).py文件都可以被當(dāng)成是一個(gè)模塊,模塊可以包含直接運(yùn)行的代碼塊、類(lèi)、函數(shù)或這幾種的組合。導(dǎo)入模塊的常用方式有三種,分別是import語(yǔ)句、from…import語(yǔ)句和from…import*語(yǔ)句。模塊及其導(dǎo)入方式import語(yǔ)句import語(yǔ)句用于導(dǎo)入整個(gè)模塊,支持導(dǎo)入多個(gè)模塊,語(yǔ)法格式如下:
以我們之前使用過(guò)的隨機(jī)生成整數(shù)的函數(shù)randint為例,由于需要使用randint函數(shù),而randint函數(shù)位于random模塊下,所以在使用randint函數(shù)之前需要使用語(yǔ)句“import
random”進(jìn)行模塊導(dǎo)入,如下圖所示。模塊及其導(dǎo)入方式如果在使用randint函數(shù)之前沒(méi)有導(dǎo)入random模塊,將會(huì)報(bào)NameError錯(cuò)誤,提示“name'random'isnotdefined”,如下圖所示。模塊及其導(dǎo)入方式使用import語(yǔ)句的方式導(dǎo)入,因?yàn)槭菍?dǎo)入的整個(gè)模塊,所以需要使用“模塊名.函數(shù)名”的方式調(diào)用函數(shù)。除此之外,我們還可以使用as關(guān)鍵字對(duì)引入的模塊重命名,如下圖所示。模塊及其導(dǎo)入方式from…import語(yǔ)句模塊導(dǎo)入除了可以整個(gè)模塊都導(dǎo)入之外,也可以使用“from…import語(yǔ)句”只導(dǎo)入某個(gè)或某幾個(gè)函數(shù),語(yǔ)法格式如下:
使用此種方式導(dǎo)入,可以直接使用函數(shù)名進(jìn)行調(diào)用,還是以random模塊為例,如下圖所示。模塊及其導(dǎo)入方式from…import*語(yǔ)句使用“from…import*語(yǔ)句”可以導(dǎo)入一個(gè)模塊的所有內(nèi)容,舉例如下圖所示。自定義模塊自定義模塊就是根據(jù)業(yè)務(wù)需求自行定義的模塊,JupyterNotebook對(duì)自定義模塊的支持不是很友好,所以為了演示自定義模塊的使用,我們使用安裝Anaconda時(shí)自帶的另一個(gè)工具Spyder,如下圖所示。自定義模塊打開(kāi)Spyder,在本地電腦上找一個(gè)合適的位置新建一個(gè)文件夾“test_module”,然后在此文件夾下新建一個(gè)“animal_act.py”文件(File->NewFile),然后將“案例7:馬戲團(tuán)動(dòng)物表演”中的【代碼5-12】粘貼進(jìn)去,單擊“運(yùn)行按鈕”,看控制臺(tái)是否輸出正常,如下圖所示。此時(shí)“animal_act.py”文件就是一個(gè)自定義的模塊,想要引用這個(gè)模塊,分為同級(jí)目錄下引用和非同級(jí)目錄下引用兩種情況。自定義模塊同級(jí)目錄下引用我們?cè)诤退粋€(gè)文件夾“test_module”中新建一個(gè)“test.py”文件,此時(shí)如果想在“test.py”文件中引入自定義模塊“animal_act.py”,可以使用“import語(yǔ)句”直接導(dǎo)入,如下圖所示。自定義模塊非同級(jí)目錄下引用自定義模塊,直接用import無(wú)法找到,要借助sys模塊導(dǎo)入自定義模塊的path。以新建文件夾“test_module2”及其下的文件“test2.py”為例,若要在“test2.py”中引入非同級(jí)目錄下的自定義模塊“animal_act.py”,直接引入會(huì)報(bào)錯(cuò)。如下圖所示自定義模塊正確的引用方式如下所示。此時(shí)單擊“運(yùn)行按鈕”,可以正常運(yùn)行“animal_act.py”文件下的start()方法了,運(yùn)行結(jié)果如下圖所示。什么是包在Python中,包是一個(gè)分層次的文件目錄結(jié)構(gòu),是由模塊及子包、子包下的子包等組成的Python應(yīng)用環(huán)境。簡(jiǎn)單理解包就是文件夾,但是該文件夾下必須包含“__init__.py”文件(__init__.py文件內(nèi)容可以為空),也就是“__init__.py”文件用于標(biāo)識(shí)當(dāng)前文件夾是否為一個(gè)包?!癬_init__.py”文件的作用可總結(jié)為:
與普通目錄的區(qū)別標(biāo)識(shí),即用于標(biāo)識(shí)當(dāng)前文件夾是否為一個(gè)包。
編寫(xiě)代碼,定義類(lèi)、函數(shù)、變量等。包的使用為了更好地演示包的使用,我們還是使用Spyder工具。打開(kāi)Spyder,在本地電腦上找一個(gè)合適的位置新建一個(gè)文件夾“testpackage”,在此文件夾下新建一個(gè)空的“__init__.py”文件(Spyder中新建文件:File->NewFile),然后再分別建文件“testpackage1.py”和“testpackage2.py”,此時(shí)目錄結(jié)構(gòu)如下圖所示。包的使用文件“testpackage1.py”和“testpackage2.py”中的代碼分別如下所示。包的使用然后我們?cè)诎饷嫘陆ㄒ粋€(gè)文件“usepackage.py”,在文件中引入包并使用其中的模塊,如下所示運(yùn)行“usepackage.py”文件,結(jié)果如下圖所示。標(biāo)準(zhǔn)庫(kù)與常用標(biāo)準(zhǔn)庫(kù)模塊庫(kù)是為了方便管理與安裝,將能夠?qū)崿F(xiàn)某一功能的模塊和包封裝而成的集合。根據(jù)庫(kù)是否已經(jīng)包含在Python官方安裝包中,可以將其分為標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)。標(biāo)準(zhǔn)庫(kù)就是在Python官方安裝包中包含的庫(kù),即安裝好Python后就具有的庫(kù)。標(biāo)準(zhǔn)庫(kù)中的模塊就是標(biāo)準(zhǔn)庫(kù)模塊,常用的標(biāo)準(zhǔn)庫(kù)模塊總結(jié)如表所示。第三方庫(kù)第三方庫(kù)就是在Python官方安裝包中不包含的庫(kù),第三方庫(kù)中的模塊即第三方模塊。想要使用第三方庫(kù)中的模塊,需要先安裝第三方庫(kù)。第三方庫(kù)可以在命令行窗口使用pip命令在線安裝,也可以先下載相應(yīng)的第三方庫(kù)安裝程序,然后再進(jìn)行安裝。Python的一大優(yōu)勢(shì)就是有豐富且易用的第三方庫(kù)及模塊,省去了大量重復(fù)造輪子的時(shí)間,常用的第三方模塊有用于圖像處理的pillow,用于處理URL資源的requests,用于數(shù)據(jù)可視化的matplotlib等。02常用標(biāo)準(zhǔn)庫(kù)模塊的使用在實(shí)際開(kāi)發(fā)中我們要經(jīng)常使用系統(tǒng)的標(biāo)準(zhǔn)庫(kù)模塊,比如我們想實(shí)現(xiàn)字符串匹配功能,可以使用正則表達(dá)式re模塊;想要實(shí)現(xiàn)時(shí)間相關(guān)功能,可以使用time模塊、datetime模塊;想要實(shí)現(xiàn)數(shù)學(xué)運(yùn)算,可以使用math模塊;想要實(shí)現(xiàn)加密功能,可以使用hashlib模塊;本節(jié)我們將對(duì)上述模塊的基本使用進(jìn)行介紹。正則表達(dá)式是用于匹配字符串中字符組合的模式,可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。正則表達(dá)式是用來(lái)匹配字符串的非常強(qiáng)大的工具,正則表達(dá)式主要由普通字符、元字符、重復(fù)限定符等組成。普通字符就是大小寫(xiě)字母、數(shù)字等,用于匹配自身。正則表達(dá)式可以是單個(gè)字符、也可以是由上訴字符任意組合形成的字符集合。正則表達(dá)式介紹元字符元字符是構(gòu)造正則表達(dá)式的一種基本元素,常用的元字符總結(jié)如右表所示。了解了元字符之后,我們就可以開(kāi)始寫(xiě)一些簡(jiǎn)單的正則表達(dá)式了,如11位手機(jī)號(hào)碼的正則表達(dá)式可表示如下:正則表達(dá)式介紹重復(fù)限定符上述舉例的表示手機(jī)號(hào)的正則表達(dá)式有很多重復(fù)的元字符“\d”,為了解決這一問(wèn)題,正則表達(dá)式中提供了重復(fù)限定符。常用的重復(fù)限定符總結(jié)如表所示。正則表達(dá)式介紹有了上一個(gè)表中的重復(fù)限定符后,我們之前舉例的11位手機(jī)號(hào)碼的正則表達(dá)式就可以寫(xiě)成如下的形式:分組
正則表達(dá)式中用小括號(hào)“()”來(lái)做分組,也就是小括號(hào)中的內(nèi)容作為一個(gè)整體。因此181號(hào)段電話號(hào)碼的正則表達(dá)式可表示如下:正則表達(dá)式介紹選擇字符還是以手機(jī)號(hào)碼為例,大家都知道,國(guó)內(nèi)的手機(jī)號(hào)都來(lái)自電信、聯(lián)通、移動(dòng)三大運(yùn)營(yíng)商,而每個(gè)運(yùn)營(yíng)商提供的號(hào)段是不一樣的,以電信手機(jī)號(hào)為例,其號(hào)段有199、191、189、181、180、177、173、153和133。此時(shí)我們想寫(xiě)電信手機(jī)號(hào)的正則表達(dá)式,就需要用到選擇字符或“|”來(lái)實(shí)現(xiàn),其正則表達(dá)式如下:區(qū)間正則表達(dá)式中提供中括號(hào)“[]”來(lái)表示區(qū)間條件,如數(shù)字0~9可以寫(xiě)成[0-9],字母a~z可以寫(xiě)成[a-z]。需要注意的是字符“^”在區(qū)間中不再表示字符串的開(kāi)始,而是代表排除的意思,即匹配不在區(qū)間范圍內(nèi)的字符,如[^6]代表除6以外的字符。正則表達(dá)式介紹轉(zhuǎn)義字符在正則表達(dá)式中點(diǎn)“.”代表任意字符,而我們需要單純的使用點(diǎn)“.”這個(gè)字符的時(shí)候,就需要用到轉(zhuǎn)義字符了。正則表達(dá)式中的轉(zhuǎn)義字符就是在特殊字符之前加上反斜杠“\”,將其變?yōu)槠胀ㄗ址?。比如IP地址(,等)的正則表達(dá)式可表示如下:使用re模塊實(shí)現(xiàn)正則表達(dá)式Python中的re模塊用于實(shí)現(xiàn)正則表達(dá)式相關(guān)操作,本節(jié)主要介紹一些常用屬性和方法的使用。re模塊常用標(biāo)志位修飾符re模塊具有一些屬性用于做為標(biāo)志位的修飾符,用來(lái)控制正則表達(dá)式的匹配方式,如不區(qū)分大小寫(xiě)、多行匹配等,總結(jié)如表所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式re模塊常用方法compile()方法:pile()方法是用于優(yōu)化正則表達(dá)式的,可以將正則表達(dá)式轉(zhuǎn)化為對(duì)象,然后多次調(diào)用正則表達(dá)式就重復(fù)利用這個(gè)正則對(duì)象,可以實(shí)現(xiàn)更有效率的匹配。compile()方法生成的對(duì)象需要和match()、search()和findall()等方法搭配使用,單獨(dú)使用沒(méi)有意義。compile()方法的使用舉例如下:使用re模塊實(shí)現(xiàn)正則表達(dá)式match()方法。match()方法用于從字符串開(kāi)始位置進(jìn)行匹配,即匹配以XXX開(kāi)頭的字符串,其基本語(yǔ)法如下:參數(shù)說(shuō)明如表6-5所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式使用match()方法匹配成功會(huì)返回一個(gè)Match對(duì)象,匹配失敗返回None,如圖所示。上圖中的例子,我們使用了標(biāo)志位修飾符re.I忽略大小寫(xiě),如將re.I刪除,運(yùn)行結(jié)果將返回2個(gè)None,如下圖所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式search()方法。search()方法用于掃描整個(gè)字符串并返回第一個(gè)成功的匹配,即匹配第一次出現(xiàn)的XXX,語(yǔ)法格式與match()方法類(lèi)似。search()方法匹配成功也是返回一個(gè)Match對(duì)象,匹配失敗返回None,如下圖所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式從上兩圖的運(yùn)行結(jié)果可看出match()方法和search()方法的區(qū)別,match()方法只匹配以給定正則開(kāi)始的字符串,而search()方法搜索整個(gè)字符串,直到找到一個(gè)匹配。match()方法相當(dāng)于在search()方法的正則表達(dá)式最前面加了一個(gè)符號(hào)“^”。使用match()方法和search()方法匹配成功后返回的Match對(duì)象也具有其屬性和方法,常用的總結(jié)如右表所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式關(guān)于Match對(duì)象的使用舉例如左圖所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式
findall()方法。
findall()方法用于在字符串中搜索與給定正則匹配的所有子串,并以列表形式返回,如果有多個(gè)匹配模式,則返回元組列表,如果沒(méi)有找到匹配的,則返回空列表。findall()方法的語(yǔ)法格式與match()、search()方法類(lèi)似,不同的是match()、search()方法只匹配一次,findall()方法匹配所有符合條件的子串。
接下來(lái)使用一個(gè)輸入QQ郵箱獲取QQ號(hào)碼的案例來(lái)說(shuō)明findall()方法的使用,如下所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式上訴代碼的運(yùn)行結(jié)果如下圖所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式sub()方法。sub()方法用于實(shí)現(xiàn)字符串的替換,即按照正則規(guī)則去尋找被替換的內(nèi)容,其語(yǔ)法格式如下:參數(shù)說(shuō)明如表所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式sub()方法的使用舉例如下所示。上訴代碼的運(yùn)行結(jié)果如下圖所示。
split()方法。
split()方法用于實(shí)現(xiàn)字符串的分割,即將字符串按照正則分割成子串,并以列表的形式返回,其語(yǔ)法格式如下:使用re模塊實(shí)現(xiàn)正則表達(dá)式參數(shù)說(shuō)明如表所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式split()方法的使用舉例如下所示。上訴代碼的運(yùn)行結(jié)果如下圖所示。使用re模塊實(shí)現(xiàn)正則表達(dá)式以上介紹了6個(gè)re模塊中的常用方法,現(xiàn)將其總結(jié)如表所示。日期和時(shí)間模塊(1)time模塊中的時(shí)間格式在time模塊中時(shí)間表現(xiàn)的格式主要有時(shí)間戳、時(shí)間元組、格式化時(shí)間三種。時(shí)間戳,即timestamp,表示的是從1970年1月1日00:00:00開(kāi)始按秒計(jì)算的偏移量,適用于做日期運(yùn)算。時(shí)間元組,即struct_time,共有九個(gè)元素組,如表所示。time模塊格式化時(shí)間,即format_time,已格式化的結(jié)構(gòu)使時(shí)間更具可讀性,包括自定義格式和固定格式。關(guān)于格式化時(shí)間的相關(guān)符號(hào)總結(jié)如表所示。time模塊(2)time模塊常用方法time模塊的常用方法包括time()、sleep()、localtime()等,現(xiàn)將其總結(jié)如表所示。time模塊time模塊的常用方法使用舉例如右所示。datetime模塊datatime模塊在time模塊基礎(chǔ)上重新進(jìn)行了封裝,提供更多更多好用的類(lèi)供我們使用,常用的包括date、time、datetime、timedelta等。datatime模塊包含MAXYEAR和MINYEAR兩個(gè)常量,分別是能表示的最大年份(9999)和最小年份(1)。(1)date類(lèi)datatime模塊中的date類(lèi)用于表示日期,其主要由year(年)、month(月)及day(日)三部分構(gòu)成,date對(duì)象的格式如下所示:datetime模塊date類(lèi)常用的屬性和方法總結(jié)如表示。datetime模塊date類(lèi)的使用舉例如下所示。datetime模塊上訴代碼的運(yùn)行結(jié)果如下圖所示。(2)time類(lèi)datatime模塊中的time類(lèi)用于表示時(shí)間,其主要由hour(小時(shí))、minute(分鐘)、second(秒)、microsecond(毫秒)和tzinfo(時(shí)區(qū)信息)五部分組成,time對(duì)象的格式如下所示:datetime模塊time類(lèi)常用的屬性和方法于date類(lèi)相似,使用舉例如右所示。代碼的運(yùn)行結(jié)果如下圖所示。datetime模塊(3)datetime類(lèi)datatime模塊中的datetime類(lèi)用于表示日期和時(shí)間,可以看成是date類(lèi)和time類(lèi)的結(jié)合,datetime類(lèi)大部分的方法和屬性都繼承于date類(lèi)和time類(lèi)。datetime對(duì)象的格式如下所示:datetime模塊datetime類(lèi)的使用舉例如下所示。datetime類(lèi)中除了繼承date類(lèi)和time類(lèi)的方法,還有其特有的方法,總結(jié)如表所示。datetime模塊上訴代碼的運(yùn)行結(jié)果如下圖所示。datetime模塊(4)timedelta類(lèi)datatime模塊中的timedelta類(lèi)用于做時(shí)間運(yùn)算,一般與date類(lèi)、datetime類(lèi)結(jié)合使用。timedelta對(duì)象的格式如下所示:
timedelta類(lèi)的使用舉例如代碼所示。運(yùn)行結(jié)果如下圖所示。加密模塊與其它常用模塊Python中的hashlib模塊提供加密的相關(guān)操作,包含MD5和SHA加密,支持md5,sha1,sha224,sha256,sha384,sha512等算法。·MD5與SHAMD5全稱(chēng)Message-DigestAlgorithm5,是廣泛使用的密碼散列函數(shù),能產(chǎn)生128位(16字節(jié))散列值,保障信息傳輸?shù)耐暾耘c一致性。SHA全稱(chēng)SecureHashAlgorithm,是基于MD5產(chǎn)生的算法家族,包括sha1、sha224、sha256等多種算法。MD5和SHA都是不可逆的摘要算法,原理是通過(guò)函數(shù)將任意長(zhǎng)度數(shù)據(jù)轉(zhuǎn)換為固定長(zhǎng)度的數(shù)據(jù)串。hashlib模塊的使用hashlib模塊的使用可分為創(chuàng)建hash對(duì)象、更新hash對(duì)象和返回摘要三步,其常用屬性和方法總結(jié)如表所示。hashlib模塊的使用hashlib模塊的使用舉例如下圖所示。上訴代碼的運(yùn)行結(jié)果如下圖所示。其它常用模塊總結(jié)除了上述介紹的常用標(biāo)準(zhǔn)庫(kù)模塊之外,sys模塊、random模塊、math模塊也經(jīng)常使用,現(xiàn)將其常用方法、屬性總結(jié)如表所示。其它常用模塊總結(jié)其它常用模塊總結(jié)其中sys模塊中的modules.keys()方法用于返回所有已經(jīng)導(dǎo)入的模塊列表,運(yùn)行效果如下圖所示。03基于第三方庫(kù)的爬蟲(chóng)應(yīng)用很多編程語(yǔ)言都可以編寫(xiě)爬蟲(chóng)程序,但是使用Python語(yǔ)言編寫(xiě)爬蟲(chóng)無(wú)疑是最簡(jiǎn)單、最合適的,也有很多同學(xué)是因?yàn)榱私馀老x(chóng)才知道了Python。這一切都要?dú)w功于Python的豐富類(lèi)庫(kù),可以方便高效地下載網(wǎng)頁(yè)和解析網(wǎng)頁(yè)?!ぞW(wǎng)絡(luò)爬蟲(chóng)概述
網(wǎng)絡(luò)爬蟲(chóng),又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本,已被廣泛應(yīng)用于互聯(lián)網(wǎng)領(lǐng)域。網(wǎng)絡(luò)爬蟲(chóng)是一種數(shù)據(jù)采集工具,如我們想對(duì)某網(wǎng)站進(jìn)行分析,那么待分析的數(shù)據(jù)去哪里獲取呢?此時(shí)就可以考慮使用網(wǎng)絡(luò)爬蟲(chóng)進(jìn)行爬取。網(wǎng)頁(yè)基礎(chǔ)由于網(wǎng)絡(luò)爬蟲(chóng)主要是爬取網(wǎng)頁(yè)的數(shù)據(jù),那么在學(xué)習(xí)爬蟲(chóng)之前,首先我們需要先了解網(wǎng)頁(yè)的基礎(chǔ)知識(shí)。當(dāng)我們打開(kāi)瀏覽器,在地址欄中輸入U(xiǎn)RL(UniformResourceLocator,統(tǒng)一資源定位器),如輸入“”,即可出現(xiàn)百度的首頁(yè)。我們可以單擊鍵盤(pán)上的“F12”打開(kāi)開(kāi)發(fā)者工具查看,如下圖所示。網(wǎng)頁(yè)基礎(chǔ)(1)訪問(wèn)網(wǎng)頁(yè)的流程從圖6-29中我們可看到Request和Response的一些信息,其實(shí)從輸入U(xiǎn)RL到我們看到頁(yè)面,其流程可總結(jié)如下:①輸入U(xiǎn)RL。②瀏覽器給Web服務(wù)器發(fā)送一個(gè)Request。③Web服務(wù)器接到Request后進(jìn)行處理,生成相應(yīng)的Response,然后發(fā)送給瀏覽器。④瀏覽器解析Response中的HTML,這樣我們就看到了網(wǎng)頁(yè)。(2)HTTP協(xié)議上述提到的Request和Response是HTTP協(xié)議中的請(qǐng)求和響應(yīng)。HTTP,即HyperTextTransferProtocol,超文本傳輸協(xié)議,是一種基于請(qǐng)求與響應(yīng)模式的、無(wú)狀態(tài)的應(yīng)用層協(xié)議。HTTP是網(wǎng)頁(yè)中數(shù)據(jù)通信的基礎(chǔ),當(dāng)我們?cè)跒g覽器鍵入任何一個(gè)URL時(shí),都是在發(fā)送一次HTTP請(qǐng)求。網(wǎng)頁(yè)基礎(chǔ)HTTP請(qǐng)求由請(qǐng)求行、請(qǐng)求頭和請(qǐng)求正文組成。其中請(qǐng)求正文就是一些發(fā)送的數(shù)據(jù),請(qǐng)求頭允許客戶(hù)端向服務(wù)器端傳遞請(qǐng)求的附加信息以及客戶(hù)端自身的信息(如用戶(hù)標(biāo)識(shí),主機(jī)名等),請(qǐng)求行以一個(gè)方法符號(hào)開(kāi)頭,以空格分開(kāi),后面跟著請(qǐng)求的URI和協(xié)議的版本,格式如下所示:參數(shù)說(shuō)明如表所示。網(wǎng)頁(yè)基礎(chǔ)HTTP響應(yīng)與HTTP請(qǐng)求類(lèi)似,也是由三部分組成,分別是狀態(tài)行、響應(yīng)頭和響應(yīng)正文。狀態(tài)行的格式如下:參數(shù)說(shuō)明如表6-18所示。網(wǎng)頁(yè)基礎(chǔ)通過(guò)網(wǎng)頁(yè)開(kāi)發(fā)者工具查看上述訪問(wèn)百度頁(yè)面的請(qǐng)求頭和響應(yīng)頭信息分別如下圖所示。網(wǎng)絡(luò)爬蟲(chóng)的一般流程熟悉了網(wǎng)頁(yè)基礎(chǔ)知識(shí)之后,接下來(lái)我們看一下網(wǎng)絡(luò)爬蟲(chóng)的一般流程。①獲取待爬取的URL/URL隊(duì)列,發(fā)送Request。②通過(guò)Request獲取Response內(nèi)容(HTML、Json字符串、二進(jìn)制數(shù)據(jù)等)。③將得到的Response內(nèi)容進(jìn)行解析(使用正則表達(dá)式、網(wǎng)頁(yè)解析庫(kù)等)。④將解析后的數(shù)據(jù)進(jìn)行保存。上述流程簡(jiǎn)單理解就是第1步和第2步是網(wǎng)頁(yè)下載,第3步是網(wǎng)頁(yè)解析,第4步為數(shù)據(jù)存儲(chǔ)。爬蟲(chóng)相關(guān)庫(kù)介紹網(wǎng)絡(luò)爬蟲(chóng)主要由網(wǎng)頁(yè)下載、網(wǎng)頁(yè)解析和數(shù)據(jù)存儲(chǔ)三部分組成。網(wǎng)頁(yè)下載:Python中可使用標(biāo)準(zhǔn)庫(kù)的Urllib模塊或第三方庫(kù)Requests,Requests比Urllib更方便高效,本節(jié)重點(diǎn)介紹Requests。網(wǎng)頁(yè)解析:可使用正則表達(dá)式或第三方庫(kù)BeautifulSoup等,正則表達(dá)式已在6.2.1介紹,本節(jié)主要介紹BeautifulSoup庫(kù)。數(shù)據(jù)存儲(chǔ):可使用純文本、關(guān)系型數(shù)據(jù)庫(kù)(如MySQL、Oracle、SQLServer等)、非關(guān)系型數(shù)據(jù)庫(kù)(如MongoDB、Redis等),數(shù)據(jù)存儲(chǔ)部分在7.2介紹。網(wǎng)頁(yè)下載庫(kù)Requests介紹
Requests是基于Urllib開(kāi)發(fā)的,使用Apache2Licensed開(kāi)源協(xié)議的HTTP庫(kù),Request是一個(gè)第三方庫(kù),需要使用pip命令進(jìn)行安裝(pipinstallrequests)
(1)Requests庫(kù)的常用屬性/方法Requests庫(kù)的常用屬性/方法總結(jié)如表所示。網(wǎng)頁(yè)下載庫(kù)Requests介紹(2)Requests庫(kù)的基本使用Requests的使用很簡(jiǎn)單,還是以訪問(wèn)百度網(wǎng)頁(yè)為例,如右圖所示。網(wǎng)頁(yè)下載庫(kù)Requests介紹上訴代碼的運(yùn)行結(jié)果如圖所示。網(wǎng)頁(yè)下載庫(kù)Requests介紹(3)攜帶頭部信息發(fā)送請(qǐng)求在上訴代碼中,我們?cè)L問(wèn)的是百度首頁(yè),狀態(tài)碼是“200”,代表訪問(wèn)成功,而大多數(shù)時(shí)候,我們直接訪問(wèn)網(wǎng)頁(yè)時(shí),會(huì)出現(xiàn)403Forbidden,代表訪問(wèn)被拒絕,如右圖所示。出現(xiàn)右圖這種錯(cuò)誤的原因是,該網(wǎng)頁(yè)進(jìn)行了反爬蟲(chóng)設(shè)置,此時(shí)如果想要成功訪問(wèn)此網(wǎng)頁(yè),可以通過(guò)模擬瀏覽器的頭部信息“User-Agent”來(lái)實(shí)現(xiàn)?!癠ser-Agent”信息可以在開(kāi)發(fā)者工具中查看,如下圖所示。網(wǎng)頁(yè)下載庫(kù)Requests介紹網(wǎng)頁(yè)下載庫(kù)Requests介紹接下來(lái)我們攜帶頭部信息,再一次訪問(wèn)知乎首頁(yè),如下圖所示。網(wǎng)頁(yè)下載庫(kù)Requests介紹上訴代碼的運(yùn)行結(jié)果如下圖所示。BeautifulSoup介紹網(wǎng)頁(yè)解析庫(kù)BeautifulSoup介紹BeautifulSoup是一個(gè)解析HTML/XML文件的第三方庫(kù),主要用于從HTML/XML文件中提取數(shù)據(jù),其提供一些簡(jiǎn)單的函數(shù)來(lái)處理導(dǎo)航、搜索、修改分析樹(shù)等功能。使用BeautifulSoup時(shí)不需要考慮編碼方式,它會(huì)自動(dòng)將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為utf-8編碼。BeautifulSoup介紹(1)BeautifulSoup庫(kù)的導(dǎo)入BeautifulSoup3目前已經(jīng)停止開(kāi)發(fā),現(xiàn)在項(xiàng)目中使用的是BeautifulSoup4(可以使用命令“pipinstallbeautifulsoup4”進(jìn)行安裝),不過(guò)它已經(jīng)被移植到bs4中,也就是說(shuō)導(dǎo)入時(shí)直接使用“importBeautifulSoup”會(huì)報(bào)錯(cuò),需要使用語(yǔ)句“frombs4importBeautifulSoup”進(jìn)行導(dǎo)入,如下圖所示。BeautifulSoup介紹(2)BeautifulSoup解析器BeautifulSoup在解析時(shí)依賴(lài)解析器,它除了支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器外,還支持一些第三方解析器,總結(jié)如表所示。BeautifulSoup介紹(3)BeautifulSoup的基本使用由于BeautifulSoup庫(kù)是用于解析HTML文件的,所以為了演示BeautifulSoup的使用,我們首先新建一個(gè)簡(jiǎn)單的HTML文件test.html,如下圖所示。BeautifulSoup介紹BeautifulSoup4能將復(fù)雜HTML文檔轉(zhuǎn)換為復(fù)雜樹(shù)形結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)都是Python對(duì)象,這些對(duì)象可歸納為T(mén)ag、NavigableString、BeautifulSoup和Comment這四種。Tag:可簡(jiǎn)單理解為HTML標(biāo)簽,能通過(guò)BeautifulSoup對(duì)象加標(biāo)簽名獲取,但這種方式查找的是所有內(nèi)容中第一個(gè)符合要求的標(biāo)簽。NavigableString:是標(biāo)簽的內(nèi)容,通過(guò)“.string”可獲取。BeautifulSoup對(duì)象:代表文檔的全部?jī)?nèi)容,可看作特殊的Tag。Comment對(duì)象:代表注釋內(nèi)容,是特殊類(lèi)型的NavigableString,輸出內(nèi)容時(shí)不包含注釋符號(hào),解析含注釋內(nèi)容的文件時(shí)使用前最好先做判斷。BeautifulSoup介紹接下來(lái)對(duì)對(duì)上述test.html文件進(jìn)行解析,如右圖所示。代碼的運(yùn)行結(jié)果如下圖所示。BeautifulSoup介紹我們可以使用type()方法查看Tag、NavigableString、BeautifulSoup和Comment的具體類(lèi)型,如右圖所示。BeautifulSoup介紹(4)BeautifulSoup遍歷文檔樹(shù)常用屬性/方法在使用BeautifulSoup遍歷文檔樹(shù)時(shí),可以獲取父節(jié)點(diǎn)、子節(jié)點(diǎn)、兄弟節(jié)點(diǎn)等,相關(guān)屬性/方法總結(jié)如表所示。案例【案例描述】近年來(lái)電影產(chǎn)業(yè)迅速發(fā)展,電影已成為藝術(shù)與娛樂(lè)的載體,與電影相關(guān)的數(shù)據(jù)越來(lái)越多,豆瓣作為中國(guó)最大的電影分享與評(píng)論社區(qū),收錄了百萬(wàn)條影片和影人的資料,記錄千萬(wàn)影迷的觀影感受,可為觀影提供決策。【案例要求】本案例主要目的是獲取豆瓣Top250電影,共有10頁(yè),首先獲取每頁(yè)網(wǎng)頁(yè)鏈接要求爬取每部電影的中文名稱(chēng)、評(píng)分、評(píng)分人數(shù)和導(dǎo)演、主演等相關(guān)信息,如下圖所示。案例本章回顧1.【多選】模塊的導(dǎo)入方式有()。A.import語(yǔ)句B.from…import語(yǔ)句C.from…import*語(yǔ)句 D.import…in語(yǔ)句2.【多選】關(guān)于模塊的描述正確的有()。A.模塊就是一個(gè)包含了許多功能/方法的文件B.每一個(gè).py文件都可以被當(dāng)成是一個(gè)模塊C.模塊可以包含直接運(yùn)行的代碼塊、類(lèi)、函數(shù)或這幾種的組合D.可以使用“from…import*語(yǔ)句”導(dǎo)入一個(gè)模塊的所有內(nèi)容3.【多選】關(guān)于模塊、包和庫(kù)的描述,以下正確的有()。A.庫(kù)是為了方便管理與安裝,將能夠?qū)崿F(xiàn)某一功能的模塊和包封裝而成的集合B
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度文化產(chǎn)業(yè)產(chǎn)權(quán)轉(zhuǎn)讓與市場(chǎng)推廣合同
- 2025年度委托收款與新能源項(xiàng)目合作合同
- 2025年度乙方轉(zhuǎn)丙方特許經(jīng)營(yíng)合同模板
- 2025年度家居裝修工人安全責(zé)任免除協(xié)議書(shū)
- 2025年度電影演員檔期聘用合同
- 2025年度土地承包經(jīng)營(yíng)權(quán)流轉(zhuǎn)與農(nóng)村電商合作合同
- 2025年度危重病人治療免責(zé)協(xié)議書(shū)(特定醫(yī)療機(jī)構(gòu)版)
- 2025年度文化產(chǎn)業(yè)發(fā)展自愿退股及項(xiàng)目運(yùn)營(yíng)合同模板
- 2025年度養(yǎng)老機(jī)構(gòu)委托管理及運(yùn)營(yíng)合作協(xié)議范本
- 信訪接待室改造工程合同
- 優(yōu)秀員工榮譽(yù)證書(shū)模板
- 仁愛(ài)版八年級(jí)英語(yǔ)上復(fù)習(xí)課Unit 2 Keep Healthy Topic1 2教學(xué)課件
- 三維電生理導(dǎo)航系統(tǒng)技術(shù)參數(shù)
- 三年級(jí)下冊(cè)科學(xué)活動(dòng)手冊(cè)
- 《交通工程CAD》課程教學(xué)大綱(本科)
- 人教版數(shù)學(xué)五年級(jí)下冊(cè) 全冊(cè)各單元教材解析
- 換班申請(qǐng)表(標(biāo)準(zhǔn)模版)
- 者陰村戰(zhàn)友紀(jì)念者陰山對(duì)越自衛(wèi)還擊作戰(zhàn)30周年聯(lián)誼會(huì)計(jì)劃2
- 基于單片機(jī)的電子廣告牌設(shè)計(jì)畢業(yè)設(shè)計(jì)論文
- 承插型盤(pán)扣式支模架專(zhuān)項(xiàng)施工方案
- 我國(guó)古代職業(yè)教育的發(fā)展
評(píng)論
0/150
提交評(píng)論