1.基本的爬蟲架構(gòu)主要包括調(diào)度器,URL管理器,網(wǎng)頁下載器,網(wǎng)頁解析器這些部分,實現(xiàn)價值數(shù)據(jù)的獲取。 1.1 URL管理器對待抓取的URL集合和已抓取的URL集合進行管理,避免重復(fù)抓取和循環(huán)抓取。 主要有5個部分的功能,判斷待添加URL是否在容器中、添加新的URL到待爬取集合、判斷是否還有待爬取集合、獲取待爬取URL、將URL從待爬取的集合移動到已爬取集合中。 分類:Python內(nèi)存(待爬取和已爬取兩個set()集合),關(guān)系數(shù)據(jù)庫(eg:MySQL,建表來實現(xiàn)存儲),緩存數(shù)據(jù)庫(eg:redis,支持set數(shù)據(jù)結(jié)構(gòu))。大型公司一般采用高效的緩存數(shù)據(jù)庫作為URL管理器,小型的或想要永久保存的采用關(guān)系數(shù)據(jù)庫作為URL管理器,小型的不需要保存的可以直接存儲在Python內(nèi)存中。 1.2 網(wǎng)頁下載器(爬蟲的核心組件)將互聯(lián)網(wǎng)上URL對應(yīng)的網(wǎng)頁下載到本地。 主要功能有:將待獲取URL對應(yīng)的互聯(lián)網(wǎng)網(wǎng)頁以HTML的形式下載到本地,并以本地文件或內(nèi)存字符串的形式進行存儲,以便后續(xù)的處理。 分類:urllib2(Python官方基礎(chǔ)模塊),requests(Python的第三方插件)等。 1.2.1 urllib2下載網(wǎng)頁的方法 a.使用urlopen函數(shù)直接獲取網(wǎng)頁信息 具體代碼: b.添加data(用戶需要輸入的數(shù)據(jù)),http header數(shù)據(jù),結(jié)合urllib2的Request和urlopen函數(shù)來獲取網(wǎng)頁信息 具體代碼: c.添加特殊情景的處理器,根據(jù)不同的URL選擇不同的處理器(eg:HTTPCookieProcessor、ProxyHandler、HTTPSHandler、HTTPRedirectHandler),綜合使用urllib2的build_opener、install_opener和urlopen函數(shù)來獲取網(wǎng)頁信息。 具體代碼(以Cookie為例): 1.3 網(wǎng)頁解析器從網(wǎng)頁中提取有價值數(shù)據(jù)的工具。 主要功能有:提取價值數(shù)據(jù),提供新的待爬取的URL列表。 分類:模糊匹配(正則表達式),結(jié)構(gòu)化解析(html.parser,Beautiful Soup第三方插件,lxml)。其中Beautiful Soup這個第三方插件可以使用html.parser或lxml作為解析器,功能較強大。 1.3.1 結(jié)構(gòu)化解析 將整個網(wǎng)頁文檔加載為一個DOM(Document Object Model文檔對象模型)樹。 1.3.2 Beautiful Soup網(wǎng)頁解析語法 a.根據(jù)下載的HTML網(wǎng)頁,創(chuàng)建BeautifulSoup對象。此時即將整個網(wǎng)頁文檔字符串下載為一個DOM樹。 b.根據(jù)DOM樹進行節(jié)點的搜索,對應(yīng)的方法有find_all(搜索出所有滿足要求的節(jié)點)和find(搜索出第一個滿足要求的節(jié)點),這兩種方法的參數(shù)設(shè)置相同,分別為name,attrs,string,分別對應(yīng)為名稱、屬性、文字,并依據(jù)這三種信息進行搜索。 c.在獲取節(jié)點后,我們可以對節(jié)點的名稱、屬性、文字等進行解析,訪問節(jié)點信息。 2.運行流程 |
|