爬取百度百科N個頁面的數(shù)據(jù)

目標:百度百科Python詞條相關詞條網(wǎng)頁 - 標題和簡介

入口頁:http://baike.baidu.com/item/Python

URL格式:

  • 詞條頁面URL:/item/Python

數(shù)據(jù)格式:

  • 標題
    <dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1>
  • 簡介
    <div class="lemma-summary" label-module="lemmaSummary">

頁面編碼:

  • UTF-8
調(diào)度程序 spider_main.py
#coding:utf8
import html_downloader, html_parser, html_outputer,url_manager

class SpiderMain(object):
    def __init__(self):
        self.urls = url_manager.UrlManager()
        self.downloader = html_downloader.HtmlDownloader()
        self.parser = html_parser.HtmlParser()
        self.outputer = html_outputer.HtmlOutputer()

    
    def craw(self, root_url):
        count = 1
        self.urls.add_new_url(root_url)
        while self.urls.has_new_url():
            try:
                new_url = self.urls.get_new_url()
                print 'craw %d : %s' % (count, new_url)
                html_cont = self.downloader.download(new_url)
                new_urls, new_data = self.parser.parse(new_url, html_cont)
                self.urls.add_new_urls(new_urls)
                self.outputer.collect_data(new_data)
                
                if count == 10:
                    break
                count+=1
                
            except:
                print 'craw failed'
            
        self.outputer.output_html()


if __name__=="__main__":
    root_url = "http://baike.baidu.com/item/Python"
    obj_spider = SpiderMain()
    obj_spider.craw(root_url)
URL管理器 url_manager.py
#coding:utf8

class UrlManager(object):
    def __init__(self):
        self.new_urls = set()
        self.old_urls = set()

    def add_new_url(self,url):
        if url is None:
            return
        if url not in self.new_urls and url not in self.old_urls:
            self.new_urls.add(url)

    def add_new_urls(self,urls):
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_new_url(url)

    def has_new_url(self):
        return len(self.new_urls) != 0

    def get_new_url(self):
        new_url = self.new_urls.pop()
        self.old_urls.add(new_url)
        return new_url
HTML下載器 html_downloader.py
#coding:utf8
import urllib2

class HtmlDownloader(object):
    
    def download(self,url):
        if url is None:
            return None

        response = urllib2.urlopen(url)

        if response.getcode() !=200:
            return None

        return response.read()
HTML解析器 html_parser.py
#coding:utf8
from bs4 import BeautifulSoup
import re
import urlparse


class HtmlParser(object):
    
    
    def _get_new_urls(self, page_url, soup):
        new_urls = set()
        links = soup.find_all('a', href=re.compile(r'/item/'))
        for link in links:
            new_url = link['href']
            new_full_url = urlparse.urljoin(page_url, new_url)
            new_urls.add(new_full_url)
        return new_urls
    
    def _get_new_data(self, page_url, soup):
        res_data = {}
        
        #url
        res_data['url'] = page_url
        
        #<dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1>
        title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title").find("h1")
        res_data['title'] = title_node.get_text()
        
        #<div class="lemma-summary" label-module="lemmaSummary">
        summary_node = soup.find('div', class_="lemma-summary")
        res_data['summary'] = summary_node.get_text()
        
        return res_data
    
    
    def parse(self, page_url, html_cont):
        if page_url is None or html_cont is None:
            return
        
        soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='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
HTML輸出器 html_outputer.py
class HtmlOutputer(object):
    def __init__(self):
        self.datas = []

    def collect_data(self,data):
        if data is None:
            return
        self.datas.append(data)

    def output_html(self):
        fout = open('output.html','w')
        fout.write('<meta charset="utf-8">')
        fout.write("<html>")
        fout.write("<body>")
        fout.write("<table>")

        for data in self.datas:
            fout.write("<tr>")
            fout.write("<td>%s</td>" % data['url'])
            fout.write("<td>%s</td>" % data['title'].encode('utf-8'))
            fout.write("<td>%s</td>" % data['summary'].encode('utf-8'))
            fout.write("</tr>")


        fout.write("</table>")
        fout.write("</body>")
        fout.write("</html>")

        fout.close()
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摹菠,一起剝皮案震驚了整個濱河市逗柴,隨后出現(xiàn)的幾起案子跟狱,更是在濱河造成了極大的恐慌,老刑警劉巖烤蜕,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桩引,居然都是意外死亡贩猎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門途事,熙熙樓的掌柜王于貴愁眉苦臉地迎上來验懊,“玉大人,你說我怎么就攤上這事盯孙÷成” “怎么了祟滴?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵振惰,是天一觀的道長。 經(jīng)常有香客問我垄懂,道長骑晶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任草慧,我火速辦了婚禮桶蛔,結果婚禮上,老公的妹妹穿的比我還像新娘漫谷。我一直安慰自己仔雷,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碟婆,像睡著了一般电抚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竖共,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天蝙叛,我揣著相機與錄音,去河邊找鬼公给。 笑死借帘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的淌铐。 我是一名探鬼主播肺然,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腿准!你這毒婦竟也來了狰挡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤释涛,失蹤者是張志新(化名)和其女友劉穎加叁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唇撬,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡它匕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窖认。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豫柬。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扑浸,靈堂內(nèi)的尸體忽然破棺而出烧给,到底是詐尸還是另有隱情,我是刑警寧澤喝噪,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布础嫡,位于F島的核電站,受9級特大地震影響酝惧,放射性物質(zhì)發(fā)生泄漏榴鼎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一晚唇、第九天 我趴在偏房一處隱蔽的房頂上張望巫财。 院中可真熱鬧,春花似錦哩陕、人聲如沸平项。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闽瓢。三九已至号阿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸳粉,已是汗流浹背扔涧。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留届谈,地道東北人枯夜。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像艰山,于是被迫代替她去往敵國和親湖雹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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