數(shù)據(jù)采集與處理 課件全套 劉珍 項目1-7 Python基礎實戰(zhàn)- Scrapy爬蟲框架實戰(zhàn)_第1頁
數(shù)據(jù)采集與處理 課件全套 劉珍 項目1-7 Python基礎實戰(zhàn)- Scrapy爬蟲框架實戰(zhàn)_第2頁
數(shù)據(jù)采集與處理 課件全套 劉珍 項目1-7 Python基礎實戰(zhàn)- Scrapy爬蟲框架實戰(zhàn)_第3頁
數(shù)據(jù)采集與處理 課件全套 劉珍 項目1-7 Python基礎實戰(zhàn)- Scrapy爬蟲框架實戰(zhàn)_第4頁
數(shù)據(jù)采集與處理 課件全套 劉珍 項目1-7 Python基礎實戰(zhàn)- Scrapy爬蟲框架實戰(zhàn)_第5頁
已閱讀5頁,還剩352頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目1

Python基礎實戰(zhàn)數(shù)據(jù)采集與處理掌握了解掌握熟悉掌握

Python的語法、數(shù)據(jù)結構、運算符、表達式、流程控制12掌握

列表、字典、函數(shù)、模塊和包、類與對象、文件操作、異常處理等熟悉

Python3及PyCharm集成開發(fā)環(huán)境的安裝34了解

Python的特點、版本、應用領域、語法規(guī)范等學習目標目錄任務1 Python開發(fā)環(huán)境搭建任務2 從HTML文檔提取特定字符串任務3 用列表、字典組織數(shù)據(jù)任務4 基于正則表達式提取圖片鏈接文本任務5 從JSON文件中加載數(shù)據(jù)Windows系統(tǒng)中安裝PythonLinux系統(tǒng)中安裝Python安裝PyCharm集成開發(fā)環(huán)境任務1 Python開發(fā)環(huán)境搭建Python語言因簡潔的語法、出色的開發(fā)效率以及強大的功能,迅速在多個領域占據(jù)一席之地,成為最符合人類期待的編程語言。Python簡介Python的特點簡單易學免費開源可移植性面向對象豐富的庫Python語言之所以能夠迅速發(fā)展,受到程序員的青睞,與它具有的特點密不可分。目前市場上Python

2和Python

3兩個版本并行,2021開始官方不在維護Python2Python的版本Python作為一門功能強大且簡單易學的編程語言得到了廣泛應用,它主要應用在以下領域Web開發(fā)科學計算與數(shù)據(jù)分析自動化運維網(wǎng)絡爬蟲游戲開發(fā)人工智能Python的應用領域(1)訪問Python官網(wǎng),選擇Downloads→Windows:1.1

Windows系統(tǒng)中安裝Python(2)運行下載的對應版本的Python安裝程序(如:python-3.10.7-amd64.exe),按步驟執(zhí)行安裝:1.1

Windows系統(tǒng)中安裝Python(3)安裝完成后,打開Windows系統(tǒng)的命令提示符窗口測試是否安裝成功:1.1

Windows系統(tǒng)中安裝Python(1)通過wget命令下載minicoda安裝腳本:1.2

Linux系統(tǒng)中安裝Python(2)運行安裝腳本,根據(jù)提示進行對應操作:sh

Miniconda3-latest-Linux-x86_64.sh(3)通過source命令執(zhí)行activate腳本,進入虛擬環(huán)境:source/usr/local/miniconda3/bin/activate(4)窗口輸入python,進入python運行環(huán)境后,輸入命令:python-V1.2

Linux系統(tǒng)中安裝Python(1)訪問jetbrains官網(wǎng),下載PyCharm安裝包:1.3

安裝PyCharm集成開發(fā)環(huán)境(2)運行下載好的PyCharm安裝程序,按步驟執(zhí)行安裝:1.3安裝PyCharm集成開發(fā)環(huán)境(3)安裝完成后的啟動界面:1.3安裝PyCharm集成開發(fā)環(huán)境任務2

從HTML文檔提取特定字符串數(shù)值類型與變量字符串運算符流程控制2.1

數(shù)值類型與變量(1)

數(shù)值類型包括整型(int)、浮點型(float)、復數(shù)類型(complex)

、布爾類型(bool)整型浮點型復數(shù)類型布爾型123 123.45 123+4j True注1:

布爾類型只有兩個取值:True和False注2:Python中的任何對象都可以轉換為布爾類型,若要進行轉換,符合以下條件的數(shù)據(jù)都會被轉換為False:None、任何為0的數(shù)值類型、任何空對象

(如:空序列“”

、()、[]

,空字典{}等)2.1

數(shù)值類型與變量(2)

變量l

Python程序運行的過程中隨時可能產生一些臨時數(shù)據(jù),程序會將這些數(shù)據(jù)保存在內存單元中,并使用不同的標識符來標識各個內存單元。這些具有不同標識、存儲臨時數(shù)據(jù)的內存單元稱為變量,標識內存單元的符號為變量名(或稱為標識符),內存單元中存儲的數(shù)據(jù)就是變量的值。l

變量名由字母、數(shù)字和下劃線組成,且不能以數(shù)字開頭;區(qū)分大小寫l

變量要先聲明后使用2.1

數(shù)值類型與變量說明:圖中的print()為Python的輸出函數(shù),作用是輸出一段文本;type()為Python中的函數(shù),作用是返回給定對象的類型Python采用空格和縮進來區(qū)分語句的層次關系,同一層次的代碼行左側需嚴格對齊,否則代碼將不能通過編譯上圖中第13行和15行中以符號“#”開始的那段文本是Python中的注釋,通常是對某些代碼塊的解釋說明文本,Python在運行時會自動忽略這部分內容l

示例2.2

字符串(1)字符串是一種用來表示文本的數(shù)據(jù)類型,它是由符號或者數(shù)值組成的一個連續(xù)序列。l

Python3的字符串是由Unicode字符組成的不可變序列l(wèi)

Python支持使用一對單引號、一對雙引號或三對引號來定義字符串2.2

字符串(2)Python通過索引或切片的方式來訪問字符串中的部分內容正向索引反向索引#

用于截取字符串中的某個字符#

用于從字符串中截取子字符串注:采用切片的方式來截取字符串的子串時,切片選取的區(qū)間為左閉右開型,截取的子串包含起始下標處對應的字符,但不包含結束下標處對應的字符,如果省略了起始下標,表示從字符串的開始位置處截取,如果省略了結束下標,表示截取到字符串的最后一個字符;步長值用于指定截取時的間隔區(qū)間,可以為正整數(shù)或負整數(shù),如果省略了步長值,則默認步長值為1。索引方式:l 字符串變量[索引下標]l 字符串變量[起始下標:結束下標:步長值]2.2

字符串(3)字符串的常用操作:l 字符串拼接:使用“+”運算符實現(xiàn)l 字符串替換:str.replace(old,new,count=None)

l 字符串分割:str.split(sep=None,maxsplit=-1)

l 字符串兩側空格去除:str.strip(chars=None)、lstrip()、

rstrip()

l 字符串格式化輸出:占位符方式、format()方法、f-strings方式2.3

運算符l 算術運算符:+、-、*、/、//

(整除)

、%

(取余)

、**

(冪)l 比較運算符:

==、!=、>、<、>=、<=l 賦值運算符:=,“=”還可與算術運算符組合成復合賦值運算符l 邏輯運算符:or(或)、

and(與)、not

(非)l 位運算符:<<

(按位左移)、>>

(按位右移)、&

(按位與)、I

(按位或)、^(按位異或)、~(按位取反)2.3

運算符l 運算符的優(yōu)先級:Python支持使用多個不同的運算符連接簡單表達式,實現(xiàn)相對復雜的功能。此時需注意運算符之間的優(yōu)先級,或者使用圓括號“()”來改變表達式的執(zhí)行順序從上往下,優(yōu)先級增高2.3

運算符2.3

運算符(1)if語句:

用于實現(xiàn)分支結構2.4

流程控制if單分支雙分支if-else多分支if-elif-else(2)match語句:

Python3.10中引入,類似于C語言中的switch語句,

但功能更強大2.4

流程控制(3)

for語句:

Python循環(huán)語句的一種2.4

流程控制2.4

流程控制(4)while語句:

可配合使用break,continue語句實現(xiàn)對循環(huán)的靈活控制任務3

用列表、字典等組織數(shù)據(jù)列表(list)元組(tuple)字典(dict)集合(set)函數(shù)3.1

列表(list)列表是Python中有序序列之一,它可以存儲任意類型的元素。(1)列表的創(chuàng)建:l

使用中括號“[]”創(chuàng)建: list_1=[1,2,

3]l

通過函數(shù)list()創(chuàng)建: list_2

=

list(‘數(shù)據(jù)采集與處理’)3.1

列表(list)l

使用索引方式訪問: list_2[1]l

使用切片方式訪問: list_2[1:6:2]#

取出第二個元素:據(jù)#

得到三個元素的子列表:

['據(jù)',

'集',

'處'](2)列表元素的訪問:list_2

=

list(‘數(shù)據(jù)采集與處理’)3.1

列表(list)(3)列表的遍歷:list_2

=

list(‘數(shù)據(jù)采集與處理’)l

使用for循環(huán)遍歷:l

列表推導式:l

Range函數(shù):3.1

列表(list)3.2

元組(tuple)(1)元組的創(chuàng)建:l

使用小括號“()”創(chuàng)建:tup_1=(), tup_2=(1,),tup_3=

(1,2,3)l

通過函數(shù)tuple()創(chuàng)建: tup_4

=

tuple(), tup_5=tuple(“Python”)注1:當使用小括號“()”創(chuàng)建元組時,如果元組中只包含一個元素,那么要在該元素的后面添加逗號,以保證Python解釋器能夠識別其為元組注2:元組中的元素是不允許修改的3.2

元組(tuple)(2)元組元素的訪問及遍歷與列表類似:3.2

元組(tuple)3.3

字典(dict)字典是Python中的映射類型(每個元素都是一個鍵值對,key-value)(1)字典的創(chuàng)建:l

使用大括號“{}”創(chuàng)建: dict_1

=

{id:1001,name:“張三”}l

通過函數(shù)dict()創(chuàng)建: dict_2

=

dict(id=1002,name=“李四”)注1:一個字典中的鍵(key)須唯一,不能重復,可以使用字符或數(shù)值等類型注2:一個字典中的值(value)可以重復,可以是任意類型注3:字典與序列類型不同,字典中的元素是無序的,因此不能象列表或元組那樣通過索引來讀取元素或進行切片操作,字典只能通過鍵來獲取對應的值3.3

字典(dict)(1)Python中的集合分為可變集合與不可變集合:3.4

集合(set)由set()函數(shù)創(chuàng)建,集合中的元素可以動態(tài)地增加或刪除。可變集合由frozenset()函數(shù)創(chuàng)建,集合中的元素不可改變。不可變集合注1:集合與字典類似,也是無序的數(shù)據(jù)類型,因此也不能象列表或元組那樣通過索引來讀取元素或進行切片操作注2:集合與數(shù)學上的集合概念類似,集合所包含的元素是唯一的、不可重復3.4

集合(set)3.5

函數(shù)(1)函數(shù)指封裝起來的、完成某個具體任務并能夠被復用的一段代碼。Python安裝包、標準庫中自帶的函數(shù)統(tǒng)稱為內置函數(shù),用戶自己編寫的函數(shù)稱為自定義函數(shù)(2)Python中使用關鍵字

def定義函數(shù):(3)函數(shù)的調用:函數(shù)名([參數(shù)列表])3.5

函數(shù)(3)函數(shù)的參數(shù):l 位置參數(shù):傳參時按定義時的順序對應傳遞l 關鍵字參數(shù):以“參數(shù)名=值”的方式傳遞l 默認值參數(shù):函數(shù)定義時指定了默認值,如果調用時不給它傳值,則用定義時指定的默認值l 不定長參數(shù):定義時參數(shù)名前加上“*”或“**”,表示可接收任意數(shù)量的位置參數(shù)或關鍵字參數(shù)3.5

函數(shù)(4)變量的作用域:l 局部變量:在函數(shù)內部定義的變量,僅在函數(shù)內部可見l

全局變量:在函數(shù)外部定義的變量,在整個腳本內可見。函數(shù)內可以引用全局變量,但是如果要在函數(shù)內修改全局變量的值,需先在函數(shù)內使用關鍵字“global”進行聲明。3.5

函數(shù)(5)匿名函數(shù):l 匿名函數(shù)是無需函數(shù)名標識的函數(shù),它的函數(shù)體只能是單個表達式。Python中使用關鍵字lambda定義匿名函數(shù):lambda[arg1

[,arg2,argn]]:expressionl 為方便使用匿名函數(shù),應使用變量記錄這個函數(shù):3.5

函數(shù)模塊和包異常處理正則表達式任務4

基于正則表達式提取圖片鏈接文本4.1

模塊和包(1)每個.py的python文件都被視為一個模塊,python文件的名稱就是模塊名(2)一個文件夾包含一個名為:“

init

.py”的文件(可以是一個沒有任何內容的空文件),則這個文件夾便是Python中的包,包名就是文件夾的名稱,包中可以包含多個模塊或子包(3)Python中的模塊可分為三類,分別是內置模塊、第三方模塊和自定義模塊:4.1

模塊和包內置模塊Python的官方模塊,可直接導入程序供開發(fā)人員使用。由非官方制作發(fā)布的、供給大眾使用的Python模塊,在使用之前需要開發(fā)人員先自行安裝第三方模塊開發(fā)人員在程序編寫的過程中自行編寫的、存放功能性代碼的.py文件。自定義模塊4.1

模塊和包(4)模塊的使用:l 使用import導入:l 使用from…import…導入:注1:在from

import

方式下,可以用通配符‘*’

,表示導入所有成員注2:在from

import

方式下,可能會出現(xiàn)模塊的成員名稱重名的問題注3:使用第三方模塊之前,需要使用包管理工具下載和安裝第三方模塊:如:pipinstallpandas4.1

模塊和包(5)

name

屬性:l Python為模塊提供了

name

屬性l

name

屬性通常與if條件語句一起使用l 若當前模塊是啟動模塊,則其

name

的值為“

main

”l 若該模塊被其它程序導入,則

name

的值為文件名4.1

模塊和包(6)包的使用:l

使用import導入:使用import導入包中的模塊時,需要在模塊名的前面加上包名,格式為

“包名.模塊名”;若要使用已導入模塊中的函數(shù)時,需要通過“包名.模塊名.函數(shù)名”實現(xiàn)l 使用from…import…導入:此方式下導入包中模塊包含的內容,若需要使用導入模塊中的函數(shù),需要通過“模塊名.函數(shù)名”實現(xiàn)注:包中的

init

.py文件有兩個作用:標識當前文件夾是一個Python的包;模糊導入:如果

init

文件中沒有聲明

all

屬性,那么使用

from包名 import

*

導入的內容為空4.2

異常處理(1)相關概念:l 語法錯誤:不符合Python語法格式的代碼所引起的錯誤l 邏輯錯誤:語法格式正確的Python代碼在運行時產生的錯誤l 異常:程序運行期間檢測到的錯誤稱為異常若異常不被處理,默認會導致程序崩潰而終止運行(2)Python的異常類:4.2

異常處理注:Python允許程序開發(fā)人員自定義異常,只需創(chuàng)建一個類,讓它繼承自Exception類或其它異常類即可(3)Python的異常處理結構:4.2

異常處理注:也可以在程序中通過raise語句主動拋出異常,語法如下:raise

異常類名或raise

異常對象4.2

異常處理(4)異常處理的執(zhí)行過程:l 執(zhí)行try下面的代碼塊;l 如果沒有異常出現(xiàn),則忽略所有的except塊,如果定義了else塊,則跳轉到else塊執(zhí)行,如果沒有else塊,但是定義了finally塊,則跳轉到finally塊執(zhí)行;l 如果出現(xiàn)異常,則忽略try塊中沒有執(zhí)行的剩余代碼,跳轉到能捕獲對應異常類的except塊執(zhí)行,忽略其他的except塊;l else塊或except塊執(zhí)行完后,如果定義了finally塊,則跳轉到finally塊執(zhí)行。4.2

異常處理(5)with語句:l with語句適用于對資源進行訪問的場合,無論資源在使用過程中是否發(fā)生異常,都可以使用with語句保證執(zhí)行釋放資源操作。with

上下文表達式

[as

資源對象]:語句體注:上下文表達式會返回一個上下文管理器對象,若指定了as子句,則將上下文管理器對象的

enter

()方法的返回值賦值給資源對象。4.2

異常處理4.3

正則表達式(1)基本概念:l 用于描述字符串匹配規(guī)則的文本字符串稱為正則表達式l 一個正則表達式也稱為一個模式(pattern)l 在正則表達式中具有特殊含義的專用字符稱為元字符l Python中的正則表達式模塊是re模塊(2)常用元字符:4.3

正則表達式(3)re模塊的常用函數(shù):4.3

正則表達式4.3

正則表達式類和對象文件與目錄操作JSON任務5從JSON文件中加載數(shù)據(jù)5.1

類和對象(1)基本概念:l 類(Class):類是具有相同屬性和行為的一類對象的集合,它提供了一個抽象的共性描述l 對象(Object):對象是類的一個具體實例,是數(shù)據(jù)(描述事物的屬性)和動作(體現(xiàn)事物的行為)的結合體l 抽象(Abstract):抽象是從許多事物中抽取它們的共同特征,形成概念的過程l 封裝(Encapsulation):封裝就是將對象的屬性和行為封裝起來,不需要讓外界知道具體實現(xiàn)細節(jié),類把自己的屬性和行為只讓可信的其它類或者對象操作,對不可信的類或對象隱藏信息l 繼承(Inheritance):繼承描述的是類與類之間的關系,通過繼承,一個新類可以使用現(xiàn)有類的相關功能,并且在無須重新編寫原來的類的情況下對這些功能進行擴展。繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”、“超類”l 多態(tài)(Polymorphism):多態(tài)指一個類實例的相同方法在不同情形下有不同的表現(xiàn)形式,即同一個屬性或行為在父類和子類中具有不同的語義5.1

類和對象(2)類的定義:Python使用關鍵字class定義類注1:如果在類成員名之前添加雙下劃線(

),則該成員為類的私有成員,它限定只能類的內部訪問注2:類的實例方法的定義與函數(shù)類似,只是方法中的第一參數(shù)須為:self,只能由對象調用5.1

類和對象(3)對象的創(chuàng)建及使用:l 創(chuàng)建對象對象名

=

類名()l 成員引用對象名.屬性對象名.方法()5.1

類和對象(3)類的構造方法與析構方法:l 構造方法:

init

()如果定義類時顯式地定義

init

()方法,那么創(chuàng)建對象時Python解釋器會調用顯式定義的

init

()方法;如果定義類時沒有顯式定義

init

()方法,那么Python解釋器會調用默認的

init

()方法在構造方法中定義的屬性是實例屬性,只能通過對象進行訪問在類中定義的屬性是類屬性,可以通過對象或類進行訪問l 析構方法:

del

()當一個對象的引用計數(shù)器數(shù)值為0時,就會調用析構方法

del

()5.1

類和對象(4)類的繼承及方法重寫:l 類的繼承:單繼承:class

子類(父類)多繼承:class

子類(父類1,父類2,...)l 方法重寫:子類可以繼承父類的屬性和方法,若父類的方法不能滿足子類的要求,子類可以重寫父類的方法,以實現(xiàn)子類的特定功能。重寫就是在子類重新定義一個與父類的方法名及參數(shù)完全相同,但是方法體的具體實現(xiàn)不同的方法。如果子類重寫了父類的方法,但仍希望調用父類中的方法,那么可以使用super()函數(shù)實現(xiàn):super().方法名()5.2

文件與目錄操作(1)文件操作:l 打開文件:open(file,mode='r',encoding=None)file:待打開文件的文件名mode:文件的打開模式,如右圖所示:encoding:文件的編碼方式函數(shù)調用成功會返回一個文件對象l 關閉文件:文件對象.close()close()方法用于關閉文件,該方法沒有參數(shù),直接調用即可也可以使用with語句打開文件,自動實現(xiàn)文件的關閉操作l 讀文件:read()、readline()、readlines()l 寫文件:write()、writelines()5.2

文件與目錄操作5.2

文件與目錄操作(2)目錄操作:

Python提供了多個內置模塊實現(xiàn)對目錄的操作l os.path模塊中的目錄操作常用函數(shù):5.2

文件與目錄操作(2)目錄操作:

Python提供了多個內置模塊實現(xiàn)對目錄的操作l os模塊中的目錄操作常用函數(shù):5.2

文件與目錄操作(2)目錄操作:

Python提供了多個內置模塊實現(xiàn)對目錄的操作l shutil模塊中的目錄操作常用函數(shù):5.2

文件與目錄操作5.3

JSON(1)JSON(JavaScriptObjectNotation)是一種簡單、清晰的數(shù)據(jù)交換格式,它采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù),其語法規(guī)則如下:l

使用鍵值對(

key

:

value

)表示對象屬性和值;l

使用逗號(,)分隔多條數(shù)據(jù);l

使用大括號{

}包含對象;l

使用方括號[

]表示數(shù)組(2)JSON對象為

{key:

value,

key:

value,…}的鍵值對結構。key為對象的屬性,value為對應的屬性值,通過“對象.key”的方式來獲取對應的屬性值。一個表示學生信息的JSON對象示例如下:5.3

JSON5.3

JSON(3)Python提供了內置模塊:json模塊用于JSON數(shù)據(jù)的處理l

dump(obj,fp):把Python對象obj轉換為JSON字符串并寫入fp文件中l(wèi)

dumps(obj):把Python對象obj轉換為JSON字符串l

load(fp):文件中讀取JSON數(shù)據(jù)然后轉換為Python對象l

loads(s):把JSON字符串s轉換為Python對象(通常為字典)注1:在dump()、dumps()函數(shù)中,可以通過參數(shù)indent來設置轉換時的格式化空格數(shù)量注2:在load()、loads()函數(shù)中,可以通過參數(shù)cls來設置使用的轉換類(JSONCoder類的子類),如果不設置,則默認使用JSONCoder類小結l 在本項目中主要介紹了一些Python的基礎知識,包括Python的特點、版本、應用領域、Python開發(fā)環(huán)境的搭建、Python的數(shù)據(jù)結構、運算符、流程控制、字符串、列表、元組、字典、集合、函數(shù)、類和對象、異常處理、文件及目錄操作、模塊和包、正則表達式、JSON數(shù)據(jù)處理等。l 通過本項目的學習,希望能夠獨立搭建Python開發(fā)環(huán)境,能掌握Python的數(shù)據(jù)結構、流程控制、函數(shù)及類的定義及使用、模塊、文件操作、異常處理、正則表達式、JSON數(shù)據(jù)處理等相關知識,對Python程序開發(fā)有一個初步認識,為后續(xù)的爬蟲學習做好鋪墊。項目2

網(wǎng)頁數(shù)據(jù)采集實戰(zhàn)數(shù)據(jù)采集與處理2023年11月10日星期五掌握了解掌握熟悉學習目標掌握

urllib庫、requests庫的使用12掌握

基本的反爬策略、網(wǎng)頁數(shù)據(jù)的請求方法等熟悉

通用爬蟲工具的使用、爬蟲的基本流程34了解

爬蟲產生的背景、爬蟲的基本概念目錄任務1 利用工具爬取電商網(wǎng)頁任務2 基于urllib庫爬取一個電商網(wǎng)頁任務3 urllib處理發(fā)送GET/POST請求任務4 請求頭偽裝與代理服務器應用任務5 網(wǎng)絡異常處理任務6 基于requests庫爬取電商網(wǎng)頁任務1 利用工具爬取電商網(wǎng)頁任務1 利用工具爬取電商網(wǎng)頁(1)爬蟲的定義:l

網(wǎng)絡爬蟲,又稱為網(wǎng)頁蜘蛛、網(wǎng)絡機器人,是一種按照一定的規(guī)則(爬蟲算法),自動請求互聯(lián)網(wǎng)上的相關網(wǎng)頁并提取頁面中相關數(shù)據(jù)的程序或腳本海量銷售數(shù)據(jù)大數(shù)據(jù)分析啤酒和尿布的關聯(lián)度極高調整銷售策略銷量增加(2)爬蟲產生的背景:l 啤酒和尿布的故事l從互聯(lián)網(wǎng)自有數(shù)據(jù)不夠用時,如何獲取更多的數(shù)據(jù)?任務1 利用工具爬取電商網(wǎng)頁(3)爬蟲的分類l

按使用場景分:通用爬蟲、聚焦爬蟲l

按爬取數(shù)據(jù)的形式分:累積式網(wǎng)絡爬蟲、增量式網(wǎng)絡爬蟲l

按爬取數(shù)據(jù)的存在方式分:表層網(wǎng)絡爬蟲、深層網(wǎng)絡爬蟲通用爬蟲工作原理聚焦爬蟲工作原理任務1 利用工具爬取電商網(wǎng)頁(3)與爬蟲相關的網(wǎng)站文件:l

robots.txt:l robots.txt是網(wǎng)站基于Robots

協(xié)議(網(wǎng)絡爬蟲排除標準,又稱爬蟲協(xié)議、機器人協(xié)議等)制定的爬蟲規(guī)則文本l robots.txt

文件必須放置在站點的根目錄下,而且文件名必須全部小寫l Robots

協(xié)議是一種建議,網(wǎng)絡爬蟲可以選擇不遵守它,

但可能會存在法律風險l

Sitemap.xml:l 文件列出了網(wǎng)站中的網(wǎng)址及每個網(wǎng)址的其他元數(shù)據(jù),以便于爬蟲可以更加智能地爬取網(wǎng)站l 要謹慎對待,注意文件的內容缺失或過期的問題任務1 利用工具爬取電商網(wǎng)頁(4)常用反爬蟲策略:l

設置

User-Agent:l User-agent表示用戶代理,通過User-agent偽裝,可降低被反爬機制檢測到的概率l

使用代理

IP:l 使用多個代理IP,可以降低單個IP地址的訪問量l

降低訪問頻率:l 降低訪問網(wǎng)站的頻率,防止對方從訪問量上認出爬蟲的身份l

驗證碼識別:l 對于某些網(wǎng)站訪問過程中需動態(tài)輸入驗證碼才能繼續(xù)訪問的情況,爬蟲需采用技術識別出正確驗證碼,并能自動填寫,完成驗證任務1 利用工具爬取電商網(wǎng)頁(5)爬蟲的合法性:l

爬蟲所采集的數(shù)據(jù)是指互聯(lián)網(wǎng)上公開的并且可以訪問到的網(wǎng)頁信息,而不是網(wǎng)站的后臺信息(沒有權限訪問),更不是用戶注冊的信息(非公開的)。l

惡意利用爬蟲技術抓取數(shù)據(jù),以獲取不正當競爭的優(yōu)勢,或牟取不法利益的,則可能觸犯法律任務1 利用工具爬取電商網(wǎng)頁(6)基于八爪魚工具爬取數(shù)據(jù)示例l

下載工具,并安裝:任務1 利用工具爬取電商網(wǎng)頁(6)基于八爪魚工具爬取數(shù)據(jù)示例l

打開工具,創(chuàng)建爬蟲任務:任務1 利用工具爬取電商網(wǎng)頁(6)基于八爪魚工具爬取數(shù)據(jù)示例l

任務設置任務1 利用工具爬取電商網(wǎng)頁(6)基于八爪魚工具爬取數(shù)據(jù)示例l

設置數(shù)據(jù)采集規(guī)則:任務1 利用工具爬取電商網(wǎng)頁(6)基于八爪魚工具爬取數(shù)據(jù)示例l

采集規(guī)則設置完成后,保存并開始采集:任務1 利用工具爬取電商網(wǎng)頁(6)基于八爪魚工具爬取數(shù)據(jù)示例l

數(shù)據(jù)自動采集:任務2

基于urllib庫爬取一個電商網(wǎng)頁任務2

基于urllib庫爬取一個電商網(wǎng)頁模塊功能request請求處理模塊,用于打開和讀取URL,可以模擬瀏覽器的一個請求發(fā)起過程error異常處理模塊,為request模塊所引發(fā)的異常定義了異常類parse用于解析

URLrobotparser用于解析

robots.txt

文件(1)urllib庫l

Python自帶的標準庫,直接導入項目中便可使用。主要模塊如下:任務2

基于urllib庫爬取一個電商網(wǎng)頁參數(shù)說明url網(wǎng)頁的URL地址,可以是一個字符串,或一個urllib.request.Request對象data一個對象,包含要發(fā)送到服務器的附加數(shù)據(jù),若不需要發(fā)送數(shù)據(jù)則為

None。當data不為None時,發(fā)送請求的方式需為POSTtimeout可選參數(shù),用于指定阻塞操作(如連接嘗試)的超時時間,單位為秒cafileHTTPS

請求時,指定CA

證書文件capathHTTPS

請求時,指定

CA

證書的路徑cadefault未使用context該參數(shù)若提供,則必須是一個

ssl.SSLContext

實例,用于描述各種

SSL

參數(shù)(2)urllib.request.urlopen():l

Urllib庫的request模塊中用于訪問給定URL的函數(shù),主要參數(shù)說明如下:任務2

基于urllib庫爬取一個電商網(wǎng)頁(3)urllib.request.Request:l

URL

請求對象的抽象類。當使用urlopen()方法發(fā)送一個請求時,可通過該類的對象來添加額外的data參數(shù),自定義請求頭(header)信息等:參數(shù)說明url網(wǎng)頁的URL地址,與urllib.request.urlopen方法中的url參數(shù)一致data與urllib.request.urlopen方法中的data參數(shù)一致,目前唯一用到

data

的只有

HTTP

請求headers一個字典,用于設置request請求頭信息,通常被用于

"偽裝"

User-Agent

標頭值。如果給出了

data參數(shù),則應當包含合適的

Content-Type

頭部信息;若未提供且

data

不是

None,則會把

Content-Type:

application/x-www-form-urlencoded

加入作為默認值origin_req_host發(fā)起初始會話的請求主機,默認值為

"http.cookiejar.request_host(self)

",表示是用戶發(fā)起初始請求的主機名或

IP

地址unverifiable用于標示出請求是否無法驗證method字符串,表示要采用的

HTTP

請求方法,如"GET"、"POST"

等任務2

基于urllib庫爬取一個電商網(wǎng)頁(4)http.client.HTTPResponse:l

使用urlopen()向網(wǎng)站發(fā)送請求時,如果是

HTTP

/

HTTPS請求

URL,urlopen()將返回一個http.client.HTTPResponse

的對象,它提供了提供獲取網(wǎng)站相關響應內容的方法:l read()、readline()、readlines():對響應內容的數(shù)據(jù)讀取操作;l info():獲取遠程服務器返回的頭信息,python3.9后建議用headers代替;l getcode():返回HTTP狀態(tài)碼,python3.9后建議用status代替;l geturl():返回請求的URL,python3.9后建議用url代替(5)基于urllib爬取當當網(wǎng)頁面:任務2

基于urllib庫爬取一個電商網(wǎng)頁任務3

urllib處理發(fā)送GET/POST請求任務3

urllib處理發(fā)送GET/POST請求(1)HTTP請求l

GET請求:用于向服務器請求數(shù)據(jù),直接在URL中附加上所有請求參數(shù)l

POST請求:通常用于向服務器提交數(shù)據(jù),它的請求參數(shù)或提交的數(shù)據(jù)不會出現(xiàn)在URL地址中,是一種比較主流也比較安全的數(shù)據(jù)傳遞方式l

PUT請求:請求服務器存儲一個資源,通常要指定存儲的位置l

DELETE請求:請求服務器刪除一個資源l

HEAD請求:請求獲取對應的HTTP報頭信息l

OPTIONS請求:可以獲得當前URL所支持的請求類型任務3

urllib處理發(fā)送GET/POST請求(2)GET請求l

GET請求一般用于向服務器請求數(shù)據(jù),請求的參數(shù)通過URL地址傳遞到服務器,即可以直接在URL中寫上要傳遞的參數(shù),也可以由表單進行傳遞l

GET請求要傳遞的參數(shù)跟在頁面地址中的問號(?)后面,每個參數(shù)以“參數(shù)名=值”的格式表示,多個參數(shù)之間用符號

&

拼接/?key=%C5%C0%B3%E6&act=input任務3

urllib處理發(fā)送GET/POST請求(3)URL編解碼l

GET請求的參數(shù)包含中文或其他特殊字符時,需要對這些參數(shù)進行URL編碼,可通過

urllib.parse.urlencode()方法實現(xiàn)l

與URL編碼類似,也可通過

urllib.parse.unquote()方法進行URL解碼URL編碼示例URL解碼示例任務3

urllib處理發(fā)送GET/POST請求(4)POST請求l

POST請求通過表單的方式向服務器提交數(shù)據(jù),它的請求參數(shù)或提交的數(shù)據(jù)不會出現(xiàn)URL地址中l(wèi)

當urlopen()函數(shù)的data參數(shù)不為None(空)時,則

HTTP請求的方式應為POST方式通過Chrome瀏覽器的DevTools查看HTTP請求方式任務3

urllib處理發(fā)送GET/POST請求(5)基于urllib庫的POST請求實現(xiàn)思路:l

設置請求的URL網(wǎng)址l

構建表單數(shù)據(jù),并使用urllib.parse.urlencode()對數(shù)據(jù)進行編碼l

創(chuàng)建Request對象,參數(shù)包括URL地址和要傳遞的數(shù)據(jù)l

使用addheader()添加頭信息,模擬瀏覽器進行爬取l

使用urllib.request.urlopen()打開對應的Request對象,完成信息的傳遞l

后續(xù)處理,如讀取網(wǎng)頁內容、將從網(wǎng)頁中提取到的數(shù)據(jù)寫入文件等操作任務3

urllib處理發(fā)送GET/POST請求(6)urllib庫發(fā)送GET請求示例任務3

urllib處理發(fā)送GET/POST請求(7)urllib庫發(fā)送POST請求示例注:示例中的data、headers變量中的相關數(shù)據(jù)須根據(jù)自已的瀏覽器調度工具查看到的相關內容做相應修改。任務4 請求頭偽裝與代理服務器應用任務4 請求頭偽裝與代理服務器應用(1)請求頭偽裝:加入特定的Headers請求頭信息,將爬蟲發(fā)出的請求偽裝成一個從瀏覽器發(fā)出請求l

通過urllib.request.Request進行設置l

通過Request.add_header()來添加請求頭信息任務4請求頭偽裝與代理服務器應用(2)代理服務器:l

urlopen()方法不支持代理、Cookies等HTTP/HTTPS高級功能,在urllib庫下使用代理服務器,需要通過urllib.request中的OpenerDirector類的對象來實現(xiàn),步驟如下:l

使用相關的Handler處理器創(chuàng)建特定功能的處理器對象l

通過build_opener()方法使用Handler對象創(chuàng)建自定義的opener對象l

使用自定義的opener對象,調用open()方法發(fā)送請求(2)代理服務器示例:任務4請求頭偽裝與代理服務器應用(3)豆瓣電影Top

250排行榜爬取示例1任務4請求頭偽裝與代理服務器應用(3)豆瓣電影Top

250排行榜爬取示例2任務4請求頭偽裝與代理服務器應用(3)豆瓣電影Top

250排行榜爬取示例3任務4請求頭偽裝與代理服務器應用(3)豆瓣電影Top

250排行榜爬取示例4任務4請求頭偽裝與代理服務器應用(3)豆瓣電影Top

250排行榜爬取示例5任務4請求頭偽裝與代理服務器應用任務5 網(wǎng)絡異常處理任務5 網(wǎng)絡異常處理(1)URLError:l

繼承自Python的OSError,定義了三個參數(shù):args、reason、filenamel

URLError產生的原因:l 沒有連接網(wǎng)絡l 服務器連接失敗l 找不到指定的服務器URLError示例任務5 網(wǎng)絡異常處理(2)HTTPError:l

繼承自URLError,它的對象擁有一個整型的屬性code,表示服務器返回的錯誤代碼,如:404表示請求的頁面不存在l

urllib.request.urlopen()方法請求頁面時,如果返回的響應碼表示無法處理請求內容時,urlopen()會拋出HTTPError任務5 網(wǎng)絡異常處理(1)HTTPError示例:任務6 基于requests庫爬取電商網(wǎng)頁任務6 基于requests庫爬取電商網(wǎng)頁(1)Requests:l

Python第三方庫,使用前需先安裝l

基于urllib的基礎上進行了高度的封裝,提供了比urllib更豐富的功能,更方便的調用方式任務6 基于requests庫爬取電商網(wǎng)頁(2)requests庫的常用請求函數(shù):l

request()函數(shù)是最基礎的函數(shù),其它函數(shù)是對request()函數(shù)的快捷封裝l

request(method,url,**kwargs)requests庫的常用請求函數(shù)方法說明requsts.request()構造一個請求,最基本的HTTP請求實現(xiàn)方法requsts.get()獲取網(wǎng)頁,對應HTTP中的GET方法requsts.post()向網(wǎng)頁提交信息,對應HTTP中的POST方法requsts.head()獲取網(wǎng)頁的頭信息,對應HTTP中的HEAD方法requsts.put()向網(wǎng)頁提交put方法,對應HTTP中的PUT方法requsts.patch()向網(wǎng)頁提交局部修改的請求,對應HTTP中的PATCH方法requsts.delete()向網(wǎng)頁提交刪除請求,對應HTTP中的DELETE方法任務6 基于requests庫爬取電商網(wǎng)頁(3)requests.Request:l

請求對象,用于將一個請求發(fā)送到服務器l

Request對象的生命周期針對一個客戶端請求,一旦請求發(fā)送完畢,該請求包含的內容就會被釋放掉l

Request對象的請求完成后會將響應結果封裝在Response類的響應對象中返回,其中包含服務器對HTTP請求的響應。任務6 基于requests庫爬取電商網(wǎng)頁(4)requests.Session:l

表示請求會話,提供了持久性、連接池等相關配置l

Session類的對象可以跨越多個頁面,它的生命周期同樣針對的是一個客戶端,當關閉這個客戶端的瀏覽器時,只要是在預先設置的會話周期內,這個會話包含的內容會一直存在,不會被馬上釋放掉任務6 基于requests庫爬取電商網(wǎng)頁(5)requests.Response:l

響應對象,包含服務器對HITP請求的響應l

當request()函數(shù)得到服務器返回的響應后,會創(chuàng)建并返回一個Response類對象,該對象包含了服務器返回的所有信息,也包括原來創(chuàng)建的Request對象。Response對象的常用屬性屬性說明status_codeHTTP請求返回的狀態(tài)碼,200表示成功textHTTP響應的字符串形式,即url對應的網(wǎng)頁內容encoding從HTTP

header中獲取的響應內容編碼方式apparent_encoding從內容中推斷的響應內容編碼方式(備選)contentHTTP響應內容的二進制形式任務6 基于requests庫爬取電商網(wǎng)頁(6)Requests庫中的異常類:異常類說明requests.ConnectionError網(wǎng)絡連接異常,如DNS查詢失敗,拒絕連接等requests.HTTPErrorHTTP錯誤異常requests.URLRequiredURL缺失異常requests.TooManyRedirects超過最大重定向次數(shù),產生重定向異常requests.ConnectTimeout連接遠程服務器超時異常requests.Timeout請求URL超時異常任務6 基于requests庫爬取電商網(wǎng)頁(7)豆瓣電影排行版TOP250的數(shù)據(jù)爬取小結l 在本項目中主要介紹了爬蟲的基本概念及兩個爬蟲請求的常用庫:包括爬蟲的概念、產生背景、爬蟲的分類、爬蟲的合法性、爬蟲的基本流程、通用爬蟲工具的使用、基于urllib庫及requests庫的網(wǎng)頁數(shù)據(jù)采集、基本的反爬策略應用等。l 通過本項目的學習,希望能夠了解爬蟲的相關概念,能基于urllib庫及requests庫實現(xiàn)對特定網(wǎng)頁的采集,能掌握基本的反爬策略,能在爬蟲程序中進行請求頭偽裝及代理服務器設置實現(xiàn)對網(wǎng)頁的爬取,為后續(xù)的爬蟲學習做好鋪墊。任務3.4.1

Beautiful

Soup數(shù)據(jù)采集與處理任務3.4.1

Beautiful

SoupBeautifulSoup庫l

是一個python的HTML或XML的第三方解析庫,使用前需先安裝:pipinstall

beautifulsoup4l

它將復雜HTML文檔轉換成一個樹形結構,每個節(jié)點都是Python對象,所有對象可以歸納為4種:bs4.element.Tag類:表示標簽,它有兩個非常重要的屬性:name,表示標簽名;attributes,表示標簽的屬性,可通過字典的引用方式或“.”成員引用符的方式來引用bs4.element.NavigableString類:表示HTML中標簽的文本(非屬性字符串)bs4.BeautifulSoup類:表示一個文檔的全部內容。大部分時候,可以把它當作

Tag

對象,支持遍歷文檔樹和搜索文檔樹的大部分方法bs4.element.Comment類:表示文檔內的注釋部分(2)Beautiful

Soup4網(wǎng)頁數(shù)據(jù)解析流程任務3.4.1

Beautiful

Soup(2.1)BeautifulSoup對象l

使用Beautiful

Soup進行網(wǎng)頁數(shù)據(jù)解析,首先要創(chuàng)建一個BeatutifulSoup類的對象,其構造方法的參數(shù)說明如下:說明markup待解析的HTML字符串或類文件對象features用于指定解析器,

可以是特定解析器的名稱(“

l

xml

”,“

l

xml

-

x

m

l

、“html.parser

”或“html5lib”),或者是要使用的標記類型(“html”、“html5”、“xml”)builder使用自定義的TreeBuilder子類替換features中的默認實現(xiàn)parse_only指定文檔中需解析的部分,其他未指定部分將會被忽略from_encoding指定要使用的編碼格式exclude_encodings指定要排除的編碼格式任務3.4.1

Beautiful

Soup(2.2)查找目標節(jié)點l

Beautiful

Soup定義了很多搜索節(jié)點的方法,如find_XXX()系列方法、select()方法[可使用CSS選擇器的語法]等、參數(shù)說明name指定要查找的標簽名,如果傳入的是字符串,查找與字符串完全匹配的內容;如果傳入的是正則表達式,則通過re模塊的match()函數(shù)進行匹配;如果傳入一個列表,則會返回與列表中任一元素相匹配的內容。attrs字典結構的過濾器,用于設置查找時的過濾條件recursive指定是否檢索當前節(jié)點的所有子孫節(jié)點,如果為False,則只檢索當前節(jié)點的直接子節(jié)點string搜索文檔中的字符串內容。與

name

參數(shù)的可選值一樣,string

參數(shù)也接受字符串、正則表達式、

列表Truelimit限制返回結果的數(shù)量,一旦搜索到結果的數(shù)量達到了limit的限制時,就會停止搜索kwargs關鍵字參數(shù),如果某個指定名字的參數(shù)不是方法中內置的參數(shù)名,那么在進行搜索時,會把該參數(shù)當作指定名稱的標簽中的屬性來fin搜d索_X。XX()系列方法常用參數(shù)任務3.4.1

Beautiful

Soup(2.3)解析信息l

通過相關方法獲取到了目標節(jié)點對象后,便可通過該對象的相關屬性或方法來獲取相應的信息:如果一個節(jié)點對象只有一個

NavigableString

類型子節(jié)點,那么這個節(jié)點對象可以使用.string方法獲取子節(jié)點;如果一個節(jié)點對象包含了多個子節(jié)點,則節(jié)點對象就無法確定

.string

方法應該調用哪個子節(jié)點的內容,這種情況下,

.string

的輸出結果是

None

;如果一個節(jié)點對象中包含多個字符串,可以使用

.strings

.stripped_strings來循環(huán)獲取,.stripped_strings

可以去除多余空白內容;如果只想得到一個節(jié)點對中包含的文本內容,則可以使用

get_text()

方法,該方法獲取到節(jié)點中包含的所有文本內容,包括子孫節(jié)點中的內容,并將結果作為Unicode字符串返回。任務3.4.1

Beautiful

Soup項目4 并發(fā)技術實戰(zhàn)數(shù)據(jù)采集與處理2023年11月10日星期五掌握了解掌握熟悉學習目標掌握

多線程技術、基于multiprocessing庫的多進程并發(fā)編程12掌握

多線程技術、協(xié)程技術、基于threading、gevent的并發(fā)編程熟悉

并發(fā)爬蟲的開發(fā)34了解

并發(fā)原理、Python實現(xiàn)并發(fā)的方式目錄任務1 基于進程的并發(fā)爬蟲任務2 基于queue模塊的多線程爬蟲任務3 基于協(xié)程的并發(fā)爬蟲任務4 歷史天氣并發(fā)爬取任務1 基于進程的并發(fā)爬蟲任務1 基于進程的并發(fā)爬蟲(1)并發(fā)原理l

用戶在同一時間內可以同時運行多個應用程序稱為多任務處理,每個應用程序被稱作一個任務l

多任務處理的兩種形式:并發(fā)和并行并行:兩個或者多個任務在同一時刻發(fā)生并發(fā):兩個或者多個任務在同一時間間隔內發(fā)生任務1 基于進程的并發(fā)爬蟲(2)進程(Process)l

進程是一個實體。它是有特定功能的程序在一個數(shù)據(jù)集上一次動態(tài)執(zhí)行的過程,它是系統(tǒng)進行資源分配的基本單位l

每一個進程都有自己的地址空間,進程占據(jù)的內存空間由控制塊、程序段和數(shù)據(jù)段三個部分組成:控制塊(Proscessing

Control

Block,PCB):描述進程的數(shù)據(jù)結構,(是進程在計算機中的唯一標識(含有標識信息),計算機通過查看PCB來感知進程的存在。程序段:用于存放程序執(zhí)行代碼的一塊內存區(qū)域。數(shù)據(jù)段:存儲變量和進程執(zhí)行期間產生的中間數(shù)據(jù)及最終數(shù)據(jù)的一塊內存區(qū)域。任務1 基于進程的并發(fā)爬蟲(3)進程的生命周期任務1 基于進程的并發(fā)爬蟲multiprocessing模塊l

Python用于實現(xiàn)多進程并發(fā)編程的標準模塊l

模塊中的Process類用于創(chuàng)建進程對象,當進程對象創(chuàng)建后,通過調用start()方法來啟動進程,構造方法如下:

init

(self,group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)參數(shù)說明如下:group:必須為None,它僅用于兼容

threading.Thread;target:由

run()

方法調用的可調用對象,表示子進程的功能函數(shù),用于為子進程分派任務;?

name:表示當前進程的名稱。若沒有指定,默認為Process-N,N為從1開始遞增的整數(shù);?

args:以元組形式傳遞給target指定函數(shù)的位置參數(shù);kwargs:以字典形式傳遞給target指定函數(shù)的關鍵字參數(shù);daemon:表示是否將進程設為守護進程(在后臺運行的一類特殊進程,用于執(zhí)行特定的系統(tǒng)任務)。如果為默認值(

None),則表示從父進程中繼承該標志位。任務1 基于進程的并發(fā)爬蟲(5)

Process對象的常用方法方法說明start()啟動子進程,等待CPU調度is_alive()判斷進程實例是否還有效join(timeout=None)在timeout秒內,等待子進程結束;若為timeout為默認值None,則表示一直等待terminate

()結束當前進程,進程的后代進程將不會被終止kill

()同terminate()run()在父進程中直接運行target參數(shù)引用的可執(zhí)行對象,不會啟動子進程close()關閉Process對象,釋放所有資源任務1 基于進程的并發(fā)爬蟲(6)基于Process類的多進程并發(fā)編程示例通過Process類的子類創(chuàng)建多進程通過Process類創(chuàng)建多進程任務1 基于進程的并發(fā)爬蟲(7)進程池(Pool類)l

若需要創(chuàng)建大量進程時,手動創(chuàng)建的方式不僅低效繁瑣,而且工作量巨大。另外,進程的創(chuàng)建、運行、銷毀均會增加任務的額外開銷,降低多進程任務的執(zhí)行效率。此時,可使用multiprocessing模塊中提供的Pool(進程池)類,批量創(chuàng)建并管理子進程。Pool類的構造方法如下:

init

(self,processes=None,initializer=None,initargs=(),maxtasksperchild=None,

context=None)參數(shù)說明如下:processes:指定進程池中并行執(zhí)行的子進程數(shù)量。若processes參數(shù)設為None,則會使用os.cpu_count()返回的CPU核心數(shù)initializer:若不為

None,則每個工作進程將會在啟動時調用

initializer(*initargs)initargs:傳遞給initializer的參數(shù)maxtasksperchild,一個工作進程在它退出或被一個新的工作進程代替之前能完成的任務數(shù)量,以釋放閑置資源context,用于設定工作進程啟動時的上下文任務1 基于進程的并發(fā)爬蟲(7)Pool類對象的常用方法方法說明apply(func,args,

kwds)以阻塞方式調用func函數(shù),args、kwds是分別以元組或字典方式傳遞給func函數(shù)的參數(shù)apply_async(func,args,kwds,callback=None,

error_callback=None)以非阻塞方式調用func函數(shù),args、kwds是分別以元組或字典方式傳遞給func函數(shù)的參數(shù),callback、error_callback分別是回調函數(shù)及錯誤回調函數(shù)map(func,iterable,chunksize=None)以阻塞方式將func函數(shù)應用到interable可迭代對象的每個元素上,可迭代對象按chunksize分為多個任務提交給子進程處理。map_async(func,iterable,chunksize=None,

callback=None,error_callback=None)以非阻塞方式將func函數(shù)應用到interable可迭代對象的每個元素上,可迭代對象按chunksize分為多個任務提交給子進程處理。callback、error_callback分別是回調函數(shù)及錯誤回調函數(shù)close()關閉Pool對象,不再接受新任務terminate()不管任務是否完成,立即終止Pool對象join()在close()方法后使用,阻塞主進程,直到子進程全部結束任務1 基于進程的并發(fā)爬蟲(7)基于Pool類的多進程并發(fā)編程示例任務1 基于進程的并發(fā)爬蟲(8)進程間的通信l

進程擁有自己獨立的用戶空間(代碼+數(shù)據(jù)),一般情況下,無法與其他進程共享l

multiprocessing模塊中提供了Queue(隊列)類和Pipe(管道)類來實現(xiàn)進程間的通信:Queue(隊列)類:用于創(chuàng)建和管理存儲共享資源的先入先出隊列Pipe(管道)類:由操作系統(tǒng)內核提供的高效的進程間通信方式,從通信效率上來說,管道比隊列要更加高效任務1 基于進程的并發(fā)爬蟲(8)進程間通信示例基于Pipe的進程通信示例基于Queue的進程通信示例任務1 基于進程的并發(fā)爬蟲(8)基于多進程并發(fā)爬蟲采集豆瓣電影Top

250排行榜任務1 基于進程的并發(fā)爬蟲(8)基于多進程并發(fā)爬蟲采集豆瓣電影Top

250排行榜任務1 基于進程的并發(fā)爬蟲(8)基于多進程并發(fā)爬蟲采集豆瓣電影Top

250排行榜任務2 基于queue模塊的多線程爬蟲任務2 基于queue模塊的多線程爬蟲(1)線程(Thread)l

線程是操作系統(tǒng)執(zhí)行運算調度的最小單位。線程不能獨立存在,必須包含在某個進程中,是進程的實際運行單位l

線程由線程ID、當前指令指針(PC)、寄存器集合和堆棧組成,它不能獨立擁有系統(tǒng)資源,同一進程中的多個線程將共享該進程中的全部系統(tǒng)資源,因此線程間的數(shù)據(jù)通信要比進程間的數(shù)據(jù)通信更容易、高效l

同一進程內的每個線程有自己的獨立堆棧和寄存器等,在線程切換時,只需保存和恢復自己的堆棧和寄存器,無須涉及進程的內存空間,因此線程的創(chuàng)建、調度和銷毀工作比進程要高效,需要的計算資源也比進程要少任務2 基于queue模塊的多線程爬蟲threading模塊l

Python用于實現(xiàn)多線程并發(fā)編程的標準模塊l

模塊中的Thread類用于創(chuàng)建線程對象,線程對象創(chuàng)建后,通過調用start()方法來啟動線程,構造方法(與進程的類似)如下:

init

(self,group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)參數(shù)說明如下:group:默認為None,用于向后兼容ThreadGroup;target:由

run()

方法調用的可調用對象,表示子線程的功能函數(shù),用于為子線程分派任務;name:表示當前線程的名稱。若沒有指定,默認為Thread-N,N為從1開始遞增的整數(shù);args:以元組形式傳遞給target指定函數(shù)的位置參數(shù);kwargs:以字典形式傳遞給target指定函數(shù)的關鍵字參數(shù);daemon:表示是否將進程設為守護線程。如果為默認值(

None),則表示從父線程中繼承該標志位。任務2 基于queue模塊的多線程爬蟲(3)

Thread對象的常用屬性和方法方法說明start()啟動子線程,等待CPU調度is_alive()判斷進程實例是否還有效join(timeout=None)在timeout秒內,等待子線程結束;若為timeout為默認值None,則表示一直等待getName()獲取線程的名字run()直接運行target參數(shù)引用的可執(zhí)行對象屬性說明name線程名字,由實例化參數(shù)name指定ident線程標識符daemon是否是一個daemon線程,若不設置,默認值為FalseThread對象的常用屬性Thread對象的常用方法任務2 基于queue模塊的多線程爬蟲(4)線程同步l

多個線程訪問同一共享數(shù)據(jù),可能會引發(fā)競爭問題,這種多個線程同時訪問共享數(shù)據(jù)造成的混亂情況,稱為多線程數(shù)據(jù)競爭l

為了解決多線程數(shù)據(jù)競爭問題,需引入線程同步機制,以保證多個線程可以有序的訪問共享數(shù)據(jù)l

threading模塊提供了多種線程同步機制:Lock、RLock、Semaphore、Condition、Event等。其基本原理均是給共享數(shù)據(jù)“加鎖”任務2 基于queue模塊的多線程爬蟲(4)線程同步示例任務2 基于queue模塊的多線程爬蟲(5)基于多線程并發(fā)爬蟲采集豆瓣電影Top

250排行榜任務3 基于協(xié)程的并發(fā)爬蟲任務3 基于協(xié)程的并發(fā)爬蟲(1)協(xié)程(coroutine)l

是一種用戶態(tài)的輕量級線程,也稱為“輕量級線程”、“微線程”、“纖程(fiber)”等l

由單一線程內部發(fā)出控制信號進行調度,而非受到操作系統(tǒng)管理,因此協(xié)程沒有切換開銷和同步鎖機制,具有極高的執(zhí)行效率l

協(xié)程擁有自己的寄存器上下文和棧,它的調度完全由用戶控制,基本沒有內核切換的開銷,可以不加鎖的訪問全局變量,上下文的切換非??靗

Python是提供原生協(xié)程支持的語言之一l

gevent是一個基于協(xié)程的Python第三方庫,使用前需先安裝,常用方法:gevent.spawn():創(chuàng)建并啟動協(xié)程; gevent.joinall():等待所有協(xié)程執(zhí)行完畢任務3 基于協(xié)程的并發(fā)爬蟲(2)進程、線程、協(xié)程的不同特點l

一個線程可以擁有多個協(xié)程,一個進程也可以單獨擁有多個協(xié)程l

線程和進程都是同步機制,而協(xié)程則是異步機制l

協(xié)程能保留上一次調用時的狀態(tài),每次重入時,就相當于進入上一次調用的狀態(tài)l

單進程下協(xié)程和多線程區(qū)別不大,相較之下,協(xié)程更省資源、效率更高、更安全l

協(xié)程的切換不像多線程調度那樣耗費資源,所以不用嚴格限制協(xié)程的數(shù)量任務3 基于協(xié)程的并發(fā)爬蟲(3)基于協(xié)程的并發(fā)爬蟲采集豆瓣電影Top

250排行榜任務4 歷史天氣并發(fā)爬取任務4 歷史天氣并發(fā)爬?。?)CPU密集型與I/O密集型l

CPU

密集型(CPU-bound):CPU

密集型也叫做計算密集型,此類任務主要消耗CPU資源。I/O操作在很短時間內就可以完成,其耗時對任務的完成影響不大,任務所需的資源主要集中在CPU的大量計算和處理上,特點是CPU

占用率相當高l

I/O密集型(I/O

bound):此類任務的特點是CPU消耗很少,由于I/O讀寫的速度遠遠低于CPU和內存的速度,任務運行時大部分的狀況是CPU

在等I/O(硬盤,內存)讀寫操作的完成,CPU

占用率較低,對于I/O密集型任務,在一定的任務總量下,任務越多,CPU效率越高。任務4 歷史天氣并發(fā)爬?。?)多進程并發(fā),多線程并發(fā)、協(xié)程并發(fā)的對比l

多進程并發(fā):可以利用多核CPU

進行并行計算,是真正的并發(fā);缺點是:占用的資源最多,可以啟動的數(shù)目比線程要少。適用于CPU密集型計算l

多線程并發(fā):與多進程相比,更加輕量級,占用資源較少;缺點是:與多進程并發(fā)技術相比,多線程并發(fā)技術只能夠并發(fā)執(zhí)行,不能夠利用多CPU;與協(xié)程技術相比,線程的啟動數(shù)量有限,占用內存資源,有線程切換開銷。適用于I/O密集行型計算l

協(xié)程并發(fā):內存開銷最小,啟動協(xié)程數(shù)目最多;缺點是:支持的庫有限制,代碼實現(xiàn)復雜。適用于I/O

密集型計算任務4 歷史天氣并發(fā)爬取(2)基于多線程的歷史天氣并發(fā)爬取l

頁面分析:歷史天氣預報查詢頁面任務4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l

頁面分析:具體月份的歷史天氣預報頁面任務4 歷史天氣并發(fā)爬取(2)基于多線程的歷史天氣并發(fā)爬取l

數(shù)據(jù)定位:各月份的歷史天氣預報頁面鏈接任務4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l

數(shù)據(jù)定位:具體的歷史天氣預報數(shù)據(jù)任務4 歷史天氣并發(fā)爬取(2)基于多線程的歷史天氣并發(fā)爬取l

代碼實現(xiàn)1:任務4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l

代碼實現(xiàn)2:任務4 歷史天氣并發(fā)爬取(2)基于多線程的歷史天氣并發(fā)爬取l

代碼實現(xiàn)3:任務4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l

代碼實現(xiàn)4:任務4 歷史天氣并發(fā)爬?。?)基于多線程的歷史天氣并發(fā)爬取l

爬蟲代碼運行時截圖:小結l 在本項目中主要介紹了基于Pyth

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論