Baiduの百科事典のエントリページをクロール簡単なPythonのPythonの爬虫類

客観的な分析:
目標:Baiduの百科事典の項目に関連する用語のpythonウェブ-タイトルとイントロ

エントリーのページします。https://baike.baidu.com/item/Python/407313

URLの形式:
-エントリページのURL:/アイテム/ XXXX

データフォーマット:
-タイトル:
*** <の/ H1> <DDクラス= "タイトルlemmaWgt-lemmaTitle"> </ DD> <のH1>

-简介:
<DIV CLASS = "補題サマリー"> *** </ div>

ページのコーディング:UTF-8

 

爬虫類正面玄関ファイル

spider_main.py

#のコーディング:UTF 8。
インポートurl_manager
 インポートhtml_downloader
 インポートhtml_parser
 インポートhtml_outputerの


クラスSpiderMain(オブジェクト):
     DEF  __init__ (セルフ):
        URLマネージャ 
        self.urls = url_manager.UrlManager()
        ダウンローダ 
        self.downloader = html_downloader.HtmlDownloader( )
         #のパーサ 
        self.parser = html_parser.HtmlParser()
        出力制御 
        self.outputer = html_outputer.HtmlOutputer()

    DEFクロー(セルフ、root_url):
         #1 レコード現在の番号が最初クロールのURLである 
        。COUNT = 1 
        self.urls.add_new_url(root_url) 
        URLをクロールする場合、ループしながら継続
        '' ' 
        self.urls.has_new_url一方( ):
            試してみる:
                NEW_URL = self.urls.get_new_url()
                印刷'クロー%D:Sの%' %(COUNT、NEW_URL) ダウンロードページのURL 
                html_cont = self.downloader.download(NEW_URL)
                #URLを行って解析してURLを取得データ
                new_urls、NEW_DATA = self.parser.parse(NEW_URL、html_cont) のURL分析とデータ収集 
                IF COUNT> = 1000: 
                self.urls.add_new_urls(new_urls)
                self.outputer.collect_data(NEW_DATA)

                    BREAKの
                COUNT =カウント+ 1。
            以外例外E AS:
                印刷'クローは失敗' 
                印刷E 
        '' ' 
        のwhile :self.urls.has_new_url()
            NEW_URL = self.urls.get_new_url()
             印刷 ' クロー%D:S%'%を( COUNT、NEW_URL)
            ダウンロードURLのページ 
            html_cont = self.downloader.download(NEW_URL)
            印刷html_cont 
            #の行動URLのURLの解析とのデータ取得 
            new_urlsを、NEW_DATA = self.parser.parse(NEW_URL、html_cont)
            URL分析とデータ収集
            self.urls.add_new_urls(new_urls)
            self.outputer.collect_data(NEW_DATA)

            IF COUNT> = 10 BREAK 
            COUNT = COUNT + 1 #の指定されたページに出力し        、自己.outputer.output_html()IF __name__ == " __main__ " 
    root_url = " https://baike.baidu.com/item/Python/407313 " 
    obj_spider = SpiderMain()
    obj_spider.craw(root_url)

        



 

ページマネージャ

url_manager.py

コーディング:UTF 8。


クラスurlManager(オブジェクト):
     DEF  __init__ (セルフ):
        URLをクロールする 
        self.new_urls = SET()
        URLを経由クロール 
        self.old_urls = SET()

    DEFのadd_new_url(セルフ、URL ):
         IF URLがある:なし
             戻り
        #が取られたURL URLは内部登るも内部をクロールして、URLに追加しない場合
        IF URLをない  self.new_urls  URL ない self.old_urls:
            self.new_urls.addを( URL)

    DEFadd_new_urls(自己、URLの):
         場合のURLはありませんなしまたは LEN(URLを)== :0
             復帰
        のための URL のURL:
            self.add_new_url(URL)

    デフhas_new_url(自己):
         戻り!LEN(self.new_urls)= 0 

    DEF get_new_url (自己):
        NEW_URL = self.new_urls.pop()
        self.old_urls.add(NEW_URL)
        リターン NEW_URL

ウェブダウンローダ

html_downloader.py

#のコーディング:UTF-8 

インポートurllib2のの


クラスHtmlDownloader(オブジェクト):
     デフダウンロード(自己、URL):
         場合は URLがあるなし:
             返すなし

        応答 = urllib2.urlopen(URL)が

        あれば response.getcode()= 200! 返すなし

        リターンを response.read()

ウェブサイトアナライザ

html_parser.py

#のコーディング:UTF-8 

から BS4の輸入BeautifulSoupの
 インポートインポートurlparseの


クラスHtmlParser(オブジェクト):

    デフ_get_new_urls(自己、PAGE_URL、スープ):
        得到所有的词条のURL 
        リンク= soup.find_all(' A '、のhref =再.compile(R " /item/.* " ))
        プリントリンク 
        new_urls = ()を設定
         するためのリンク:リンク
            NEW_URL =リンク[ ' のhref ' ]
            new_full_url = urlparse.urljoin(PAGE_URL、NEW_URL)
            new_urls.add(new_full_url)

        戻りnew_urls 

    DEF _get_new_data(自己、PAGE_URL、スープ):
        res_data = {}
        URLの 
        res_data [ ' URL ' ] = PAGE_URL 

        <DDクラス= "lemmaWgt- lemmaTitleタイトル"> 
        <H1> Pythonの</ H1> 
        title_node = soup.find(' DD '、class_が= ' lemmaWgt-lemmaTitleタイトル').find(" H1 
        res_data [ ' タイトル' ] = title_node.get_text()
        <DIV CLASS = "補題サマリー"ラベル・モジュール= "lemmaSummary"> 
        summary_node = soup.find(' div要素'、class_が= " 補題サマリー" 
        res_data [ ' 要約' ] = summary_node.get_text()

        の戻りres_data 

    デフ(自己、PAGE_URL、html_cont)を解析:
         場合 PAGE_URLがあるなし html_contはありませんなし:
            リターン

        スープ= BeautifulSoup(html_cont、' html.parser '、from_encoding = ' UTF-8 ' 

        new_urls = self._get_new_urls(PAGE_URL、スープ)
        NEW_DATA = self._get_new_data(PAGE_URL、スープ)

        リターン new_urls、NEW_DATA

ページ出力デバイス

html_outputer.py

#のコード:UTF-8 

クラスHtmlOutputer(オブジェクト):
     デフ __init__ (自己):
        self.datas = [] 

    DEF COLLECT_DATA(自己、データ)
         場合、データがある:なし
             戻り
        self.datas.append(データ)

    ASCII 
    DEF output_html (自己):
        FOUT =オープン(' output.html '' W ' 

        fout.write(" <HTML> " 
        fout.writeを(" <BODY> "
        fout.write(" <TABLE> " 

        のためのデータself.datas:
            fout.write(" <TR> " 
            fout.write(" <TD>%S </ TD> "%データ[ ' URL ' ] )
            fout.write(" <TD>%S </ TD> "%データ[ ' 表題' ] .encode(' UTF-8 ' ))
            fout.write(" <TD>%S </ TD> "%データ[ 要約] .encode(' UTF-8 ' ))
            fout.write(" </ TR> " 

        fout.write(" /テーブル" 
        fout.write(" /ボディ" 
        fout.write(" / HTML "

コードを実行します。

 検索結果ページ

ます。https://www.cnblogs.com/reblue520/p/11083814.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34008805/article/details/94197020