版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目1
Python基礎(chǔ)實(shí)戰(zhàn)數(shù)據(jù)采集與處理掌握了解掌握熟悉掌握
Python的語(yǔ)法、數(shù)據(jù)結(jié)構(gòu)、運(yùn)算符、表達(dá)式、流程控制12掌握
列表、字典、函數(shù)、模塊和包、類與對(duì)象、文件操作、異常處理等熟悉
Python3及PyCharm集成開(kāi)發(fā)環(huán)境的安裝34了解
Python的特點(diǎn)、版本、應(yīng)用領(lǐng)域、語(yǔ)法規(guī)范等學(xué)習(xí)目標(biāo)目錄任務(wù)1 Python開(kāi)發(fā)環(huán)境搭建任務(wù)2 從HTML文檔提取特定字符串任務(wù)3 用列表、字典組織數(shù)據(jù)任務(wù)4 基于正則表達(dá)式提取圖片鏈接文本任務(wù)5 從JSON文件中加載數(shù)據(jù)Windows系統(tǒng)中安裝PythonLinux系統(tǒng)中安裝Python安裝PyCharm集成開(kāi)發(fā)環(huán)境任務(wù)1 Python開(kāi)發(fā)環(huán)境搭建Python語(yǔ)言因簡(jiǎn)潔的語(yǔ)法、出色的開(kāi)發(fā)效率以及強(qiáng)大的功能,迅速在多個(gè)領(lǐng)域占據(jù)一席之地,成為最符合人類期待的編程語(yǔ)言。Python簡(jiǎn)介Python的特點(diǎn)簡(jiǎn)單易學(xué)免費(fèi)開(kāi)源可移植性面向?qū)ο筘S富的庫(kù)Python語(yǔ)言之所以能夠迅速發(fā)展,受到程序員的青睞,與它具有的特點(diǎn)密不可分。目前市場(chǎng)上Python
2和Python
3兩個(gè)版本并行,2021開(kāi)始官方不在維護(hù)Python2Python的版本Python作為一門功能強(qiáng)大且簡(jiǎn)單易學(xué)的編程語(yǔ)言得到了廣泛應(yīng)用,它主要應(yīng)用在以下領(lǐng)域Web開(kāi)發(fā)科學(xué)計(jì)算與數(shù)據(jù)分析自動(dòng)化運(yùn)維網(wǎng)絡(luò)爬蟲(chóng)游戲開(kāi)發(fā)人工智能Python的應(yīng)用領(lǐng)域(1)訪問(wèn)Python官網(wǎng),選擇Downloads→Windows:1.1
Windows系統(tǒng)中安裝Python(2)運(yùn)行下載的對(duì)應(yīng)版本的Python安裝程序(如:python-3.10.7-amd64.exe),按步驟執(zhí)行安裝:1.1
Windows系統(tǒng)中安裝Python(3)安裝完成后,打開(kāi)Windows系統(tǒng)的命令提示符窗口測(cè)試是否安裝成功:1.1
Windows系統(tǒng)中安裝Python(1)通過(guò)wget命令下載minicoda安裝腳本:1.2
Linux系統(tǒng)中安裝Python(2)運(yùn)行安裝腳本,根據(jù)提示進(jìn)行對(duì)應(yīng)操作:sh
Miniconda3-latest-Linux-x86_64.sh(3)通過(guò)source命令執(zhí)行activate腳本,進(jìn)入虛擬環(huán)境:source/usr/local/miniconda3/bin/activate(4)窗口輸入python,進(jìn)入python運(yùn)行環(huán)境后,輸入命令:python-V1.2
Linux系統(tǒng)中安裝Python(1)訪問(wèn)jetbrains官網(wǎng),下載PyCharm安裝包:1.3
安裝PyCharm集成開(kāi)發(fā)環(huán)境(2)運(yùn)行下載好的PyCharm安裝程序,按步驟執(zhí)行安裝:1.3安裝PyCharm集成開(kāi)發(fā)環(huán)境(3)安裝完成后的啟動(dòng)界面:1.3安裝PyCharm集成開(kāi)發(fā)環(huán)境任務(wù)2
從HTML文檔提取特定字符串?dāng)?shù)值類型與變量字符串運(yùn)算符流程控制2.1
數(shù)值類型與變量(1)
數(shù)值類型包括整型(int)、浮點(diǎn)型(float)、復(fù)數(shù)類型(complex)
、布爾類型(bool)整型浮點(diǎn)型復(fù)數(shù)類型布爾型123 123.45 123+4j True注1:
布爾類型只有兩個(gè)取值:True和False注2:Python中的任何對(duì)象都可以轉(zhuǎn)換為布爾類型,若要進(jìn)行轉(zhuǎn)換,符合以下條件的數(shù)據(jù)都會(huì)被轉(zhuǎn)換為False:None、任何為0的數(shù)值類型、任何空對(duì)象
(如:空序列“”
、()、[]
,空字典{}等)2.1
數(shù)值類型與變量(2)
變量l
Python程序運(yùn)行的過(guò)程中隨時(shí)可能產(chǎn)生一些臨時(shí)數(shù)據(jù),程序會(huì)將這些數(shù)據(jù)保存在內(nèi)存單元中,并使用不同的標(biāo)識(shí)符來(lái)標(biāo)識(shí)各個(gè)內(nèi)存單元。這些具有不同標(biāo)識(shí)、存儲(chǔ)臨時(shí)數(shù)據(jù)的內(nèi)存單元稱為變量,標(biāo)識(shí)內(nèi)存單元的符號(hào)為變量名(或稱為標(biāo)識(shí)符),內(nèi)存單元中存儲(chǔ)的數(shù)據(jù)就是變量的值。l
變量名由字母、數(shù)字和下劃線組成,且不能以數(shù)字開(kāi)頭;區(qū)分大小寫l
變量要先聲明后使用2.1
數(shù)值類型與變量說(shuō)明:圖中的print()為Python的輸出函數(shù),作用是輸出一段文本;type()為Python中的函數(shù),作用是返回給定對(duì)象的類型Python采用空格和縮進(jìn)來(lái)區(qū)分語(yǔ)句的層次關(guān)系,同一層次的代碼行左側(cè)需嚴(yán)格對(duì)齊,否則代碼將不能通過(guò)編譯上圖中第13行和15行中以符號(hào)“#”開(kāi)始的那段文本是Python中的注釋,通常是對(duì)某些代碼塊的解釋說(shuō)明文本,Python在運(yùn)行時(shí)會(huì)自動(dòng)忽略這部分內(nèi)容l
示例2.2
字符串(1)字符串是一種用來(lái)表示文本的數(shù)據(jù)類型,它是由符號(hào)或者數(shù)值組成的一個(gè)連續(xù)序列。l
Python3的字符串是由Unicode字符組成的不可變序列l(wèi)
Python支持使用一對(duì)單引號(hào)、一對(duì)雙引號(hào)或三對(duì)引號(hào)來(lái)定義字符串2.2
字符串(2)Python通過(guò)索引或切片的方式來(lái)訪問(wèn)字符串中的部分內(nèi)容正向索引反向索引#
用于截取字符串中的某個(gè)字符#
用于從字符串中截取子字符串注:采用切片的方式來(lái)截取字符串的子串時(shí),切片選取的區(qū)間為左閉右開(kāi)型,截取的子串包含起始下標(biāo)處對(duì)應(yīng)的字符,但不包含結(jié)束下標(biāo)處對(duì)應(yīng)的字符,如果省略了起始下標(biāo),表示從字符串的開(kāi)始位置處截取,如果省略了結(jié)束下標(biāo),表示截取到字符串的最后一個(gè)字符;步長(zhǎng)值用于指定截取時(shí)的間隔區(qū)間,可以為正整數(shù)或負(fù)整數(shù),如果省略了步長(zhǎng)值,則默認(rèn)步長(zhǎng)值為1。索引方式:l 字符串變量[索引下標(biāo)]l 字符串變量[起始下標(biāo):結(jié)束下標(biāo):步長(zhǎng)值]2.2
字符串(3)字符串的常用操作:l 字符串拼接:使用“+”運(yùn)算符實(shí)現(xiàn)l 字符串替換:str.replace(old,new,count=None)
l 字符串分割:str.split(sep=None,maxsplit=-1)
l 字符串兩側(cè)空格去除:str.strip(chars=None)、lstrip()、
rstrip()
l 字符串格式化輸出:占位符方式、format()方法、f-strings方式2.3
運(yùn)算符l 算術(shù)運(yùn)算符:+、-、*、/、//
(整除)
、%
(取余)
、**
(冪)l 比較運(yùn)算符:
==、!=、>、<、>=、<=l 賦值運(yùn)算符:=,“=”還可與算術(shù)運(yùn)算符組合成復(fù)合賦值運(yùn)算符l 邏輯運(yùn)算符:or(或)、
and(與)、not
(非)l 位運(yùn)算符:<<
(按位左移)、>>
(按位右移)、&
(按位與)、I
(按位或)、^(按位異或)、~(按位取反)2.3
運(yùn)算符l 運(yùn)算符的優(yōu)先級(jí):Python支持使用多個(gè)不同的運(yùn)算符連接簡(jiǎn)單表達(dá)式,實(shí)現(xiàn)相對(duì)復(fù)雜的功能。此時(shí)需注意運(yùn)算符之間的優(yōu)先級(jí),或者使用圓括號(hào)“()”來(lái)改變表達(dá)式的執(zhí)行順序從上往下,優(yōu)先級(jí)增高2.3
運(yùn)算符2.3
運(yùn)算符(1)if語(yǔ)句:
用于實(shí)現(xiàn)分支結(jié)構(gòu)2.4
流程控制if單分支雙分支if-else多分支if-elif-else(2)match語(yǔ)句:
Python3.10中引入,類似于C語(yǔ)言中的switch語(yǔ)句,
但功能更強(qiáng)大2.4
流程控制(3)
for語(yǔ)句:
Python循環(huán)語(yǔ)句的一種2.4
流程控制2.4
流程控制(4)while語(yǔ)句:
可配合使用break,continue語(yǔ)句實(shí)現(xiàn)對(duì)循環(huán)的靈活控制任務(wù)3
用列表、字典等組織數(shù)據(jù)列表(list)元組(tuple)字典(dict)集合(set)函數(shù)3.1
列表(list)列表是Python中有序序列之一,它可以存儲(chǔ)任意類型的元素。(1)列表的創(chuàng)建:l
使用中括號(hào)“[]”創(chuàng)建: list_1=[1,2,
3]l
通過(guò)函數(shù)list()創(chuàng)建: list_2
=
list(‘?dāng)?shù)據(jù)采集與處理’)3.1
列表(list)l
使用索引方式訪問(wèn): list_2[1]l
使用切片方式訪問(wèn): list_2[1:6:2]#
取出第二個(gè)元素:據(jù)#
得到三個(gè)元素的子列表:
['據(jù)',
'集',
'處'](2)列表元素的訪問(wèn):list_2
=
list(‘?dāng)?shù)據(jù)采集與處理’)3.1
列表(list)(3)列表的遍歷:list_2
=
list(‘?dāng)?shù)據(jù)采集與處理’)l
使用for循環(huán)遍歷:l
列表推導(dǎo)式:l
Range函數(shù):3.1
列表(list)3.2
元組(tuple)(1)元組的創(chuàng)建:l
使用小括號(hào)“()”創(chuàng)建:tup_1=(), tup_2=(1,),tup_3=
(1,2,3)l
通過(guò)函數(shù)tuple()創(chuàng)建: tup_4
=
tuple(), tup_5=tuple(“Python”)注1:當(dāng)使用小括號(hào)“()”創(chuàng)建元組時(shí),如果元組中只包含一個(gè)元素,那么要在該元素的后面添加逗號(hào),以保證Python解釋器能夠識(shí)別其為元組注2:元組中的元素是不允許修改的3.2
元組(tuple)(2)元組元素的訪問(wèn)及遍歷與列表類似:3.2
元組(tuple)3.3
字典(dict)字典是Python中的映射類型(每個(gè)元素都是一個(gè)鍵值對(duì),key-value)(1)字典的創(chuàng)建:l
使用大括號(hào)“{}”創(chuàng)建: dict_1
=
{id:1001,name:“張三”}l
通過(guò)函數(shù)dict()創(chuàng)建: dict_2
=
dict(id=1002,name=“李四”)注1:一個(gè)字典中的鍵(key)須唯一,不能重復(fù),可以使用字符或數(shù)值等類型注2:一個(gè)字典中的值(value)可以重復(fù),可以是任意類型注3:字典與序列類型不同,字典中的元素是無(wú)序的,因此不能象列表或元組那樣通過(guò)索引來(lái)讀取元素或進(jìn)行切片操作,字典只能通過(guò)鍵來(lái)獲取對(duì)應(yīng)的值3.3
字典(dict)(1)Python中的集合分為可變集合與不可變集合:3.4
集合(set)由set()函數(shù)創(chuàng)建,集合中的元素可以動(dòng)態(tài)地增加或刪除??勺兗嫌蒮rozenset()函數(shù)創(chuàng)建,集合中的元素不可改變。不可變集合注1:集合與字典類似,也是無(wú)序的數(shù)據(jù)類型,因此也不能象列表或元組那樣通過(guò)索引來(lái)讀取元素或進(jìn)行切片操作注2:集合與數(shù)學(xué)上的集合概念類似,集合所包含的元素是唯一的、不可重復(fù)3.4
集合(set)3.5
函數(shù)(1)函數(shù)指封裝起來(lái)的、完成某個(gè)具體任務(wù)并能夠被復(fù)用的一段代碼。Python安裝包、標(biāo)準(zhǔn)庫(kù)中自帶的函數(shù)統(tǒng)稱為內(nèi)置函數(shù),用戶自己編寫的函數(shù)稱為自定義函數(shù)(2)Python中使用關(guān)鍵字
def定義函數(shù):(3)函數(shù)的調(diào)用:函數(shù)名([參數(shù)列表])3.5
函數(shù)(3)函數(shù)的參數(shù):l 位置參數(shù):傳參時(shí)按定義時(shí)的順序?qū)?yīng)傳遞l 關(guān)鍵字參數(shù):以“參數(shù)名=值”的方式傳遞l 默認(rèn)值參數(shù):函數(shù)定義時(shí)指定了默認(rèn)值,如果調(diào)用時(shí)不給它傳值,則用定義時(shí)指定的默認(rèn)值l 不定長(zhǎng)參數(shù):定義時(shí)參數(shù)名前加上“*”或“**”,表示可接收任意數(shù)量的位置參數(shù)或關(guān)鍵字參數(shù)3.5
函數(shù)(4)變量的作用域:l 局部變量:在函數(shù)內(nèi)部定義的變量,僅在函數(shù)內(nèi)部可見(jiàn)l
全局變量:在函數(shù)外部定義的變量,在整個(gè)腳本內(nèi)可見(jiàn)。函數(shù)內(nèi)可以引用全局變量,但是如果要在函數(shù)內(nèi)修改全局變量的值,需先在函數(shù)內(nèi)使用關(guān)鍵字“global”進(jìn)行聲明。3.5
函數(shù)(5)匿名函數(shù):l 匿名函數(shù)是無(wú)需函數(shù)名標(biāo)識(shí)的函數(shù),它的函數(shù)體只能是單個(gè)表達(dá)式。Python中使用關(guān)鍵字lambda定義匿名函數(shù):lambda[arg1
[,arg2,argn]]:expressionl 為方便使用匿名函數(shù),應(yīng)使用變量記錄這個(gè)函數(shù):3.5
函數(shù)模塊和包異常處理正則表達(dá)式任務(wù)4
基于正則表達(dá)式提取圖片鏈接文本4.1
模塊和包(1)每個(gè).py的python文件都被視為一個(gè)模塊,python文件的名稱就是模塊名(2)一個(gè)文件夾包含一個(gè)名為:“
init
.py”的文件(可以是一個(gè)沒(méi)有任何內(nèi)容的空文件),則這個(gè)文件夾便是Python中的包,包名就是文件夾的名稱,包中可以包含多個(gè)模塊或子包(3)Python中的模塊可分為三類,分別是內(nèi)置模塊、第三方模塊和自定義模塊:4.1
模塊和包內(nèi)置模塊Python的官方模塊,可直接導(dǎo)入程序供開(kāi)發(fā)人員使用。由非官方制作發(fā)布的、供給大眾使用的Python模塊,在使用之前需要開(kāi)發(fā)人員先自行安裝第三方模塊開(kāi)發(fā)人員在程序編寫的過(guò)程中自行編寫的、存放功能性代碼的.py文件。自定義模塊4.1
模塊和包(4)模塊的使用:l 使用import導(dǎo)入:l 使用from…import…導(dǎo)入:注1:在from
…
import
…
方式下,可以用通配符‘*’
,表示導(dǎo)入所有成員注2:在from
…
import
…
方式下,可能會(huì)出現(xiàn)模塊的成員名稱重名的問(wèn)題注3:使用第三方模塊之前,需要使用包管理工具下載和安裝第三方模塊:如:pipinstallpandas4.1
模塊和包(5)
name
屬性:l Python為模塊提供了
name
屬性l
name
屬性通常與if條件語(yǔ)句一起使用l 若當(dāng)前模塊是啟動(dòng)模塊,則其
name
的值為“
main
”l 若該模塊被其它程序?qū)?,則
name
的值為文件名4.1
模塊和包(6)包的使用:l
使用import導(dǎo)入:使用import導(dǎo)入包中的模塊時(shí),需要在模塊名的前面加上包名,格式為
“包名.模塊名”;若要使用已導(dǎo)入模塊中的函數(shù)時(shí),需要通過(guò)“包名.模塊名.函數(shù)名”實(shí)現(xiàn)l 使用from…import…導(dǎo)入:此方式下導(dǎo)入包中模塊包含的內(nèi)容,若需要使用導(dǎo)入模塊中的函數(shù),需要通過(guò)“模塊名.函數(shù)名”實(shí)現(xiàn)注:包中的
init
.py文件有兩個(gè)作用:標(biāo)識(shí)當(dāng)前文件夾是一個(gè)Python的包;模糊導(dǎo)入:如果
init
文件中沒(méi)有聲明
all
屬性,那么使用
from包名 import
*
導(dǎo)入的內(nèi)容為空4.2
異常處理(1)相關(guān)概念:l 語(yǔ)法錯(cuò)誤:不符合Python語(yǔ)法格式的代碼所引起的錯(cuò)誤l 邏輯錯(cuò)誤:語(yǔ)法格式正確的Python代碼在運(yùn)行時(shí)產(chǎn)生的錯(cuò)誤l 異常:程序運(yùn)行期間檢測(cè)到的錯(cuò)誤稱為異常若異常不被處理,默認(rèn)會(huì)導(dǎo)致程序崩潰而終止運(yùn)行(2)Python的異常類:4.2
異常處理注:Python允許程序開(kāi)發(fā)人員自定義異常,只需創(chuàng)建一個(gè)類,讓它繼承自Exception類或其它異常類即可(3)Python的異常處理結(jié)構(gòu):4.2
異常處理注:也可以在程序中通過(guò)raise語(yǔ)句主動(dòng)拋出異常,語(yǔ)法如下:raise
異常類名或raise
異常對(duì)象4.2
異常處理(4)異常處理的執(zhí)行過(guò)程:l 執(zhí)行try下面的代碼塊;l 如果沒(méi)有異常出現(xiàn),則忽略所有的except塊,如果定義了else塊,則跳轉(zhuǎn)到else塊執(zhí)行,如果沒(méi)有else塊,但是定義了finally塊,則跳轉(zhuǎn)到finally塊執(zhí)行;l 如果出現(xiàn)異常,則忽略try塊中沒(méi)有執(zhí)行的剩余代碼,跳轉(zhuǎn)到能捕獲對(duì)應(yīng)異常類的except塊執(zhí)行,忽略其他的except塊;l else塊或except塊執(zhí)行完后,如果定義了finally塊,則跳轉(zhuǎn)到finally塊執(zhí)行。4.2
異常處理(5)with語(yǔ)句:l with語(yǔ)句適用于對(duì)資源進(jìn)行訪問(wèn)的場(chǎng)合,無(wú)論資源在使用過(guò)程中是否發(fā)生異常,都可以使用with語(yǔ)句保證執(zhí)行釋放資源操作。with
上下文表達(dá)式
[as
資源對(duì)象]:語(yǔ)句體注:上下文表達(dá)式會(huì)返回一個(gè)上下文管理器對(duì)象,若指定了as子句,則將上下文管理器對(duì)象的
enter
()方法的返回值賦值給資源對(duì)象。4.2
異常處理4.3
正則表達(dá)式(1)基本概念:l 用于描述字符串匹配規(guī)則的文本字符串稱為正則表達(dá)式l 一個(gè)正則表達(dá)式也稱為一個(gè)模式(pattern)l 在正則表達(dá)式中具有特殊含義的專用字符稱為元字符l Python中的正則表達(dá)式模塊是re模塊(2)常用元字符:4.3
正則表達(dá)式(3)re模塊的常用函數(shù):4.3
正則表達(dá)式4.3
正則表達(dá)式類和對(duì)象文件與目錄操作JSON任務(wù)5從JSON文件中加載數(shù)據(jù)5.1
類和對(duì)象(1)基本概念:l 類(Class):類是具有相同屬性和行為的一類對(duì)象的集合,它提供了一個(gè)抽象的共性描述l 對(duì)象(Object):對(duì)象是類的一個(gè)具體實(shí)例,是數(shù)據(jù)(描述事物的屬性)和動(dòng)作(體現(xiàn)事物的行為)的結(jié)合體l 抽象(Abstract):抽象是從許多事物中抽取它們的共同特征,形成概念的過(guò)程l 封裝(Encapsulation):封裝就是將對(duì)象的屬性和行為封裝起來(lái),不需要讓外界知道具體實(shí)現(xiàn)細(xì)節(jié),類把自己的屬性和行為只讓可信的其它類或者對(duì)象操作,對(duì)不可信的類或?qū)ο箅[藏信息l 繼承(Inheritance):繼承描述的是類與類之間的關(guān)系,通過(guò)繼承,一個(gè)新類可以使用現(xiàn)有類的相關(guān)功能,并且在無(wú)須重新編寫原來(lái)的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”、“超類”l 多態(tài)(Polymorphism):多態(tài)指一個(gè)類實(shí)例的相同方法在不同情形下有不同的表現(xiàn)形式,即同一個(gè)屬性或行為在父類和子類中具有不同的語(yǔ)義5.1
類和對(duì)象(2)類的定義:Python使用關(guān)鍵字class定義類注1:如果在類成員名之前添加雙下劃線(
),則該成員為類的私有成員,它限定只能類的內(nèi)部訪問(wèn)注2:類的實(shí)例方法的定義與函數(shù)類似,只是方法中的第一參數(shù)須為:self,只能由對(duì)象調(diào)用5.1
類和對(duì)象(3)對(duì)象的創(chuàng)建及使用:l 創(chuàng)建對(duì)象對(duì)象名
=
類名()l 成員引用對(duì)象名.屬性對(duì)象名.方法()5.1
類和對(duì)象(3)類的構(gòu)造方法與析構(gòu)方法:l 構(gòu)造方法:
init
()如果定義類時(shí)顯式地定義
init
()方法,那么創(chuàng)建對(duì)象時(shí)Python解釋器會(huì)調(diào)用顯式定義的
init
()方法;如果定義類時(shí)沒(méi)有顯式定義
init
()方法,那么Python解釋器會(huì)調(diào)用默認(rèn)的
init
()方法在構(gòu)造方法中定義的屬性是實(shí)例屬性,只能通過(guò)對(duì)象進(jìn)行訪問(wèn)在類中定義的屬性是類屬性,可以通過(guò)對(duì)象或類進(jìn)行訪問(wèn)l 析構(gòu)方法:
del
()當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器數(shù)值為0時(shí),就會(huì)調(diào)用析構(gòu)方法
del
()5.1
類和對(duì)象(4)類的繼承及方法重寫:l 類的繼承:?jiǎn)卫^承:class
子類(父類)多繼承:class
子類(父類1,父類2,...)l 方法重寫:子類可以繼承父類的屬性和方法,若父類的方法不能滿足子類的要求,子類可以重寫父類的方法,以實(shí)現(xiàn)子類的特定功能。重寫就是在子類重新定義一個(gè)與父類的方法名及參數(shù)完全相同,但是方法體的具體實(shí)現(xiàn)不同的方法。如果子類重寫了父類的方法,但仍希望調(diào)用父類中的方法,那么可以使用super()函數(shù)實(shí)現(xiàn):super().方法名()5.2
文件與目錄操作(1)文件操作:l 打開(kāi)文件:open(file,mode='r',encoding=None)file:待打開(kāi)文件的文件名mode:文件的打開(kāi)模式,如右圖所示:encoding:文件的編碼方式函數(shù)調(diào)用成功會(huì)返回一個(gè)文件對(duì)象l 關(guān)閉文件:文件對(duì)象.close()close()方法用于關(guān)閉文件,該方法沒(méi)有參數(shù),直接調(diào)用即可也可以使用with語(yǔ)句打開(kāi)文件,自動(dòng)實(shí)現(xiàn)文件的關(guān)閉操作l 讀文件:read()、readline()、readlines()l 寫文件:write()、writelines()5.2
文件與目錄操作5.2
文件與目錄操作(2)目錄操作:
Python提供了多個(gè)內(nèi)置模塊實(shí)現(xiàn)對(duì)目錄的操作l os.path模塊中的目錄操作常用函數(shù):5.2
文件與目錄操作(2)目錄操作:
Python提供了多個(gè)內(nèi)置模塊實(shí)現(xiàn)對(duì)目錄的操作l os模塊中的目錄操作常用函數(shù):5.2
文件與目錄操作(2)目錄操作:
Python提供了多個(gè)內(nèi)置模塊實(shí)現(xiàn)對(duì)目錄的操作l shutil模塊中的目錄操作常用函數(shù):5.2
文件與目錄操作5.3
JSON(1)JSON(JavaScriptObjectNotation)是一種簡(jiǎn)單、清晰的數(shù)據(jù)交換格式,它采用完全獨(dú)立于編程語(yǔ)言的文本格式來(lái)存儲(chǔ)和表示數(shù)據(jù),其語(yǔ)法規(guī)則如下:l
使用鍵值對(duì)(
key
:
value
)表示對(duì)象屬性和值;l
使用逗號(hào)(,)分隔多條數(shù)據(jù);l
使用大括號(hào){
}包含對(duì)象;l
使用方括號(hào)[
]表示數(shù)組(2)JSON對(duì)象為
{key:
value,
key:
value,…}的鍵值對(duì)結(jié)構(gòu)。key為對(duì)象的屬性,value為對(duì)應(yīng)的屬性值,通過(guò)“對(duì)象.key”的方式來(lái)獲取對(duì)應(yīng)的屬性值。一個(gè)表示學(xué)生信息的JSON對(duì)象示例如下:5.3
JSON5.3
JSON(3)Python提供了內(nèi)置模塊:json模塊用于JSON數(shù)據(jù)的處理l
dump(obj,fp):把Python對(duì)象obj轉(zhuǎn)換為JSON字符串并寫入fp文件中l(wèi)
dumps(obj):把Python對(duì)象obj轉(zhuǎn)換為JSON字符串l
load(fp):文件中讀取JSON數(shù)據(jù)然后轉(zhuǎn)換為Python對(duì)象l
loads(s):把JSON字符串s轉(zhuǎn)換為Python對(duì)象(通常為字典)注1:在dump()、dumps()函數(shù)中,可以通過(guò)參數(shù)indent來(lái)設(shè)置轉(zhuǎn)換時(shí)的格式化空格數(shù)量注2:在load()、loads()函數(shù)中,可以通過(guò)參數(shù)cls來(lái)設(shè)置使用的轉(zhuǎn)換類(JSONCoder類的子類),如果不設(shè)置,則默認(rèn)使用JSONCoder類小結(jié)l 在本項(xiàng)目中主要介紹了一些Python的基礎(chǔ)知識(shí),包括Python的特點(diǎn)、版本、應(yīng)用領(lǐng)域、Python開(kāi)發(fā)環(huán)境的搭建、Python的數(shù)據(jù)結(jié)構(gòu)、運(yùn)算符、流程控制、字符串、列表、元組、字典、集合、函數(shù)、類和對(duì)象、異常處理、文件及目錄操作、模塊和包、正則表達(dá)式、JSON數(shù)據(jù)處理等。l 通過(guò)本項(xiàng)目的學(xué)習(xí),希望能夠獨(dú)立搭建Python開(kāi)發(fā)環(huán)境,能掌握Python的數(shù)據(jù)結(jié)構(gòu)、流程控制、函數(shù)及類的定義及使用、模塊、文件操作、異常處理、正則表達(dá)式、JSON數(shù)據(jù)處理等相關(guān)知識(shí),對(duì)Python程序開(kāi)發(fā)有一個(gè)初步認(rèn)識(shí),為后續(xù)的爬蟲(chóng)學(xué)習(xí)做好鋪墊。項(xiàng)目2
網(wǎng)頁(yè)數(shù)據(jù)采集實(shí)戰(zhàn)數(shù)據(jù)采集與處理2023年11月10日星期五掌握了解掌握熟悉學(xué)習(xí)目標(biāo)掌握
urllib庫(kù)、requests庫(kù)的使用12掌握
基本的反爬策略、網(wǎng)頁(yè)數(shù)據(jù)的請(qǐng)求方法等熟悉
通用爬蟲(chóng)工具的使用、爬蟲(chóng)的基本流程34了解
爬蟲(chóng)產(chǎn)生的背景、爬蟲(chóng)的基本概念目錄任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)任務(wù)2 基于urllib庫(kù)爬取一個(gè)電商網(wǎng)頁(yè)任務(wù)3 urllib處理發(fā)送GET/POST請(qǐng)求任務(wù)4 請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用任務(wù)5 網(wǎng)絡(luò)異常處理任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(1)爬蟲(chóng)的定義:l
網(wǎng)絡(luò)爬蟲(chóng),又稱為網(wǎng)頁(yè)蜘蛛、網(wǎng)絡(luò)機(jī)器人,是一種按照一定的規(guī)則(爬蟲(chóng)算法),自動(dòng)請(qǐng)求互聯(lián)網(wǎng)上的相關(guān)網(wǎng)頁(yè)并提取頁(yè)面中相關(guān)數(shù)據(jù)的程序或腳本海量銷售數(shù)據(jù)大數(shù)據(jù)分析啤酒和尿布的關(guān)聯(lián)度極高調(diào)整銷售策略銷量增加(2)爬蟲(chóng)產(chǎn)生的背景:l 啤酒和尿布的故事l從互聯(lián)網(wǎng)自有數(shù)據(jù)不夠用時(shí),如何獲取更多的數(shù)據(jù)?任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(3)爬蟲(chóng)的分類l
按使用場(chǎng)景分:通用爬蟲(chóng)、聚焦爬蟲(chóng)l
按爬取數(shù)據(jù)的形式分:累積式網(wǎng)絡(luò)爬蟲(chóng)、增量式網(wǎng)絡(luò)爬蟲(chóng)l
按爬取數(shù)據(jù)的存在方式分:表層網(wǎng)絡(luò)爬蟲(chóng)、深層網(wǎng)絡(luò)爬蟲(chóng)通用爬蟲(chóng)工作原理聚焦爬蟲(chóng)工作原理任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(3)與爬蟲(chóng)相關(guān)的網(wǎng)站文件:l
robots.txt:l robots.txt是網(wǎng)站基于Robots
協(xié)議(網(wǎng)絡(luò)爬蟲(chóng)排除標(biāo)準(zhǔn),又稱爬蟲(chóng)協(xié)議、機(jī)器人協(xié)議等)制定的爬蟲(chóng)規(guī)則文本l robots.txt
文件必須放置在站點(diǎn)的根目錄下,而且文件名必須全部小寫l Robots
協(xié)議是一種建議,網(wǎng)絡(luò)爬蟲(chóng)可以選擇不遵守它,
但可能會(huì)存在法律風(fēng)險(xiǎn)l
Sitemap.xml:l 文件列出了網(wǎng)站中的網(wǎng)址及每個(gè)網(wǎng)址的其他元數(shù)據(jù),以便于爬蟲(chóng)可以更加智能地爬取網(wǎng)站l 要謹(jǐn)慎對(duì)待,注意文件的內(nèi)容缺失或過(guò)期的問(wèn)題任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(4)常用反爬蟲(chóng)策略:l
設(shè)置
User-Agent:l User-agent表示用戶代理,通過(guò)User-agent偽裝,可降低被反爬機(jī)制檢測(cè)到的概率l
使用代理
IP:l 使用多個(gè)代理IP,可以降低單個(gè)IP地址的訪問(wèn)量l
降低訪問(wèn)頻率:l 降低訪問(wèn)網(wǎng)站的頻率,防止對(duì)方從訪問(wèn)量上認(rèn)出爬蟲(chóng)的身份l
驗(yàn)證碼識(shí)別:l 對(duì)于某些網(wǎng)站訪問(wèn)過(guò)程中需動(dòng)態(tài)輸入驗(yàn)證碼才能繼續(xù)訪問(wèn)的情況,爬蟲(chóng)需采用技術(shù)識(shí)別出正確驗(yàn)證碼,并能自動(dòng)填寫,完成驗(yàn)證任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(5)爬蟲(chóng)的合法性:l
爬蟲(chóng)所采集的數(shù)據(jù)是指互聯(lián)網(wǎng)上公開(kāi)的并且可以訪問(wèn)到的網(wǎng)頁(yè)信息,而不是網(wǎng)站的后臺(tái)信息(沒(méi)有權(quán)限訪問(wèn)),更不是用戶注冊(cè)的信息(非公開(kāi)的)。l
惡意利用爬蟲(chóng)技術(shù)抓取數(shù)據(jù),以獲取不正當(dāng)競(jìng)爭(zhēng)的優(yōu)勢(shì),或牟取不法利益的,則可能觸犯法律任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(6)基于八爪魚(yú)工具爬取數(shù)據(jù)示例l
下載工具,并安裝:任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(6)基于八爪魚(yú)工具爬取數(shù)據(jù)示例l
打開(kāi)工具,創(chuàng)建爬蟲(chóng)任務(wù):任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(6)基于八爪魚(yú)工具爬取數(shù)據(jù)示例l
任務(wù)設(shè)置任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(6)基于八爪魚(yú)工具爬取數(shù)據(jù)示例l
設(shè)置數(shù)據(jù)采集規(guī)則:任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(6)基于八爪魚(yú)工具爬取數(shù)據(jù)示例l
采集規(guī)則設(shè)置完成后,保存并開(kāi)始采集:任務(wù)1 利用工具爬取電商網(wǎng)頁(yè)(6)基于八爪魚(yú)工具爬取數(shù)據(jù)示例l
數(shù)據(jù)自動(dòng)采集:任務(wù)2
基于urllib庫(kù)爬取一個(gè)電商網(wǎng)頁(yè)任務(wù)2
基于urllib庫(kù)爬取一個(gè)電商網(wǎng)頁(yè)模塊功能request請(qǐng)求處理模塊,用于打開(kāi)和讀取URL,可以模擬瀏覽器的一個(gè)請(qǐng)求發(fā)起過(guò)程error異常處理模塊,為request模塊所引發(fā)的異常定義了異常類parse用于解析
URLrobotparser用于解析
robots.txt
文件(1)urllib庫(kù)l
Python自帶的標(biāo)準(zhǔn)庫(kù),直接導(dǎo)入項(xiàng)目中便可使用。主要模塊如下:任務(wù)2
基于urllib庫(kù)爬取一個(gè)電商網(wǎng)頁(yè)參數(shù)說(shuō)明url網(wǎng)頁(yè)的URL地址,可以是一個(gè)字符串,或一個(gè)urllib.request.Request對(duì)象data一個(gè)對(duì)象,包含要發(fā)送到服務(wù)器的附加數(shù)據(jù),若不需要發(fā)送數(shù)據(jù)則為
None。當(dāng)data不為None時(shí),發(fā)送請(qǐng)求的方式需為POSTtimeout可選參數(shù),用于指定阻塞操作(如連接嘗試)的超時(shí)時(shí)間,單位為秒cafileHTTPS
請(qǐng)求時(shí),指定CA
證書(shū)文件capathHTTPS
請(qǐng)求時(shí),指定
CA
證書(shū)的路徑cadefault未使用context該參數(shù)若提供,則必須是一個(gè)
ssl.SSLContext
實(shí)例,用于描述各種
SSL
參數(shù)(2)urllib.request.urlopen():l
Urllib庫(kù)的request模塊中用于訪問(wèn)給定URL的函數(shù),主要參數(shù)說(shuō)明如下:任務(wù)2
基于urllib庫(kù)爬取一個(gè)電商網(wǎng)頁(yè)(3)urllib.request.Request:l
URL
請(qǐng)求對(duì)象的抽象類。當(dāng)使用urlopen()方法發(fā)送一個(gè)請(qǐng)求時(shí),可通過(guò)該類的對(duì)象來(lái)添加額外的data參數(shù),自定義請(qǐng)求頭(header)信息等:參數(shù)說(shuō)明url網(wǎng)頁(yè)的URL地址,與urllib.request.urlopen方法中的url參數(shù)一致data與urllib.request.urlopen方法中的data參數(shù)一致,目前唯一用到
data
的只有
HTTP
請(qǐng)求headers一個(gè)字典,用于設(shè)置request請(qǐng)求頭信息,通常被用于
"偽裝"
User-Agent
標(biāo)頭值。如果給出了
data參數(shù),則應(yīng)當(dāng)包含合適的
Content-Type
頭部信息;若未提供且
data
不是
None,則會(huì)把
Content-Type:
application/x-www-form-urlencoded
加入作為默認(rèn)值origin_req_host發(fā)起初始會(huì)話的請(qǐng)求主機(jī),默認(rèn)值為
"http.cookiejar.request_host(self)
",表示是用戶發(fā)起初始請(qǐng)求的主機(jī)名或
IP
地址unverifiable用于標(biāo)示出請(qǐng)求是否無(wú)法驗(yàn)證method字符串,表示要采用的
HTTP
請(qǐng)求方法,如"GET"、"POST"
等任務(wù)2
基于urllib庫(kù)爬取一個(gè)電商網(wǎng)頁(yè)(4)http.client.HTTPResponse:l
使用urlopen()向網(wǎng)站發(fā)送請(qǐng)求時(shí),如果是
HTTP
/
HTTPS請(qǐng)求
的
URL,urlopen()將返回一個(gè)http.client.HTTPResponse
的對(duì)象,它提供了提供獲取網(wǎng)站相關(guān)響應(yīng)內(nèi)容的方法:l read()、readline()、readlines():對(duì)響應(yīng)內(nèi)容的數(shù)據(jù)讀取操作;l info():獲取遠(yuǎn)程服務(wù)器返回的頭信息,python3.9后建議用headers代替;l getcode():返回HTTP狀態(tài)碼,python3.9后建議用status代替;l geturl():返回請(qǐng)求的URL,python3.9后建議用url代替(5)基于urllib爬取當(dāng)當(dāng)網(wǎng)頁(yè)面:任務(wù)2
基于urllib庫(kù)爬取一個(gè)電商網(wǎng)頁(yè)任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求(1)HTTP請(qǐng)求l
GET請(qǐng)求:用于向服務(wù)器請(qǐng)求數(shù)據(jù),直接在URL中附加上所有請(qǐng)求參數(shù)l
POST請(qǐng)求:通常用于向服務(wù)器提交數(shù)據(jù),它的請(qǐng)求參數(shù)或提交的數(shù)據(jù)不會(huì)出現(xiàn)在URL地址中,是一種比較主流也比較安全的數(shù)據(jù)傳遞方式l
PUT請(qǐng)求:請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,通常要指定存儲(chǔ)的位置l
DELETE請(qǐng)求:請(qǐng)求服務(wù)器刪除一個(gè)資源l
HEAD請(qǐng)求:請(qǐng)求獲取對(duì)應(yīng)的HTTP報(bào)頭信息l
OPTIONS請(qǐng)求:可以獲得當(dāng)前URL所支持的請(qǐng)求類型任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求(2)GET請(qǐng)求l
GET請(qǐng)求一般用于向服務(wù)器請(qǐng)求數(shù)據(jù),請(qǐng)求的參數(shù)通過(guò)URL地址傳遞到服務(wù)器,即可以直接在URL中寫上要傳遞的參數(shù),也可以由表單進(jìn)行傳遞l
GET請(qǐng)求要傳遞的參數(shù)跟在頁(yè)面地址中的問(wèn)號(hào)(?)后面,每個(gè)參數(shù)以“參數(shù)名=值”的格式表示,多個(gè)參數(shù)之間用符號(hào)
&
拼接/?key=%C5%C0%B3%E6&act=input任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求(3)URL編解碼l
GET請(qǐng)求的參數(shù)包含中文或其他特殊字符時(shí),需要對(duì)這些參數(shù)進(jìn)行URL編碼,可通過(guò)
urllib.parse.urlencode()方法實(shí)現(xiàn)l
與URL編碼類似,也可通過(guò)
urllib.parse.unquote()方法進(jìn)行URL解碼URL編碼示例URL解碼示例任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求(4)POST請(qǐng)求l
POST請(qǐng)求通過(guò)表單的方式向服務(wù)器提交數(shù)據(jù),它的請(qǐng)求參數(shù)或提交的數(shù)據(jù)不會(huì)出現(xiàn)URL地址中l(wèi)
當(dāng)urlopen()函數(shù)的data參數(shù)不為None(空)時(shí),則
HTTP請(qǐng)求的方式應(yīng)為POST方式通過(guò)Chrome瀏覽器的DevTools查看HTTP請(qǐng)求方式任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求(5)基于urllib庫(kù)的POST請(qǐng)求實(shí)現(xiàn)思路:l
設(shè)置請(qǐng)求的URL網(wǎng)址l
構(gòu)建表單數(shù)據(jù),并使用urllib.parse.urlencode()對(duì)數(shù)據(jù)進(jìn)行編碼l
創(chuàng)建Request對(duì)象,參數(shù)包括URL地址和要傳遞的數(shù)據(jù)l
使用addheader()添加頭信息,模擬瀏覽器進(jìn)行爬取l
使用urllib.request.urlopen()打開(kāi)對(duì)應(yīng)的Request對(duì)象,完成信息的傳遞l
后續(xù)處理,如讀取網(wǎng)頁(yè)內(nèi)容、將從網(wǎng)頁(yè)中提取到的數(shù)據(jù)寫入文件等操作任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求(6)urllib庫(kù)發(fā)送GET請(qǐng)求示例任務(wù)3
urllib處理發(fā)送GET/POST請(qǐng)求(7)urllib庫(kù)發(fā)送POST請(qǐng)求示例注:示例中的data、headers變量中的相關(guān)數(shù)據(jù)須根據(jù)自已的瀏覽器調(diào)度工具查看到的相關(guān)內(nèi)容做相應(yīng)修改。任務(wù)4 請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用任務(wù)4 請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用(1)請(qǐng)求頭偽裝:加入特定的Headers請(qǐng)求頭信息,將爬蟲(chóng)發(fā)出的請(qǐng)求偽裝成一個(gè)從瀏覽器發(fā)出請(qǐng)求l
通過(guò)urllib.request.Request進(jìn)行設(shè)置l
通過(guò)Request.add_header()來(lái)添加請(qǐng)求頭信息任務(wù)4請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用(2)代理服務(wù)器:l
urlopen()方法不支持代理、Cookies等HTTP/HTTPS高級(jí)功能,在urllib庫(kù)下使用代理服務(wù)器,需要通過(guò)urllib.request中的OpenerDirector類的對(duì)象來(lái)實(shí)現(xiàn),步驟如下:l
使用相關(guān)的Handler處理器創(chuàng)建特定功能的處理器對(duì)象l
通過(guò)build_opener()方法使用Handler對(duì)象創(chuàng)建自定義的opener對(duì)象l
使用自定義的opener對(duì)象,調(diào)用open()方法發(fā)送請(qǐng)求(2)代理服務(wù)器示例:任務(wù)4請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用(3)豆瓣電影Top
250排行榜爬取示例1任務(wù)4請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用(3)豆瓣電影Top
250排行榜爬取示例2任務(wù)4請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用(3)豆瓣電影Top
250排行榜爬取示例3任務(wù)4請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用(3)豆瓣電影Top
250排行榜爬取示例4任務(wù)4請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用(3)豆瓣電影Top
250排行榜爬取示例5任務(wù)4請(qǐng)求頭偽裝與代理服務(wù)器應(yīng)用任務(wù)5 網(wǎng)絡(luò)異常處理任務(wù)5 網(wǎng)絡(luò)異常處理(1)URLError:l
繼承自Python的OSError,定義了三個(gè)參數(shù):args、reason、filenamel
URLError產(chǎn)生的原因:l 沒(méi)有連接網(wǎng)絡(luò)l 服務(wù)器連接失敗l 找不到指定的服務(wù)器URLError示例任務(wù)5 網(wǎng)絡(luò)異常處理(2)HTTPError:l
繼承自URLError,它的對(duì)象擁有一個(gè)整型的屬性code,表示服務(wù)器返回的錯(cuò)誤代碼,如:404表示請(qǐng)求的頁(yè)面不存在l
urllib.request.urlopen()方法請(qǐng)求頁(yè)面時(shí),如果返回的響應(yīng)碼表示無(wú)法處理請(qǐng)求內(nèi)容時(shí),urlopen()會(huì)拋出HTTPError任務(wù)5 網(wǎng)絡(luò)異常處理(1)HTTPError示例:任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)(1)Requests:l
Python第三方庫(kù),使用前需先安裝l
基于urllib的基礎(chǔ)上進(jìn)行了高度的封裝,提供了比urllib更豐富的功能,更方便的調(diào)用方式任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)(2)requests庫(kù)的常用請(qǐng)求函數(shù):l
request()函數(shù)是最基礎(chǔ)的函數(shù),其它函數(shù)是對(duì)request()函數(shù)的快捷封裝l
request(method,url,**kwargs)requests庫(kù)的常用請(qǐng)求函數(shù)方法說(shuō)明requsts.request()構(gòu)造一個(gè)請(qǐng)求,最基本的HTTP請(qǐng)求實(shí)現(xiàn)方法requsts.get()獲取網(wǎng)頁(yè),對(duì)應(yīng)HTTP中的GET方法requsts.post()向網(wǎng)頁(yè)提交信息,對(duì)應(yīng)HTTP中的POST方法requsts.head()獲取網(wǎng)頁(yè)的頭信息,對(duì)應(yīng)HTTP中的HEAD方法requsts.put()向網(wǎng)頁(yè)提交put方法,對(duì)應(yīng)HTTP中的PUT方法requsts.patch()向網(wǎng)頁(yè)提交局部修改的請(qǐng)求,對(duì)應(yīng)HTTP中的PATCH方法requsts.delete()向網(wǎng)頁(yè)提交刪除請(qǐng)求,對(duì)應(yīng)HTTP中的DELETE方法任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)(3)requests.Request:l
請(qǐng)求對(duì)象,用于將一個(gè)請(qǐng)求發(fā)送到服務(wù)器l
Request對(duì)象的生命周期針對(duì)一個(gè)客戶端請(qǐng)求,一旦請(qǐng)求發(fā)送完畢,該請(qǐng)求包含的內(nèi)容就會(huì)被釋放掉l
Request對(duì)象的請(qǐng)求完成后會(huì)將響應(yīng)結(jié)果封裝在Response類的響應(yīng)對(duì)象中返回,其中包含服務(wù)器對(duì)HTTP請(qǐng)求的響應(yīng)。任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)(4)requests.Session:l
表示請(qǐng)求會(huì)話,提供了持久性、連接池等相關(guān)配置l
Session類的對(duì)象可以跨越多個(gè)頁(yè)面,它的生命周期同樣針對(duì)的是一個(gè)客戶端,當(dāng)關(guān)閉這個(gè)客戶端的瀏覽器時(shí),只要是在預(yù)先設(shè)置的會(huì)話周期內(nèi),這個(gè)會(huì)話包含的內(nèi)容會(huì)一直存在,不會(huì)被馬上釋放掉任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)(5)requests.Response:l
響應(yīng)對(duì)象,包含服務(wù)器對(duì)HITP請(qǐng)求的響應(yīng)l
當(dāng)request()函數(shù)得到服務(wù)器返回的響應(yīng)后,會(huì)創(chuàng)建并返回一個(gè)Response類對(duì)象,該對(duì)象包含了服務(wù)器返回的所有信息,也包括原來(lái)創(chuàng)建的Request對(duì)象。Response對(duì)象的常用屬性屬性說(shuō)明status_codeHTTP請(qǐng)求返回的狀態(tài)碼,200表示成功textHTTP響應(yīng)的字符串形式,即url對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容encoding從HTTP
header中獲取的響應(yīng)內(nèi)容編碼方式apparent_encoding從內(nèi)容中推斷的響應(yīng)內(nèi)容編碼方式(備選)contentHTTP響應(yīng)內(nèi)容的二進(jìn)制形式任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)(6)Requests庫(kù)中的異常類:異常類說(shuō)明requests.ConnectionError網(wǎng)絡(luò)連接異常,如DNS查詢失敗,拒絕連接等requests.HTTPErrorHTTP錯(cuò)誤異常requests.URLRequiredURL缺失異常requests.TooManyRedirects超過(guò)最大重定向次數(shù),產(chǎn)生重定向異常requests.ConnectTimeout連接遠(yuǎn)程服務(wù)器超時(shí)異常requests.Timeout請(qǐng)求URL超時(shí)異常任務(wù)6 基于requests庫(kù)爬取電商網(wǎng)頁(yè)(7)豆瓣電影排行版TOP250的數(shù)據(jù)爬取小結(jié)l 在本項(xiàng)目中主要介紹了爬蟲(chóng)的基本概念及兩個(gè)爬蟲(chóng)請(qǐng)求的常用庫(kù):包括爬蟲(chóng)的概念、產(chǎn)生背景、爬蟲(chóng)的分類、爬蟲(chóng)的合法性、爬蟲(chóng)的基本流程、通用爬蟲(chóng)工具的使用、基于urllib庫(kù)及requests庫(kù)的網(wǎng)頁(yè)數(shù)據(jù)采集、基本的反爬策略應(yīng)用等。l 通過(guò)本項(xiàng)目的學(xué)習(xí),希望能夠了解爬蟲(chóng)的相關(guān)概念,能基于urllib庫(kù)及requests庫(kù)實(shí)現(xiàn)對(duì)特定網(wǎng)頁(yè)的采集,能掌握基本的反爬策略,能在爬蟲(chóng)程序中進(jìn)行請(qǐng)求頭偽裝及代理服務(wù)器設(shè)置實(shí)現(xiàn)對(duì)網(wǎng)頁(yè)的爬取,為后續(xù)的爬蟲(chóng)學(xué)習(xí)做好鋪墊。任務(wù)3.4.1
Beautiful
Soup數(shù)據(jù)采集與處理任務(wù)3.4.1
Beautiful
SoupBeautifulSoup庫(kù)l
是一個(gè)python的HTML或XML的第三方解析庫(kù),使用前需先安裝:pipinstall
beautifulsoup4l
它將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)樹(shù)形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸納為4種:bs4.element.Tag類:表示標(biāo)簽,它有兩個(gè)非常重要的屬性:name,表示標(biāo)簽名;attributes,表示標(biāo)簽的屬性,可通過(guò)字典的引用方式或“.”成員引用符的方式來(lái)引用bs4.element.NavigableString類:表示HTML中標(biāo)簽的文本(非屬性字符串)bs4.BeautifulSoup類:表示一個(gè)文檔的全部?jī)?nèi)容。大部分時(shí)候,可以把它當(dāng)作
Tag
對(duì)象,支持遍歷文檔樹(shù)和搜索文檔樹(shù)的大部分方法bs4.element.Comment類:表示文檔內(nèi)的注釋部分(2)Beautiful
Soup4網(wǎng)頁(yè)數(shù)據(jù)解析流程任務(wù)3.4.1
Beautiful
Soup(2.1)BeautifulSoup對(duì)象l
使用Beautiful
Soup進(jìn)行網(wǎng)頁(yè)數(shù)據(jù)解析,首先要?jiǎng)?chuàng)建一個(gè)BeatutifulSoup類的對(duì)象,其構(gòu)造方法的參數(shù)說(shuō)明如下:說(shuō)明markup待解析的HTML字符串或類文件對(duì)象features用于指定解析器,
可以是特定解析器的名稱(“
l
xml
”,“
l
xml
-
x
m
l
”
、“html.parser
”或“html5lib”),或者是要使用的標(biāo)記類型(“html”、“html5”、“xml”)builder使用自定義的TreeBuilder子類替換features中的默認(rèn)實(shí)現(xiàn)parse_only指定文檔中需解析的部分,其他未指定部分將會(huì)被忽略from_encoding指定要使用的編碼格式exclude_encodings指定要排除的編碼格式任務(wù)3.4.1
Beautiful
Soup(2.2)查找目標(biāo)節(jié)點(diǎn)l
Beautiful
Soup定義了很多搜索節(jié)點(diǎn)的方法,如find_XXX()系列方法、select()方法[可使用CSS選擇器的語(yǔ)法]等、參數(shù)說(shuō)明name指定要查找的標(biāo)簽名,如果傳入的是字符串,查找與字符串完全匹配的內(nèi)容;如果傳入的是正則表達(dá)式,則通過(guò)re模塊的match()函數(shù)進(jìn)行匹配;如果傳入一個(gè)列表,則會(huì)返回與列表中任一元素相匹配的內(nèi)容。attrs字典結(jié)構(gòu)的過(guò)濾器,用于設(shè)置查找時(shí)的過(guò)濾條件recursive指定是否檢索當(dāng)前節(jié)點(diǎn)的所有子孫節(jié)點(diǎn),如果為False,則只檢索當(dāng)前節(jié)點(diǎn)的直接子節(jié)點(diǎn)string搜索文檔中的字符串內(nèi)容。與
name
參數(shù)的可選值一樣,string
參數(shù)也接受字符串、正則表達(dá)式、
列表Truelimit限制返回結(jié)果的數(shù)量,一旦搜索到結(jié)果的數(shù)量達(dá)到了limit的限制時(shí),就會(huì)停止搜索kwargs關(guān)鍵字參數(shù),如果某個(gè)指定名字的參數(shù)不是方法中內(nèi)置的參數(shù)名,那么在進(jìn)行搜索時(shí),會(huì)把該參數(shù)當(dāng)作指定名稱的標(biāo)簽中的屬性來(lái)fin搜d索_X。XX()系列方法常用參數(shù)任務(wù)3.4.1
Beautiful
Soup(2.3)解析信息l
通過(guò)相關(guān)方法獲取到了目標(biāo)節(jié)點(diǎn)對(duì)象后,便可通過(guò)該對(duì)象的相關(guān)屬性或方法來(lái)獲取相應(yīng)的信息:如果一個(gè)節(jié)點(diǎn)對(duì)象只有一個(gè)
NavigableString
類型子節(jié)點(diǎn),那么這個(gè)節(jié)點(diǎn)對(duì)象可以使用.string方法獲取子節(jié)點(diǎn);如果一個(gè)節(jié)點(diǎn)對(duì)象包含了多個(gè)子節(jié)點(diǎn),則節(jié)點(diǎn)對(duì)象就無(wú)法確定
.string
方法應(yīng)該調(diào)用哪個(gè)子節(jié)點(diǎn)的內(nèi)容,這種情況下,
.string
的輸出結(jié)果是
None
;如果一個(gè)節(jié)點(diǎn)對(duì)象中包含多個(gè)字符串,可以使用
.strings
或
.stripped_strings來(lái)循環(huán)獲取,.stripped_strings
可以去除多余空白內(nèi)容;如果只想得到一個(gè)節(jié)點(diǎn)對(duì)中包含的文本內(nèi)容,則可以使用
get_text()
方法,該方法獲取到節(jié)點(diǎn)中包含的所有文本內(nèi)容,包括子孫節(jié)點(diǎn)中的內(nèi)容,并將結(jié)果作為Unicode字符串返回。任務(wù)3.4.1
Beautiful
Soup項(xiàng)目4 并發(fā)技術(shù)實(shí)戰(zhàn)數(shù)據(jù)采集與處理2023年11月10日星期五掌握了解掌握熟悉學(xué)習(xí)目標(biāo)掌握
多線程技術(shù)、基于multiprocessing庫(kù)的多進(jìn)程并發(fā)編程12掌握
多線程技術(shù)、協(xié)程技術(shù)、基于threading、gevent的并發(fā)編程熟悉
并發(fā)爬蟲(chóng)的開(kāi)發(fā)34了解
并發(fā)原理、Python實(shí)現(xiàn)并發(fā)的方式目錄任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)任務(wù)2 基于queue模塊的多線程爬蟲(chóng)任務(wù)3 基于協(xié)程的并發(fā)爬蟲(chóng)任務(wù)4 歷史天氣并發(fā)爬取任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(1)并發(fā)原理l
用戶在同一時(shí)間內(nèi)可以同時(shí)運(yùn)行多個(gè)應(yīng)用程序稱為多任務(wù)處理,每個(gè)應(yīng)用程序被稱作一個(gè)任務(wù)l
多任務(wù)處理的兩種形式:并發(fā)和并行并行:兩個(gè)或者多個(gè)任務(wù)在同一時(shí)刻發(fā)生并發(fā):兩個(gè)或者多個(gè)任務(wù)在同一時(shí)間間隔內(nèi)發(fā)生任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(2)進(jìn)程(Process)l
進(jìn)程是一個(gè)實(shí)體。它是有特定功能的程序在一個(gè)數(shù)據(jù)集上一次動(dòng)態(tài)執(zhí)行的過(guò)程,它是系統(tǒng)進(jìn)行資源分配的基本單位l
每一個(gè)進(jìn)程都有自己的地址空間,進(jìn)程占據(jù)的內(nèi)存空間由控制塊、程序段和數(shù)據(jù)段三個(gè)部分組成:控制塊(Proscessing
Control
Block,PCB):描述進(jìn)程的數(shù)據(jù)結(jié)構(gòu),(是進(jìn)程在計(jì)算機(jī)中的唯一標(biāo)識(shí)(含有標(biāo)識(shí)信息),計(jì)算機(jī)通過(guò)查看PCB來(lái)感知進(jìn)程的存在。程序段:用于存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。數(shù)據(jù)段:存儲(chǔ)變量和進(jìn)程執(zhí)行期間產(chǎn)生的中間數(shù)據(jù)及最終數(shù)據(jù)的一塊內(nèi)存區(qū)域。任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(3)進(jìn)程的生命周期任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)multiprocessing模塊l
Python用于實(shí)現(xiàn)多進(jìn)程并發(fā)編程的標(biāo)準(zhǔn)模塊l
模塊中的Process類用于創(chuàng)建進(jìn)程對(duì)象,當(dāng)進(jìn)程對(duì)象創(chuàng)建后,通過(guò)調(diào)用start()方法來(lái)啟動(dòng)進(jìn)程,構(gòu)造方法如下:
init
(self,group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)參數(shù)說(shuō)明如下:group:必須為None,它僅用于兼容
threading.Thread;target:由
run()
方法調(diào)用的可調(diào)用對(duì)象,表示子進(jìn)程的功能函數(shù),用于為子進(jìn)程分派任務(wù);?
name:表示當(dāng)前進(jìn)程的名稱。若沒(méi)有指定,默認(rèn)為Process-N,N為從1開(kāi)始遞增的整數(shù);?
args:以元組形式傳遞給target指定函數(shù)的位置參數(shù);kwargs:以字典形式傳遞給target指定函數(shù)的關(guān)鍵字參數(shù);daemon:表示是否將進(jìn)程設(shè)為守護(hù)進(jìn)程(在后臺(tái)運(yùn)行的一類特殊進(jìn)程,用于執(zhí)行特定的系統(tǒng)任務(wù))。如果為默認(rèn)值(
None),則表示從父進(jìn)程中繼承該標(biāo)志位。任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(5)
Process對(duì)象的常用方法方法說(shuō)明start()啟動(dòng)子進(jìn)程,等待CPU調(diào)度is_alive()判斷進(jìn)程實(shí)例是否還有效join(timeout=None)在timeout秒內(nèi),等待子進(jìn)程結(jié)束;若為timeout為默認(rèn)值None,則表示一直等待terminate
()結(jié)束當(dāng)前進(jìn)程,進(jìn)程的后代進(jìn)程將不會(huì)被終止kill
()同terminate()run()在父進(jìn)程中直接運(yùn)行target參數(shù)引用的可執(zhí)行對(duì)象,不會(huì)啟動(dòng)子進(jìn)程close()關(guān)閉Process對(duì)象,釋放所有資源任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(6)基于Process類的多進(jìn)程并發(fā)編程示例通過(guò)Process類的子類創(chuàng)建多進(jìn)程通過(guò)Process類創(chuàng)建多進(jìn)程任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(7)進(jìn)程池(Pool類)l
若需要?jiǎng)?chuàng)建大量進(jìn)程時(shí),手動(dòng)創(chuàng)建的方式不僅低效繁瑣,而且工作量巨大。另外,進(jìn)程的創(chuàng)建、運(yùn)行、銷毀均會(huì)增加任務(wù)的額外開(kāi)銷,降低多進(jìn)程任務(wù)的執(zhí)行效率。此時(shí),可使用multiprocessing模塊中提供的Pool(進(jìn)程池)類,批量創(chuàng)建并管理子進(jìn)程。Pool類的構(gòu)造方法如下:
init
(self,processes=None,initializer=None,initargs=(),maxtasksperchild=None,
context=None)參數(shù)說(shuō)明如下:processes:指定進(jìn)程池中并行執(zhí)行的子進(jìn)程數(shù)量。若processes參數(shù)設(shè)為None,則會(huì)使用os.cpu_count()返回的CPU核心數(shù)initializer:若不為
None,則每個(gè)工作進(jìn)程將會(huì)在啟動(dòng)時(shí)調(diào)用
initializer(*initargs)initargs:傳遞給initializer的參數(shù)maxtasksperchild,一個(gè)工作進(jìn)程在它退出或被一個(gè)新的工作進(jìn)程代替之前能完成的任務(wù)數(shù)量,以釋放閑置資源context,用于設(shè)定工作進(jìn)程啟動(dòng)時(shí)的上下文任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(7)Pool類對(duì)象的常用方法方法說(shuō)明apply(func,args,
kwds)以阻塞方式調(diào)用func函數(shù),args、kwds是分別以元組或字典方式傳遞給func函數(shù)的參數(shù)apply_async(func,args,kwds,callback=None,
error_callback=None)以非阻塞方式調(diào)用func函數(shù),args、kwds是分別以元組或字典方式傳遞給func函數(shù)的參數(shù),callback、error_callback分別是回調(diào)函數(shù)及錯(cuò)誤回調(diào)函數(shù)map(func,iterable,chunksize=None)以阻塞方式將func函數(shù)應(yīng)用到interable可迭代對(duì)象的每個(gè)元素上,可迭代對(duì)象按chunksize分為多個(gè)任務(wù)提交給子進(jìn)程處理。map_async(func,iterable,chunksize=None,
callback=None,error_callback=None)以非阻塞方式將func函數(shù)應(yīng)用到interable可迭代對(duì)象的每個(gè)元素上,可迭代對(duì)象按chunksize分為多個(gè)任務(wù)提交給子進(jìn)程處理。callback、error_callback分別是回調(diào)函數(shù)及錯(cuò)誤回調(diào)函數(shù)close()關(guān)閉Pool對(duì)象,不再接受新任務(wù)terminate()不管任務(wù)是否完成,立即終止Pool對(duì)象join()在close()方法后使用,阻塞主進(jìn)程,直到子進(jìn)程全部結(jié)束任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(7)基于Pool類的多進(jìn)程并發(fā)編程示例任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(8)進(jìn)程間的通信l
進(jìn)程擁有自己獨(dú)立的用戶空間(代碼+數(shù)據(jù)),一般情況下,無(wú)法與其他進(jìn)程共享l
multiprocessing模塊中提供了Queue(隊(duì)列)類和Pipe(管道)類來(lái)實(shí)現(xiàn)進(jìn)程間的通信:Queue(隊(duì)列)類:用于創(chuàng)建和管理存儲(chǔ)共享資源的先入先出隊(duì)列Pipe(管道)類:由操作系統(tǒng)內(nèi)核提供的高效的進(jìn)程間通信方式,從通信效率上來(lái)說(shuō),管道比隊(duì)列要更加高效任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(8)進(jìn)程間通信示例基于Pipe的進(jìn)程通信示例基于Queue的進(jìn)程通信示例任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(8)基于多進(jìn)程并發(fā)爬蟲(chóng)采集豆瓣電影Top
250排行榜任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(8)基于多進(jìn)程并發(fā)爬蟲(chóng)采集豆瓣電影Top
250排行榜任務(wù)1 基于進(jìn)程的并發(fā)爬蟲(chóng)(8)基于多進(jìn)程并發(fā)爬蟲(chóng)采集豆瓣電影Top
250排行榜任務(wù)2 基于queue模塊的多線程爬蟲(chóng)任務(wù)2 基于queue模塊的多線程爬蟲(chóng)(1)線程(Thread)l
線程是操作系統(tǒng)執(zhí)行運(yùn)算調(diào)度的最小單位。線程不能獨(dú)立存在,必須包含在某個(gè)進(jìn)程中,是進(jìn)程的實(shí)際運(yùn)行單位l
線程由線程ID、當(dāng)前指令指針(PC)、寄存器集合和堆棧組成,它不能獨(dú)立擁有系統(tǒng)資源,同一進(jìn)程中的多個(gè)線程將共享該進(jìn)程中的全部系統(tǒng)資源,因此線程間的數(shù)據(jù)通信要比進(jìn)程間的數(shù)據(jù)通信更容易、高效l
同一進(jìn)程內(nèi)的每個(gè)線程有自己的獨(dú)立堆棧和寄存器等,在線程切換時(shí),只需保存和恢復(fù)自己的堆棧和寄存器,無(wú)須涉及進(jìn)程的內(nèi)存空間,因此線程的創(chuàng)建、調(diào)度和銷毀工作比進(jìn)程要高效,需要的計(jì)算資源也比進(jìn)程要少任務(wù)2 基于queue模塊的多線程爬蟲(chóng)threading模塊l
Python用于實(shí)現(xiàn)多線程并發(fā)編程的標(biāo)準(zhǔn)模塊l
模塊中的Thread類用于創(chuàng)建線程對(duì)象,線程對(duì)象創(chuàng)建后,通過(guò)調(diào)用start()方法來(lái)啟動(dòng)線程,構(gòu)造方法(與進(jìn)程的類似)如下:
init
(self,group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)參數(shù)說(shuō)明如下:group:默認(rèn)為None,用于向后兼容ThreadGroup;target:由
run()
方法調(diào)用的可調(diào)用對(duì)象,表示子線程的功能函數(shù),用于為子線程分派任務(wù);name:表示當(dāng)前線程的名稱。若沒(méi)有指定,默認(rèn)為Thread-N,N為從1開(kāi)始遞增的整數(shù);args:以元組形式傳遞給target指定函數(shù)的位置參數(shù);kwargs:以字典形式傳遞給target指定函數(shù)的關(guān)鍵字參數(shù);daemon:表示是否將進(jìn)程設(shè)為守護(hù)線程。如果為默認(rèn)值(
None),則表示從父線程中繼承該標(biāo)志位。任務(wù)2 基于queue模塊的多線程爬蟲(chóng)(3)
Thread對(duì)象的常用屬性和方法方法說(shuō)明start()啟動(dòng)子線程,等待CPU調(diào)度is_alive()判斷進(jìn)程實(shí)例是否還有效join(timeout=None)在timeout秒內(nèi),等待子線程結(jié)束;若為timeout為默認(rèn)值None,則表示一直等待getName()獲取線程的名字run()直接運(yùn)行target參數(shù)引用的可執(zhí)行對(duì)象屬性說(shuō)明name線程名字,由實(shí)例化參數(shù)name指定ident線程標(biāo)識(shí)符daemon是否是一個(gè)daemon線程,若不設(shè)置,默認(rèn)值為FalseThread對(duì)象的常用屬性Thread對(duì)象的常用方法任務(wù)2 基于queue模塊的多線程爬蟲(chóng)(4)線程同步l
多個(gè)線程訪問(wèn)同一共享數(shù)據(jù),可能會(huì)引發(fā)競(jìng)爭(zhēng)問(wèn)題,這種多個(gè)線程同時(shí)訪問(wèn)共享數(shù)據(jù)造成的混亂情況,稱為多線程數(shù)據(jù)競(jìng)爭(zhēng)l
為了解決多線程數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題,需引入線程同步機(jī)制,以保證多個(gè)線程可以有序的訪問(wèn)共享數(shù)據(jù)l
threading模塊提供了多種線程同步機(jī)制:Lock、RLock、Semaphore、Condition、Event等。其基本原理均是給共享數(shù)據(jù)“加鎖”任務(wù)2 基于queue模塊的多線程爬蟲(chóng)(4)線程同步示例任務(wù)2 基于queue模塊的多線程爬蟲(chóng)(5)基于多線程并發(fā)爬蟲(chóng)采集豆瓣電影Top
250排行榜任務(wù)3 基于協(xié)程的并發(fā)爬蟲(chóng)任務(wù)3 基于協(xié)程的并發(fā)爬蟲(chóng)(1)協(xié)程(coroutine)l
是一種用戶態(tài)的輕量級(jí)線程,也稱為“輕量級(jí)線程”、“微線程”、“纖程(fiber)”等l
由單一線程內(nèi)部發(fā)出控制信號(hào)進(jìn)行調(diào)度,而非受到操作系統(tǒng)管理,因此協(xié)程沒(méi)有切換開(kāi)銷和同步鎖機(jī)制,具有極高的執(zhí)行效率l
協(xié)程擁有自己的寄存器上下文和棧,它的調(diào)度完全由用戶控制,基本沒(méi)有內(nèi)核切換的開(kāi)銷,可以不加鎖的訪問(wèn)全局變量,上下文的切換非常快l
Python是提供原生協(xié)程支持的語(yǔ)言之一l
gevent是一個(gè)基于協(xié)程的Python第三方庫(kù),使用前需先安裝,常用方法:gevent.spawn():創(chuàng)建并啟動(dòng)協(xié)程; gevent.joinall():等待所有協(xié)程執(zhí)行完畢任務(wù)3 基于協(xié)程的并發(fā)爬蟲(chóng)(2)進(jìn)程、線程、協(xié)程的不同特點(diǎn)l
一個(gè)線程可以擁有多個(gè)協(xié)程,一個(gè)進(jìn)程也可以單獨(dú)擁有多個(gè)協(xié)程l
線程和進(jìn)程都是同步機(jī)制,而協(xié)程則是異步機(jī)制l
協(xié)程能保留上一次調(diào)用時(shí)的狀態(tài),每次重入時(shí),就相當(dāng)于進(jìn)入上一次調(diào)用的狀態(tài)l
單進(jìn)程下協(xié)程和多線程區(qū)別不大,相較之下,協(xié)程更省資源、效率更高、更安全l
協(xié)程的切換不像多線程調(diào)度那樣耗費(fèi)資源,所以不用嚴(yán)格限制協(xié)程的數(shù)量任務(wù)3 基于協(xié)程的并發(fā)爬蟲(chóng)(3)基于協(xié)程的并發(fā)爬蟲(chóng)采集豆瓣電影Top
250排行榜任務(wù)4 歷史天氣并發(fā)爬取任務(wù)4 歷史天氣并發(fā)爬?。?)CPU密集型與I/O密集型l
CPU
密集型(CPU-bound):CPU
密集型也叫做計(jì)算密集型,此類任務(wù)主要消耗CPU資源。I/O操作在很短時(shí)間內(nèi)就可以完成,其耗時(shí)對(duì)任務(wù)的完成影響不大,任務(wù)所需的資源主要集中在CPU的大量計(jì)算和處理上,特點(diǎn)是CPU
占用率相當(dāng)高l
I/O密集型(I/O
bound):此類任務(wù)的特點(diǎn)是CPU消耗很少,由于I/O讀寫的速度遠(yuǎn)遠(yuǎn)低于CPU和內(nèi)存的速度,任務(wù)運(yùn)行時(shí)大部分的狀況是CPU
在等I/O(硬盤,內(nèi)存)讀寫操作的完成,CPU
占用率較低,對(duì)于I/O密集型任務(wù),在一定的任務(wù)總量下,任務(wù)越多,CPU效率越高。任務(wù)4 歷史天氣并發(fā)爬取(1)多進(jìn)程并發(fā),多線程并發(fā)、協(xié)程并發(fā)的對(duì)比l
多進(jìn)程并發(fā):可以利用多核CPU
進(jìn)行并行計(jì)算,是真正的并發(fā);缺點(diǎn)是:占用的資源最多,可以啟動(dòng)的數(shù)目比線程要少。適用于CPU密集型計(jì)算l
多線程并發(fā):與多進(jìn)程相比,更加輕量級(jí),占用資源較少;缺點(diǎn)是:與多進(jìn)程并發(fā)技術(shù)相比,多線程并發(fā)技術(shù)只能夠并發(fā)執(zhí)行,不能夠利用多CPU;與協(xié)程技術(shù)相比,線程的啟動(dòng)數(shù)量有限,占用內(nèi)存資源,有線程切換開(kāi)銷。適用于I/O密集行型計(jì)算l
協(xié)程并發(fā):內(nèi)存開(kāi)銷最小,啟動(dòng)協(xié)程數(shù)目最多;缺點(diǎn)是:支持的庫(kù)有限制,代碼實(shí)現(xiàn)復(fù)雜。適用于I/O
密集型計(jì)算任務(wù)4 歷史天氣并發(fā)爬取(2)基于多線程的歷史天氣并發(fā)爬取l
頁(yè)面分析:歷史天氣預(yù)報(bào)查詢頁(yè)面任務(wù)4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l
頁(yè)面分析:具體月份的歷史天氣預(yù)報(bào)頁(yè)面任務(wù)4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l
數(shù)據(jù)定位:各月份的歷史天氣預(yù)報(bào)頁(yè)面鏈接任務(wù)4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l
數(shù)據(jù)定位:具體的歷史天氣預(yù)報(bào)數(shù)據(jù)任務(wù)4 歷史天氣并發(fā)爬取(2)基于多線程的歷史天氣并發(fā)爬取l
代碼實(shí)現(xiàn)1:任務(wù)4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l
代碼實(shí)現(xiàn)2:任務(wù)4 歷史天氣并發(fā)爬取(2)基于多線程的歷史天氣并發(fā)爬取l
代碼實(shí)現(xiàn)3:任務(wù)4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l
代碼實(shí)現(xiàn)4:任務(wù)4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l
爬蟲(chóng)代碼運(yùn)行時(shí)截圖:小結(jié)l 在本項(xiàng)目中主要介紹了基于Pyth
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 20382-2025紡織品可提取致敏、致癌及其他染料的測(cè)定
- GB/T 21459.2-2025真菌農(nóng)藥粉劑產(chǎn)品標(biāo)準(zhǔn)編寫規(guī)范
- 2026年蘇州百年職業(yè)學(xué)院中單招職業(yè)技能考試題庫(kù)及答案詳解一套
- 2026年安徽中醫(yī)藥高等??茖W(xué)校單招職業(yè)適應(yīng)性測(cè)試題庫(kù)及參考答案詳解一套
- 2026年南陽(yáng)科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)帶答案詳解
- 2026年廣西國(guó)際商務(wù)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)帶答案詳解
- 2026年湖南水利水電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)帶答案詳解
- 2026年青島職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)參考答案詳解
- 2026年嘉興職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)及答案詳解1套
- 2026年山西省運(yùn)城市單招職業(yè)適應(yīng)性考試題庫(kù)及參考答案詳解一套
- 如何培養(yǎng)孩子深度專注
- 2024年餐飲店長(zhǎng)年度工作總結(jié)
- 護(hù)理8S管理匯報(bào)
- 產(chǎn)前篩查標(biāo)本采集與管理制度
- 急危重癥護(hù)理培訓(xùn)心得
- 2025勞動(dòng)合同書(shū)(上海市人力資源和社會(huì)保障局監(jiān)制)
- 門診護(hù)士長(zhǎng)工作總結(jié)匯報(bào)
- 藥膳餐廳創(chuàng)新創(chuàng)業(yè)計(jì)劃書(shū)
- erp沙盤模擬實(shí)訓(xùn)報(bào)告采購(gòu)總監(jiān)
- 污水消毒知識(shí)培訓(xùn)課件
- 橫紋肌溶解癥的護(hù)理
評(píng)論
0/150
提交評(píng)論