基礎(chǔ)爬蟲(chóng)框架


框架主要由5大模塊構(gòu)成京革,分別為爬蟲(chóng)調(diào)度器页衙,URL管理器区转,HTML下載器HTML解析器瞻润,數(shù)據(jù)儲(chǔ)存器喘垂。

  1. 爬蟲(chóng)調(diào)度器:負(fù)責(zé)統(tǒng)籌其它四個(gè)模塊的協(xié)調(diào)工作。
  2. URL管理器:維護(hù)已爬取的URL集合和未爬取的URL集合绍撞,提供獲取新URL的鏈接接口正勒。
  3. HTML下載器:從URL管理器中獲取未爬取的URL鏈接并下載HTML頁(yè)面。
  4. HTML解析器:從HTML下載器獲取已經(jīng)下載的HTML頁(yè)面傻铣,解析出新的URL鏈接交給URL管理器章贞,解析出有效數(shù)據(jù)交給數(shù)據(jù)儲(chǔ)存器。
  5. 數(shù)據(jù)儲(chǔ)存期:把HTML解析器得到的數(shù)據(jù)通過(guò)文件或數(shù)據(jù)庫(kù)的形式儲(chǔ)存起來(lái)非洲。

URL管理器

主要包括兩個(gè)變量鸭限,一個(gè)是已爬取的URL集合就谜, 另一個(gè)是未爬取的。用set類型來(lái)去重里覆,防止鏈接重復(fù)爬取丧荐。大型成熟的爬蟲(chóng)基本上采用緩存數(shù)據(jù)庫(kù)去重的方法,由于本次的爬蟲(chóng)爬取數(shù)量小喧枷,所以直接用Python中set內(nèi)存去重的方法虹统。

class UrlManager(object):
    
    #初始化屬性
    def __init__(self):
        self.new_urls = set()    #未爬取的集合
        self.old_urls = set()    #已爬取的集合
    
    #判斷是否還有未爬取的URL
    def has_new_url(self):
        return self.new_url_size() !=0    #返回一個(gè)Bool值
    
    #獲取一個(gè)未爬取的URL,并將其加到已爬取的集合中去
    def get_new_url(self):
        new_url = self.new_urls.pop()    #pop的返回值就是被刪除的目標(biāo)
        self.old_urls.add(new_url)
        return new_url
    
    #增加一個(gè)URL鏈接到未爬取的集合中
    def add_new_url(self,url):
        if url:
            if url not in self.new_urls and url not in self.old_urls:
                self.new_urls.add(url)
    
    #增加一個(gè)URL集合到未爬取的集合中
    def add_new_urls(self,urls):
        if urls:
            for url in urls:
                self.add_new_url(url)
    
    #返回未爬取的URL數(shù)量
    def new_url_size(self):
        return len(self.new_urls)
    
    #返回已爬取的URL數(shù)量
    def old_url_size(self):
        return len(self.old_urls)

HTML下載器

HTML下載器用來(lái)下載網(wǎng)頁(yè)隧甚,只需要實(shí)現(xiàn)一個(gè)接口口:download(url)车荔,比較簡(jiǎn)單。

import requests

class HtmlDownloader(object):
    
    def download(self,url):
        try:
            kv = {'user-agent': 'Mozilla/5.0'}  
            r = requests.get(self.url, timeout=5, headers = kv)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            print('爬取失敗')

HTML解析器

用于提取襄陽(yáng)詞條頁(yè)面的URL和當(dāng)前詞條的標(biāo)題和摘要信息戚扳。

from bs4 import BeautifulSoup


class HtmlParser(object):
    
    def parser(self,page_url,html_cont):
        '''
        用于解析網(wǎng)頁(yè)內(nèi)容忧便,抽取URL和數(shù)據(jù)
        page_url:下載頁(yè)面的URL
        htmL_cont:下載的網(wǎng)頁(yè)內(nèi)容
        '''
        if page_url is None or html_cont is None:
            return
        soup = BeautifulSoup(html_cont,'html.parser',from_enconding = 'utf-8')
        new_urls = self._get_new_urls(page_url,soup)
        new_data = self._get_new_data(page_url,soup)
        return new_urls,new_data
    
    def _get_new_urls(self,page_url,soup):
        '''
        抽取新的URL集合
        page_url:下載頁(yè)面的URL
        soup:
        '''
        new_urls = set()
        #找到相關(guān)鏈接
        links = soup.find('div',class_="lemma-summary").find_all('a')
        for link in links:
            new_url = link['href']    #提取'href'屬性
            new_full_url = page_url + new_url    #合成一個(gè)完成網(wǎng)址
            new_urls.add(new_full_url)
        return new_urls
    
    def _get_new_data(self,page_url,soup):
        data = {}
        data['url']=page_url
        title = soup.find('dd',class_='lemmaWgt-lemmaTitle-title').find('h1')
        data['title']=title.string
        summary = soup.find('div',class_='lemma-summary')
        data['summary']=summary.string
        
        return data
        

數(shù)據(jù)儲(chǔ)存器

主要包括兩個(gè)方法:一個(gè)用于將解析出來(lái)的數(shù)據(jù)儲(chǔ)存到內(nèi)中,一個(gè)用于將儲(chǔ)存數(shù)據(jù)輸出為指定的文件格式帽借。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末珠增,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砍艾,更是在濱河造成了極大的恐慌蒂教,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆荷,死亡現(xiàn)場(chǎng)離奇詭異凝垛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蜓谋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門梦皮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人桃焕,你說(shuō)我怎么就攤上這事剑肯。” “怎么了覆旭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵退子,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我型将,道長(zhǎng)寂祥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任七兜,我火速辦了婚禮丸凭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己惜犀,他們只是感情好铛碑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著虽界,像睡著了一般汽烦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莉御,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天撇吞,我揣著相機(jī)與錄音,去河邊找鬼礁叔。 笑死牍颈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琅关。 我是一名探鬼主播煮岁,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涣易!你這毒婦竟也來(lái)了画机?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤都毒,失蹤者是張志新(化名)和其女友劉穎色罚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體账劲,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年金抡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瀑焦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梗肝,死狀恐怖榛瓮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巫击,我是刑警寧澤禀晓,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坝锰,受9級(jí)特大地震影響粹懒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顷级,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一凫乖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦帽芽、人聲如沸删掀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)披泪。三九已至,卻和暖如春搬瑰,著一層夾襖步出監(jiān)牢的瞬間款票,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工跌捆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徽职,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓佩厚,卻偏偏與公主長(zhǎng)得像姆钉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抄瓦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容