實(shí)現(xiàn)較高程度的自動(dòng)化爬蟲工作,除了較靈活巧妙的邏輯算法外,關(guān)鍵的還是要依賴適應(yīng)自動(dòng)化條件的模式配置。沒有錯(cuò),確實(shí)是需要把自動(dòng)爬取任務(wù)當(dāng)作一項(xiàng)“服務(wù)“看待。(此處省略兩三百百字,因Markdown bug被吞)
現(xiàn)在來(lái)看如何通過優(yōu)化配置而簡(jiǎn)化代碼提高可維護(hù)性和健壯性的。使用過Selenium的應(yīng)該知道,定位元素Element的方法只有幾種,如定位id、class、tagname、css等。這種固定的規(guī)律,使得配置自動(dòng)化成為可能。為了簡(jiǎn)化案例的描述,使之更容易理解。這里只選取其中id和class兩種常用的定位方法來(lái)加以說明。
案例:自動(dòng)爬取配置的新聞網(wǎng)站特定欄目焦點(diǎn)內(nèi)容
通常新聞資訊網(wǎng)站的欄目焦點(diǎn)內(nèi)容出現(xiàn)的方式是比較規(guī)律的。因此,可以較為容易的通過定位特定HTML標(biāo)簽獲得目標(biāo)集。那么,如何實(shí)現(xiàn)自動(dòng)化配置?
設(shè)計(jì)模式中,有個(gè)比較流行的MVC模式。類似地,為何不將解析任務(wù)和目標(biāo)體系結(jié)構(gòu)的描述工作進(jìn)行分離?按照一定的協(xié)議,將多個(gè)可變目標(biāo)體系結(jié)構(gòu)封裝成規(guī)律有序的數(shù)據(jù)結(jié)構(gòu)。如此,因特網(wǎng)多變因素而引起的問題,就被單獨(dú)分離出來(lái)處理變得可控。一旦目標(biāo)體系結(jié)構(gòu)發(fā)生變動(dòng),只需修改對(duì)應(yīng)配置,而無(wú)需反復(fù)“推翻式”修改代碼。原本嚴(yán)重依賴目標(biāo)體系結(jié)構(gòu)的解析處理代碼變得“健壯”。
假設(shè),將目標(biāo)訪問網(wǎng)址、定位方法和解析規(guī)則編撰為字典。爬取目標(biāo)時(shí),僅需從配置的字典讀取對(duì)應(yīng)規(guī)則,即可對(duì)目標(biāo)開展訪問和解析處理工作。目標(biāo)的HTML結(jié)構(gòu)發(fā)生變動(dòng),也是修改配置即可。就相當(dāng)與MVC里的M模型(Model)和C控制器(Control)的相對(duì)獨(dú)立、互不干擾的關(guān)系。真正實(shí)現(xiàn)優(yōu)化配置實(shí)現(xiàn)自動(dòng)化的目標(biāo)。
實(shí)現(xiàn)代碼:
class MyModule:
def __init__(self):
self.bys={'id':0, 'class':1}
self.urls={'guancha.cn':{'url':'https://www.guancha.cn', 'by':'class', 'target':'index-content'},
'thepaper.cn':{'url':'https://www.thepaper.cn', 'by':'id', 'target':'masonryContent'},
'news.qq.com':{'url':'https://news.qq.com', 'by':'id', 'target':'List', 'rule':'//ul:class=list//li//a'},
'youth.cn':{'url':'http://www.youth.cn', 'by':'class', 'target':'youth-left'},
'news.cnblogs.com':{'url':'https://news.cnblogs.com', 'by':'id', 'target':'news_list', 'rule':'//div:class=news_block//div:class=content//h2//a'},
'ycwb.com':{'url':'http://www.ycwb.com', 'by':'class', 'target':'ywnews'}
}
def __delete__(self):
self.urls=None
def getmodules(self):
return self.urls
def getbys(self):
return self.bys
modules=MyModule()