簡易框架由以下幾個模組:
html解析器 :使用beautifulsoup對頁面內容進行解析
html輸出器 :對爬取的結果封裝成html檔案輸出
url管理器
class
urlmanager
(object):
def__init__
(self):
self.new_urls = set()
self.old_urls = set()
defadd_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)
defadd_new_urls
(self, urls):
if urls is
none
or len(urls) == 0:
return
for url in urls:
self.add_new_url(url)
defhas_new_url
(self):
return len(self.new_urls) != 0
defget_new_url
(self):
new_url = self.new_urls.pop()
self.old_urls.add(new_url)
return new_url
html解析器import urllib.request
class
html**********
(object):
defdownload
(self, url):
if url is
none:
return
none
response = urllib.request.urlopen(url)
if response.getcode() != 200:
return
none
return response.read()
html輸出器from bs4 import beautifulsoup
import re
import urllib.parse
class
htmlparser
(object):
defparse
(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
def_get_new_urls
(self, page_url, soup):
new_urls = set()
links = soup.find_all('a', href=re.compile(r"/item/\w+"))
for link in links:
new_url = link['href']
new_full_url = urllib.parse.urljoin(page_url, new_url)
new_urls.add(new_full_url)
return new_urls
def_get_new_data
(self, page_url, soup):
res_data = {}
res_data['url'] = page_url
# title_node = soup.find('dd', class_="lemmawgt-lemmatitle-title").find('h1')
res_data['title'] = title_node.get_text()
# summary_node = soup.find('div', class_="lemma-summary")
res_data['summary'] = summary_node.get_text()
return res_data
mainclass
htmloutputer
():def
__init__
(self):
self.datas =
defcollect_data
(self, data):
if data is
none:
return
defoutput_html
(self):
fout = open('output.html', 'w', encoding='utf-8')
fout.write('')
fout.write('')
fout.write('')
for data in self.datas:
fout.write('')
fout.write('%s' % data['url'])
fout.write('%s' % data['title'])
fout.write('%s' % data['summary'])
fout.write('')
fout.write('')
fout.write('')
fout.write('')
fout.close()
結果展示from baike_spider import html_**********
from baike_spider import html_outputer
from baike_spider import html_parser
from baike_spider import url_manager
class
spidermain
(object):
def__init__
(self):
self.urls = url_manager.urlmanager()
self.********** = html_**********.html**********()
self.parser = html_parser.htmlparser()
self.outputer = html_outputer.htmloutputer()
defcraw
(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.**********.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 == 100:
break
count += 1
except:
print("craw failed")
self.outputer.output_html()
if __name__ == "__main__":
root_url = ""
# root_url = ""
obj_spider = spidermain()
obj_spider.craw(root_url)

3月20日總結
這周一直在做貪心的題,發現貪心的最大特點就是 讀完題目後往往沒有思路,無從下手 而當有思路後,並不會消耗太多時間。近期的題目,關聯資料比較多,往往會用到pair型別或結構體。pair型別 pair包含兩個資料值。與容器一樣,pair也是一種模板型別。但在建立pair物件時,必須提供兩個型別名。pai...
3月16日 3月20日課程表
請各位家長注意翻看課程表下方學習指導 時間 周一周二 週三周四 周五9 00 9 25 英語數學 數學語文 英語9 30 9 40 眼操眼操 眼操眼操 眼操9 40 10 00 運動運動 運動運動 運動10 00 10 25 數學英語 語文數學 語文午休 3 00 3 25 語文語文 體育美術 數學...
3月20日 3月26日 新聞採訪寫作
此外,不同的媒介聲調不一樣,在新聞選擇的時候,可能出現側重點的偏差,這是 塑造自己風格的途徑之一,記者在選擇新聞時應該慎重考慮 二 新聞敏感 新聞鼻 1 什麼時新聞敏感 新聞工作者及時識別新近發生的事實是否具有新聞價值的能力。這是記者最基本的業務素質 2 新聞敏感的內涵 1 迅速判斷某一心事事實對當...