客観的な分析:
目標: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で再現