爬蟲智能解析庫(kù) Readability 和 Newspaper 的用法
“
閱讀本文大概需要 10?分鐘。
輿情爬蟲是網(wǎng)絡(luò)爬蟲一個(gè)比較重要的分支,輿情爬蟲往往需要爬蟲工程師爬取幾百幾千個(gè)新聞?wù)军c(diǎn)。比如一個(gè)新聞頁(yè)面我們需要爬取其標(biāo)題、正文、時(shí)間、作者等信息,如果用傳統(tǒng)的方式來(lái)實(shí)現(xiàn),每一個(gè)站點(diǎn)都要配置非常多的規(guī)則,如果要維護(hù)一個(gè)幾百上千的站點(diǎn),那人力成本簡(jiǎn)直太高了。
如果有一種方式可以在保證差不多的準(zhǔn)確率的前提下,大幅提高提取效率的話,就需要用到智能文本提取了。
本文首先介紹一下智能文本提取的基本原理,讓大家對(duì)智能提取有基本的了解。然后介紹幾個(gè)比較基礎(chǔ)的工具包,準(zhǔn)確率并不是很高,可以嘗試一用。最后再介紹幾篇比較前沿的技術(shù)供大家參考。
智能文本提取
目前來(lái)說(shuō),智能文本提取可以分為三類:
基于網(wǎng)頁(yè)文檔內(nèi)容的提取方法
基于 DOM 結(jié)構(gòu)信息的提取方法
基于視覺信息的提取方法
基于網(wǎng)頁(yè)文檔的提取方法將 HTML 文檔視為文本進(jìn)行處理,適用于處理含有大量文本信息且結(jié)構(gòu)簡(jiǎn)單易于處理的單記錄網(wǎng)頁(yè),或者具有實(shí)時(shí)要求的在線分析網(wǎng)頁(yè)應(yīng)用。這種方式主要利用自然語(yǔ)言處理相關(guān)技術(shù)實(shí)現(xiàn),通過(guò)理解 文本語(yǔ)義、分析上下文、設(shè)定提取規(guī)則等,實(shí)現(xiàn)對(duì)大段網(wǎng)頁(yè)文檔的快速處理。其中,較為知名的方法有TSIMMIS、Web-OQL、Serrano、FAR-SW 和 FOREST,但這些方法由于通常需要人工的參與,且存在耗時(shí)長(zhǎng)、效率低的弊端。
基于 DOM 結(jié)構(gòu)信息的方法將 HTML 文檔解析為相應(yīng)的 DOM 樹,然后根據(jù) DOM 樹的語(yǔ)法結(jié)構(gòu)創(chuàng)建提取規(guī)則, 相對(duì)于以前的方法而言有了更高的性能和準(zhǔn)確率。W4F 和 XWRAP 將 HTML 文檔解析成 DOM 樹,然后通過(guò)組件化引導(dǎo)用戶通過(guò)人工選擇或者標(biāo)記生成目標(biāo)包裝器代碼。Omini、IEPAD 和 ITE 提取 DOM 樹上的關(guān)鍵路徑, 獲取其中存在的重復(fù)模式。MDR 和 DEPTA 挖掘了頁(yè)面中的數(shù)據(jù)區(qū)域,得到數(shù)據(jù)記錄的模式。CECWS 通過(guò)聚類算法從數(shù)據(jù)庫(kù)中提取出自同一網(wǎng)站的一組頁(yè)面,并進(jìn)行 DOM 樹結(jié)構(gòu)的對(duì)比,刪除其中的靜態(tài)部分,保留動(dòng)態(tài)內(nèi)容作為信息提取的結(jié)果。雖然此類方法相對(duì)于上一類方法 具有較高的提取精度,且克服了對(duì)大段連續(xù)文本的依賴, 但由于網(wǎng)頁(yè)的 DOM 樹通常較深,含有大量 DOM 節(jié)點(diǎn), 因此基于 DOM 結(jié)構(gòu)信息的方法具有較高的時(shí)間和空間消耗。目前來(lái)說(shuō),大部分原理還是基于 DOM 節(jié)點(diǎn)的文本密度、標(biāo)點(diǎn)符號(hào)密度等計(jì)算的,其準(zhǔn)確率還是比較可觀的。今天所介紹的 Readability 和 Newspaper 的庫(kù)的實(shí)現(xiàn)原理就是類似。
目前比較先進(jìn)的是基于視覺信息的網(wǎng)頁(yè)信息提取方法,通過(guò)瀏覽器接口或者內(nèi)核對(duì)目標(biāo)網(wǎng)頁(yè)預(yù)渲染,然后基于網(wǎng)頁(yè)的視覺規(guī)律提取網(wǎng)頁(yè)數(shù)據(jù)記錄。經(jīng)典的 VIPS 算法首先從 DOM 樹中提取出所有合適的頁(yè)面區(qū)域,然后根據(jù)這些頁(yè)面和分割條重新構(gòu)建 Web 頁(yè)面的語(yǔ)義結(jié)構(gòu)。作為對(duì) VIPS 的拓展,ViNT、ViPER、ViDE 也成功利用了網(wǎng)頁(yè)的視覺特征來(lái)實(shí)現(xiàn)數(shù)據(jù)提取。CMDR 為通過(guò)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)多記錄型頁(yè)面中的特征,結(jié)合基于 DOM 結(jié)構(gòu)信息的 MDR 方法,挖掘社區(qū)論壇頁(yè)面的數(shù)據(jù)區(qū)域。與上述方法不同,VIBS 將圖像領(lǐng)域的 CNN 卷積神經(jīng)網(wǎng)絡(luò)運(yùn)用于網(wǎng)頁(yè)的截圖,同時(shí)通過(guò)類 VIPS 算法生成視覺塊,最后結(jié)合兩個(gè)階段的結(jié)果識(shí)別網(wǎng)頁(yè)的正文區(qū)域。另外還有最新的國(guó)內(nèi)提出的 VBIE 方法,基于網(wǎng)頁(yè)視覺的基礎(chǔ)上改進(jìn),可以實(shí)現(xiàn)無(wú)監(jiān)督的網(wǎng)頁(yè)信息提取。
以上內(nèi)容主要參考自論文:《王衛(wèi)紅等:基于可視塊的多記錄型復(fù)雜網(wǎng)頁(yè)信息提取算法》,算法可從該論文參考文獻(xiàn)查閱。
下面我們來(lái)介紹兩個(gè)比較基礎(chǔ)的工具包 Readability 和 Newspaper 的用法,這兩個(gè)包經(jīng)我測(cè)試其實(shí)準(zhǔn)確率并不是很好,主要是讓大家大致對(duì)智能解析有初步的理解。后面還會(huì)介紹一些更加強(qiáng)大的智能化解析算法。
Readability
Readability 實(shí)際上是一個(gè)算法,并不是一個(gè)針對(duì)某個(gè)語(yǔ)言的庫(kù)。其主要原理就是計(jì)算了 DOM 的文本密度,另外根據(jù)一些常見的 DOM 屬性如 id、class 等計(jì)算了一些 DOM 的權(quán)重,最后分析得到了對(duì)應(yīng)的 DOM 區(qū)塊,進(jìn)而提取出具體的文本內(nèi)容。
現(xiàn)在搜索 Readability 其實(shí)已經(jīng)找不到了,取而代之的是一個(gè) JavaScript 工具包,叫做 mercury-parser,據(jù)我所知應(yīng)該是 Readability 不維護(hù)了,換成了 mercury-parser。后者現(xiàn)在也做成了一個(gè) Chrome 插件,大家可以下載使用一下。
回歸正題,這次主要介紹的是 Python 的 Readability 實(shí)現(xiàn),現(xiàn)在其實(shí)有很多開源版本,本文選取的是 https://github.com/buriy/python-readability,是基于最早的 Python 版本的 Readability 庫(kù) https://github.com/timbertson/python-readability 二次開發(fā)的,現(xiàn)在已經(jīng)發(fā)布到了 PyPi,大家可以直接下載安裝使用。
安裝很簡(jiǎn)單,通過(guò) pip 安裝即可:
pip3?install?readability-lxml
安裝好了之后便可以通過(guò)導(dǎo)入 readability 使用了,下面我們隨便從網(wǎng)上找一個(gè)新聞頁(yè)面,比如:https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html,其頁(yè)面截圖如下:
頁(yè)面示例我們的目的就是它的正文、標(biāo)題等內(nèi)容。下面我們用 Readability 試一下,示例如下:
import?requests
from?readability?import?Document
url?=?'https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html'
html?=?requests.get(url).content
doc?=?Document(html)
print('title:',?doc.title())
print('content:',?doc.summary(html_partial=True))
在這里我們直接用 requests 庫(kù)對(duì)網(wǎng)頁(yè)進(jìn)行了請(qǐng)求,獲取了其 HTML 頁(yè)面內(nèi)容,賦值為 html。
然后引入了 readability 里的 Document 類,使用 html 變量對(duì)其進(jìn)行初始化,然后我們分別調(diào)用了 title 方法和 summary 方法獲得了其標(biāo)題和正文內(nèi)容。
這里 title 方法就是獲取文章標(biāo)題的,summary 就是獲取文章正文的,但是它獲取的正文可能包含一些 HTML 標(biāo)簽。這個(gè) summary 方法可以接收一個(gè) html_partial 參數(shù),如果設(shè)置為 True,返回的結(jié)果則不會(huì)再帶有 標(biāo)簽。
看下運(yùn)行結(jié)果:
title:?今年iPhone只有小改進(jìn)?分析師:還有其他亮點(diǎn)_網(wǎng)易科技
content:?<div><div?class="post_text"?id="endText">???????????
????????????????????<p?class="otitle">
????????????????????????(原標(biāo)題:Apple Bets More Cameras Can Keep iPhone Humming)
????????????????????p>
????????????????????<p?class="f_center"><img?alt="今年iPhone只有小改進(jìn)?分析師:還有其他亮點(diǎn)"?src="http://cms-bucket.ws.126.net/2019/09/09/d65ba32672934045a5bfadd27f704bc1.jpeg"/><span>圖示:蘋果首席執(zhí)行官蒂姆·庫(kù)克(Tim Cook)在6月份舉行的蘋果全球開發(fā)者大會(huì)上。span>p><p>網(wǎng)易科技訊?9月9日消息,據(jù)國(guó)外媒體報(bào)道,和過(guò)去的12個(gè)年頭一樣,新款
...?中間省略?...
????????????????????<p>蘋果還即將推出包括電視節(jié)目和視頻游戲等內(nèi)容的新訂閱服務(wù)。分析師表示,該公司最早可能在本周宣布TV+和Arcade等服務(wù)的價(jià)格和上線時(shí)間。p><p>Strategy Analytics的尼爾·莫斯頓(Neil Mawston)表示,可穿戴設(shè)備和服務(wù)的結(jié)合將是蘋果業(yè)務(wù)超越iPhone的關(guān)鍵。他說(shuō),上一家手機(jī)巨頭諾基亞公司在試圖進(jìn)行類似業(yè)務(wù)轉(zhuǎn)型時(shí)就陷入了困境之中。(辰辰)p><p><b>相關(guān)報(bào)道:b>p><p><a?href="https://tech.163.com/19/0908/09/EOHS53RK000999LD.html"?target="_self"?urlmacroreplace="false">iPhone 11背部蘋果Logo改為居中:為反向無(wú)線充電a>p><p><a?href="https://tech.163.com/19/0907/08/EOF60CBC00097U7S.html"?target="_self"?urlmacroreplace="false">2019年新iPhone傳言匯總,你覺得哪些能成真a>??p><p/>
????????????????????????<p/>
????????????????????????<div?class="ep-source?cDGray">
????????????????????????????<span?class="left"><a?href="http://tech.163.com/"><img?src="https://static.ws.126.net/cnews/css13/img/end_tech.png"?alt="王鳳枝"?class="icon"/>a>?本文來(lái)源:網(wǎng)易科技報(bào)道??span>
????????????????????????????<span?class="ep-editor">責(zé)任編輯:王鳳枝_NT2541span>
????????????????????????div>
????????????????div>?
div>
可以看到,標(biāo)題提取是正確的。正文其實(shí)也是正確的,不過(guò)這里還包含了一些 HTML 標(biāo)簽,比如 、 等,我們可以進(jìn)一步通過(guò)一些解析庫(kù)來(lái)解析。
看下源碼吧,比如提取標(biāo)題的方法:
def?normalize_entities(cur_title):
????entities?=?{
????????u'\u2014':'-',
????????u'\u2013':'-',
????????u'—':?'-',
????????u'–':?'-',
????????u'\u00A0':?'?',
????????u'\u00AB':?'"',
????????u'\u00BB':?'"',
????????u'"':?'"',
????}
????for?c,?r?in?entities.items():
????????if?c?in?cur_title:
????????????cur_title?=?cur_title.replace(c,?r)
????return?cur_title
def?norm_title(title):
????return?normalize_entities(normalize_spaces(title))
def?get_title(doc):
????title?=?doc.find('.//title')
????if?title?is?None?or?title.text?is?None?or?len(title.text)?==?0:
????????return?'[no-title]'
????return?norm_title(title.text)
?def?title(self):
????"""Returns?document?title"""
????return?get_title(self._html(True))
title 方法實(shí)際上就是調(diào)用了一個(gè) get_title 方法,它怎么做的?實(shí)際上就是用了一個(gè) XPath 只解析了 標(biāo)簽里面的內(nèi)容,別的沒了。如果沒有,那就返回 [no-title]。
def?summary(self,?html_partial=False):
????ruthless?=?True
????while?True:
????????self._html(True)
????????for?i?in?self.tags(self.html,?'script',?'style'):
????????????i.drop_tree()
????????for?i?in?self.tags(self.html,?'body'):
????????????i.set('id',?'readabilityBody')
????????if?ruthless:
????????????self.remove_unlikely_candidates()
????????self.transform_misused_divs_into_paragraphs()
????????candidates?=?self.score_paragraphs()
????????best_candidate?=?self.select_best_candidate(candidates)
????????if?best_candidate:
????????????article?=?self.get_article(candidates,?best_candidate,
???????????????????????????????????????html_partial=html_partial)
????????else:
????????????if?ruthless:
????????????????ruthless?=?False
????????????????continue
????????????else:
????????????????article?=?self.html.find('body')
????????????????if?article?is?None:
????????????????????article?=?self.html
????????cleaned_article?=?self.sanitize(article,?candidates)
????????article_length?=?len(cleaned_article?or?'')
????????retry_length?=?self.retry_length
????????of_acceptable_length?=?article_length?>=?retry_length
????????if?ruthless?and?not?of_acceptable_length:
????????????ruthless?=?False
????????????continue
????????else:
????????????return?cleaned_article
這里我刪除了一些冗余的調(diào)試的代碼,只保留了核心的代碼,其核心實(shí)現(xiàn)就是先去除一些干擾內(nèi)容,然后找出一些疑似正文的 candidates,然后再去尋找最佳匹配的 candidates 最后提取其內(nèi)容返回即可。
然后再找到獲取 candidates 方法里面的 score_paragraphs 方法,又追蹤到一個(gè) score_node 方法,就是為每一個(gè)節(jié)點(diǎn)打分的,其實(shí)現(xiàn)如下:
def?score_node(self,?elem):
????content_score?=?self.class_weight(elem)
????name?=?elem.tag.lower()
????if?name?in?["div",?"article"]:
????????content_score?+=?5
????elif?name?in?["pre",?"td",?"blockquote"]:
????????content_score?+=?3
????elif?name?in?["address",?"ol",?"ul",?"dl",?"dd",?"dt",?"li",?"form",?"aside"]:
????????content_score?-=?3
????elif?name?in?["h1",?"h2",?"h3",?"h4",?"h5",?"h6",?"th",?"header",?"footer",?"nav"]:
????????content_score?-=?5
????return?{
????????'content_score':?content_score,
????????'elem':?elem
????}
這什么意思呢?你看如果這個(gè)節(jié)點(diǎn)標(biāo)簽是 div 或者 article 等可能表征正文區(qū)塊的話,就加 5 分,如果是 aside 等表示側(cè)欄的內(nèi)容就減 3 分。這些打分也沒有什么非常標(biāo)準(zhǔn)的依據(jù),可能是根據(jù)經(jīng)驗(yàn)累積的規(guī)則。
另外還有一些方法里面引用了一些正則匹配來(lái)進(jìn)行打分或者替換,其定義如下:
REGEXES?=?{
????'unlikelyCandidatesRe':?re.compile('combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup|tweet|twitter',?re.I),
????'okMaybeItsACandidateRe':?re.compile('and|article|body|column|main|shadow',?re.I),
????'positiveRe':?re.compile('article|body|content|entry|hentry|main|page|pagination|post|text|blog|story',?re.I),
????'negativeRe':?re.compile('combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget',?re.I),
????'divToPElementsRe':?re.compile('<(a|blockquote|dl|div|img|ol|p|pre|table|ul)',?re.I),
????#'replaceBrsRe':?re.compile('(
]*>[?\n\r\t]*){2,}',re.I),
????#'replaceFontsRe':?re.compile('<(\/?)font[^>]*>',re.I),
????#'trimRe':?re.compile('^\s+|\s+$/'),
????#'normalizeRe':?re.compile('\s{2,}/'),
????#'killBreaksRe':?re.compile('(
(\s| ?)*){1,}/'),
????'videoRe':?re.compile('https?:\/\/(www\.)?(youtube|vimeo)\.com',?re.I),
????#skipFootnoteLink:??????/^\s*(\[?[a-z0-9]{1,2}\]?|^|edit|citation?needed)\s*$/i,
}
比如這里定義了 unlikelyCandidatesRe,就是不像 candidates 的 pattern,比如 foot、comment 等等,碰到這樣的標(biāo)簽或 pattern 的話,在計(jì)算分?jǐn)?shù)的時(shí)候都會(huì)減分,另外還有其他的 positiveRe、negativeRe 也是一樣的原理,分別對(duì)匹配到的內(nèi)容進(jìn)行加分或者減分。
這就是 Readability 的原理,是基于一些規(guī)則匹配的打分模型,很多規(guī)則其實(shí)來(lái)源于經(jīng)驗(yàn)的累積,分?jǐn)?shù)的計(jì)算規(guī)則應(yīng)該也是不斷地調(diào)優(yōu)得出來(lái)的。
另外其他的就沒了,Readability 并沒有提供提取時(shí)間、作者的方法,另外此種方法的準(zhǔn)確率也是有限的,但多少還是省去了一些人工成本。
Newspaper
另外還有一個(gè)智能解析的庫(kù),叫做 Newspaper,提供的功能更強(qiáng)一些,但是準(zhǔn)確率上個(gè)人感覺和 Readability 差不太多。
這個(gè)庫(kù)分為 Python2 和 Python3 兩個(gè)版本,Python2 下的版本叫做 newspaper,Python3 下的版本叫做 newspaper3k,這里我們使用 Python3 版本來(lái)進(jìn)行測(cè)試。
其 GitHub 地址是:https://github.com/codelucas/newspaper,官方文檔地址是:https://newspaper.readthedocs.io。
在安裝之前需要安裝一些依賴庫(kù),可以參考官方的說(shuō)明:https://github.com/codelucas/newspaper#get-it-now。
安裝好必要的依賴庫(kù)之后,就可以使用 pip 安裝了:
pip3?install?newspaper3k
安裝成功之后便可以導(dǎo)入使用了。
下面我們先用官方提供的實(shí)例來(lái)過(guò)一遍它的用法,官方提供的示例是使用了這個(gè)鏈接:https://fox13now.com/2013/12/30/new-year-new-laws-obamacare-pot-guns-and-drones/,其頁(yè)面截圖如下:
官方示例下面用一個(gè)實(shí)例來(lái)感受一下:
from?newspaper?import?Article
url?=?'https://fox13now.com/2013/12/30/new-year-new-laws-obamacare-pot-guns-and-drones/'
article?=?Article(url)
article.download()
#?print('html:',?article.html)
article.parse()
print('authors:',?article.authors)
print('date:',?article.publish_date)
print('text:',?article.text)
print('top?image:',?article.top_image)
print('movies:',?article.movies)
article.nlp()
print('keywords:',?article.keywords)
print('summary:',?article.summary)
這里從 newspaper 庫(kù)里面先導(dǎo)入了 Article 這個(gè)類,然后直接傳入 url 即可,首先需要調(diào)用它的 download 方法,將網(wǎng)頁(yè)爬取下來(lái),否則直接進(jìn)行解析會(huì)拋出錯(cuò)誤的。
但我總感覺這個(gè)設(shè)計(jì)挺不友好的,parse 方法不能判斷下,如果沒執(zhí)行 download 就自動(dòng)執(zhí)行 download 方法嗎?如果不 download 其他的不什么都干不了嗎?
好的,然后我們?cè)賵?zhí)行 parse 方法進(jìn)行網(wǎng)頁(yè)的智能解析,這個(gè)功能就比較全了,能解析 authors、publish_date、text 等等,除了正文還能解析作者、發(fā)布時(shí)間等等。
另外這個(gè)庫(kù)還提供了一些 NLP 的方法,比如獲取關(guān)鍵詞、獲取文本摘要等等,在使用前需要先執(zhí)行以下 nlp 方法。
最后運(yùn)行結(jié)果如下:
authors:?['Cnn?Wire']
date:?2013-12-30?00:00:00
text:?By?Leigh?Ann?Caldwell
WASHINGTON?(CNN)?—?Not?everyone?subscribes?to?a?New?Year’s?resolution,?but?Americans?will?be?required?to?follow?new?laws?in?2014.
Some?40,000?measures?taking?effect?range?from?sweeping,?national?mandates?under?Obamacare?to?marijuana?legalization?in?Colorado,?drone?prohibition?in?Illinois?and?transgender?protections?in?California.
Although?many?new?laws?are?controversial,?they?made?it?through?legislatures,?public?referendum?or?city?councils?and?represent?the?shifting?composition?of?American?beliefs.
...
...
Colorado:?Marijuana?becomes?legal?in?the?state?for?buyers?over?21?at?a?licensed?retail?dispensary.
(Sourcing:?much?of?this?list?was?obtained?from?the?National?Conference?of?State?Legislatures).
top?image:?https://localtvkstu.files.wordpress.com/2012/04/national-news-e1486938949489.jpg?quality=85&strip=all
movies:?[]
keywords:?['drones',?'national',?'guns',?'wage',?'law',?'pot',?'leave',?'family',?'states',?'state',?'latest',?'obamacare',?'minimum',?'laws']
summary:?Oregon:?Family?leave?in?Oregon?has?been?expanded?to?allow?eligible?employees?two?weeks?of?paid?leave?to?handle?the?death?of?a?family?member.
Arkansas:?The?state?becomes?the?latest?state?requiring?voters?show?a?picture?ID?at?the?voting?booth.
Minimum?wage?and?former?felon?employmentWorkers?in?13?states?and?four?cities?will?see?increases?to?the?minimum?wage.
New?Jersey?residents?voted?to?raise?the?state’s?minimum?wage?by?$1?to?$8.25?per?hour.
California?is?also?raising?its?minimum?wage?to?$9?per?hour,?but?workers?must?wait?until?July?to?see?the?addition.
這里省略了一些輸出結(jié)果。
可以看到作者、日期、正文、關(guān)鍵詞、標(biāo)簽、縮略圖等信息都被打印出來(lái)了,還算是不錯(cuò)的。
但這個(gè)畢竟是官方的實(shí)例,肯定是好的,我們?cè)贉y(cè)試一下剛才的例子,看看效果如何,網(wǎng)址還是:https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html,改寫代碼如下:
from?newspaper?import?Article
url?=?'https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html'
article?=?Article(url,?language='zh')
article.download()
#?print('html:',?article.html)
article.parse()
print('authors:',?article.authors)
print('title:',?article.title)
print('date:',?article.publish_date)
print('text:',?article.text)
print('top?image:',?article.top_image)
print('movies:',?article.movies)
article.nlp()
print('keywords:',?article.keywords)
print('summary:',?article.summary)
這里我們將鏈接換成了新聞的鏈接,另外在 Article 初始化的時(shí)候還加了一個(gè)參數(shù) language,其值為 zh,代表中文。
然后我們看下運(yùn)行結(jié)果:
Building?prefix?dict?from?/usr/local/lib/python3.7/site-packages/jieba/dict.txt?...
Dumping?model?to?file?cache?/var/folders/1g/l2xlw12x6rncs2p9kh5swpmw0000gn/T/jieba.cache
Loading?model?cost?1.7178938388824463?seconds.
Prefix?dict?has?been?built?succesfully.
authors:?[]
title:?今年iPhone只有小改進(jìn)?分析師:還有其他亮點(diǎn)
date:?2019-09-09?08:10:26+08:00
text:?(原標(biāo)題:Apple Bets More Cameras Can Keep?iPhone?Humming)
圖示:蘋果首席執(zhí)行官蒂姆·庫(kù)克(Tim Cook)在6月份舉行的蘋果全球開發(fā)者大會(huì)上。
網(wǎng)易科技訊?9月9日消息,據(jù)國(guó)外媒體報(bào)道,和過(guò)去的12個(gè)年頭一樣,新款iPhone將成為蘋果公司本周所舉行年度宣傳活動(dòng)的主角。但人們的注意力正轉(zhuǎn)向需要推動(dòng)增長(zhǎng)的其他蘋果產(chǎn)品和服務(wù)。
...
...
Strategy Analytics的尼爾·莫斯頓(Neil Mawston)表示,可穿戴設(shè)備和服務(wù)的結(jié)合將是蘋果業(yè)務(wù)超越iPhone的關(guān)鍵。他說(shuō),上一家手機(jī)巨頭諾基亞公司在試圖進(jìn)行類似業(yè)務(wù)轉(zhuǎn)型時(shí)就陷入了困境之中。(辰辰)
相關(guān)報(bào)道:
iPhone?11背部蘋果Logo改為居中:為反向無(wú)線充電
2019年新iPhone傳言匯總,你覺得哪些能成真
top?image:?https://www.163.com/favicon.ico
movies:?[]
keywords:?['trust高級(jí)投資組合經(jīng)理丹摩根dan',?'iphone',?'mawston表示可穿戴設(shè)備和服務(wù)的結(jié)合將是蘋果業(yè)務(wù)超越iphone的關(guān)鍵他說(shuō)上一家手機(jī)巨頭諾基亞公司在試圖進(jìn)行類似業(yè)務(wù)轉(zhuǎn)型時(shí)就陷入了困境之中辰辰相關(guān)報(bào)道iphone',?'xs的銷售疲軟狀況迫使蘋果在1月份下調(diào)了業(yè)績(jī)預(yù)期這是逾15年來(lái)的第一次據(jù)貿(mào)易公司susquehanna',?'xs機(jī)型發(fā)布后那種令人失望的業(yè)績(jī)重演iphone',?'今年iphone只有小改進(jìn)分析師還有其他亮點(diǎn)',?'more',?'xr和iphone',?'morgan說(shuō)他們現(xiàn)在沒有任何真正深入的進(jìn)展只是想繼續(xù)讓iphone這款業(yè)務(wù)繼續(xù)轉(zhuǎn)下去他樂觀地認(rèn)為今年發(fā)布的新款手機(jī)將有足夠多的新功能為一個(gè)非常成熟的產(chǎn)品增加額外的功能讓火車?yán)^續(xù)前進(jìn)這種僅限于此的態(tài)度說(shuō)明了蘋果自2007年發(fā)布首款iphone以來(lái)所面臨的挑戰(zhàn)iphone銷售占蘋果公司總營(yíng)收的一半以上這讓蘋果陷入了一個(gè)尷尬的境地既要維持核心產(chǎn)品的銷量另一方面又需要減少對(duì)它的依賴瑞銀ubs今年5月份對(duì)8000名智能手機(jī)用戶進(jìn)行了相關(guān)調(diào)查其發(fā)布的年度全球調(diào)查報(bào)告顯示最近iphone在人臉識(shí)別技術(shù)等方面的進(jìn)步并沒有引起一些消費(fèi)者的共鳴他們基本上都認(rèn)為蘋果產(chǎn)品沒有過(guò)去幾年那么獨(dú)特或者驚艷品牌也沒有過(guò)去幾年那么有吸引力很多人使用老款手機(jī)的時(shí)間更長(zhǎng)自己認(rèn)為也沒有必要升級(jí)到平均售價(jià)949美元的新款iphone蘋果需要在明年銷售足夠多的iphone以避免像去年9月份iphone',?'keep',?'原標(biāo)題apple']
summary:?(原標(biāo)題:Apple Bets More Cameras Can Keep?iPhone Humming)圖示:蘋果首席執(zhí)行官蒂姆·庫(kù)克(Tim Cook)在6月份舉行的蘋果全球開發(fā)者大會(huì)上。網(wǎng)易科技訊?9月9日消息,據(jù)國(guó)外媒體報(bào)道,和過(guò)去的12個(gè)年頭一樣,新款iPhone將成為蘋果公司本周所舉行...亞公司在試圖進(jìn)行類似業(yè)務(wù)轉(zhuǎn)型時(shí)就陷入了困境之中。(辰辰)相關(guān)報(bào)道:iPhone 11背部蘋果Logo改為居中:為反向無(wú)線充電2019年新iPhone傳言匯總,你覺得哪些能成真
中間正文很長(zhǎng)省略了一部分,可以看到運(yùn)行時(shí)首先加載了一些中文的庫(kù)包,比如 jieba 所依賴的詞表等等。
解析結(jié)果中,日期的確是解析對(duì)了,因?yàn)檫@個(gè)日期格式的的確比較規(guī)整,但這里還自動(dòng)給我們加了東八區(qū)的時(shí)區(qū),貼心了。作者沒有提取出來(lái),可能是沒匹配到 來(lái)源 兩個(gè)字吧,或者詞庫(kù)里面沒有,標(biāo)題、正文的提取還算比較正確,也或許這個(gè)案例的確是比較簡(jiǎn)單。
另外對(duì)于 NLP 部分,獲取的關(guān)鍵詞比較迷,長(zhǎng)度有點(diǎn)太長(zhǎng)了。summary 也有點(diǎn)冗余。
另外 Newspaper 還提供了一個(gè)較為強(qiáng)大的功能,就是 build 構(gòu)建信息源。官方的介紹其功能就是構(gòu)建一個(gè)新聞源,可以根據(jù)傳入的 URL 來(lái)提取相關(guān)文章、分類、RSS 訂閱信息等等。
我們用實(shí)例感受一下:
import?newspaper
source?=?newspaper.build('http://www.sina.com.cn/',?language='zh')
for?category?in?source.category_urls():
????print(category)
for?article?in?source.articles:
????print(article.url)
????print(article.title)
for?feed_url?in?source.feed_urls():
????print(feed_url)
在這里我們傳入了新浪的官網(wǎng),調(diào)用了 build 方法,構(gòu)建了一個(gè) source,然后輸出了相關(guān)的分類、文章、RSS 訂閱等內(nèi)容,運(yùn)行結(jié)果如下:
http://cul.news.sina.com.cn
http://www.sina.com.cn/
http://sc.sina.com.cn
http://jiangsu.sina.com.cn
http://gif.sina.com.cn
....
http://tj.sina.com.cn
http://travel.sina.com.cn
http://jiaoyi.sina.com.cn
http://cul.sina.com.cn
https://finance.sina.com.cn/roll/2019-06-12/doc-ihvhiqay5022316.shtml?
經(jīng)參頭版:激發(fā)微觀主體活力加速國(guó)企改革
http://eladies.sina.com.cn/feel/xinli/2018-01-25/0722/doc-ifyqwiqk0463751.shtml?
我們別再聯(lián)系了
http://finance.sina.com.cn/roll/2018-05-13/doc-ihamfahx2958233.shtml?
新違約時(shí)代到來(lái)!違約“常態(tài)化”下的市場(chǎng)出清與換血
http://sports.sina.com.cn/basketball/2019worldcup/2019-09-08/doc-iicezzrq4390554.shtml?
羅健兒26分韓國(guó)收首勝
...
http://travel.sina.com.cn/outbound/pages/2019-09-05/detail-iicezzrq3622449.shtml?
菲律賓海濱大道?夜晚讓人迷離
http://travel.sina.com.cn/outbound/pages/2016-08-19/detail-ifxvcnrv0334779.shtml??
關(guān)島?用雙腳盡情享受陽(yáng)光與海灘
http://travel.sina.com.cn/domestic/pages/2019-09-04/detail-iicezzrq3325092.shtml?
秋行查干浩特草原
http://travel.sina.com.cn/outbound/pages/2019-09-03/detail-iicezueu3050710.shtml?
白羊座的土豪之城迪拜
http://travel.sina.com.cn/video/baidang/2019-08-29/detail-ihytcitn2747327.shtml?
肯辛頓宮藏著維多利亞的秘密
http://cd.auto.sina.com.cn/bdcs/2017-08-15/detail-ifyixias1051586.shtml?
可以看到它輸出了非常多的類別鏈接,另外還有很多文章列表,由于沒有 RSS 訂閱內(nèi)容,這里沒有顯示。
下面把站點(diǎn)換成我的博客:https://cuiqingcai.com,博客截圖如下:

博客截圖
看看運(yùn)行結(jié)果:
https://cuiqingcai.com
https://cuiqingcai.com
似乎不太行啊,一篇文章都沒有,RSS 也沒有,可見其功能還有待優(yōu)化。
Newspaper 的基本用法介紹到這里,更加詳細(xì)的用法可以參考官方文檔:https://newspaper.readthedocs.io。個(gè)人感覺其中的智能解析可以用用,不過(guò)據(jù)我的個(gè)人經(jīng)驗(yàn),感覺還是很多解析不對(duì)或者解析不全的,
以上便是 Readability 和 Newspaper 的介紹。
其他方案
另外除了這兩個(gè)庫(kù)其實(shí)還有一些比較優(yōu)秀的算法,由于我們處理的大多為中文文檔,所以一些在中文上面的研究是比較有效的,在這里列幾個(gè)值得借鑒的中文論文供大家參考:
洪鴻輝等,基于文本及符號(hào)密度的網(wǎng)頁(yè)正文提取方法
梁東等,基于支持向量機(jī)的網(wǎng)頁(yè)正文內(nèi)容提取方法
王衛(wèi)紅等,基于可視塊的多記錄型復(fù)雜網(wǎng)頁(yè)信息提取算法
今天還看到一位大佬「青南」根據(jù)上面第一篇論文所實(shí)現(xiàn)的 GeneralNewsExtractor,GitHub 地址為:https://github.com/kingname/GeneralNewsExtractor,經(jīng)測(cè)試準(zhǔn)確率還不錯(cuò),比 Readability 和 Newspaper 的解析效果要好。我也跟作者進(jìn)行了交流,后續(xù)可能還會(huì)基于其他的 Feature 或依賴于視覺化的方法進(jìn)行優(yōu)化,大家可以關(guān)注下,謝謝!
崔慶才
靜覓博客博主,《Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)》作者
隱形字
個(gè)人公眾號(hào):進(jìn)擊的Coder


長(zhǎng)按識(shí)別二維碼關(guān)注
