摘要:是一個文章內容提取器,可以從任意資訊文章類的網頁中提取文章主體,并提取標題標簽摘要圖片視頻等信息,且支持中文網頁。
爬蟲抓取數據有兩個頭疼的點,寫過爬蟲的小伙伴們一定都深有體會:
網站的 防抓取 機制。你要盡可能將自己偽裝成“一個人”,騙過對方的服務器反爬驗證。
網站的 內容提取 。每個網站都需要你做不同的處理,而且網站一旦改版,你的代碼也得跟著更新。
第一點沒什么捷徑可走,套路見得多了,也就有經驗了。關于第二點,今天咱們就來介紹一個小工具,在某些需求場景下,或許可以給你省不少事。
GooseGoose 是一個 文章內容提取器 ,可以從任意資訊文章類的網頁中提取 文章主體 ,并提取 標題、標簽、摘要、圖片、視頻 等信息,且 支持中文 網頁。它最初是由 http://Gravity.com 用 Java 編寫的。python-goose 是用 Python 重寫的版本。
有了這個庫,你從網上爬下來的網頁可以直接獲取正文內容,無需再用 bs4 或正則表達式一個個去處理文本。
項目地址:
(py2) https://github.com/grangier/python-goose
(py3) https://github.com/goose3/goose3
網上大多數教程提到的 python-goose 項目目前只支持到 python 2.7。可以通過 pip 安裝:
pip install goose-extractor
或者安裝官網上的方法從源代碼安裝:
mkvirtualenv --no-site-packages goose git clone https://github.com/grangier/python-goose.git cd python-goose pip install -r requirements.txt python setup.py install
我找到一個 python 3 的版本 goose3 :
pip install goose3
經過我一些簡單的測試,未發現兩個版本在結果上有太大的差異。
快速上手
這里使用 goose3,而 python-goose 只要把其中的 goose3 改成 goose 即可,接口都是一樣的。以我之前發過的一篇文章 如何用Python抓抖音上的小姐姐 為抓取目標來做個演示。
from goose3 import Goose from goose3.text import StopWordsChinese # 初始化,設置中文分詞 g = Goose({"stopwords_class": StopWordsChinese}) # 文章地址 url = "http://zhuanlan.zhihu.com/p/46396868" # 獲取文章內容 article = g.extract(url=url) # 標題 print("標題:", article.title) # 顯示正文 print(article.cleaned_text)
輸出:
除了標題 title 和正文 cleaned_text 外,還可以獲取一些額外的信息,比如:
meta_description :摘要
meta_keywords :關鍵詞
tags :標簽
top_image :主要圖片
infos :包含所有信息的 dict
raw_html :原始 HTML 文本
如有有些網站限制了程序抓取,也可以根據需要添加 user-agent 信息:
g = Goose({"browser_user_agent": "Version/5.1.2 Safari/534.52.7"})
如果是 goose3,因為使用了 requests 庫作為請求模塊,因此還可以以相似方式配置 headers、proxies 等屬性。
在上述示例中使用到的 StopWordsChinese 為中文分詞器,可一定程度上提高中文文章的識別準確率,但更耗時。
其他說明
Goose 雖然方便,但并不能保證每個網站都能精確獲取,因此 適合大規模文章的采集 ,如熱點追蹤、輿情分析等。它只能從概率上保證大多數網站可以相對準確地抓取。我經過一些嘗試后發現,抓取英文網站優于中文網站,主流網站優于小眾網站,文本的提取優于圖片的提取。
從項目中的 requirements.txt 文件可以看出,goose 中使用到了 Pillow、lxml、cssselect、jieba、beautifulsoup、nltk ,goose3 還用到了 requests ,我們之前很多文章和項目中都有所涉及:
這個男人讓你的爬蟲開發效率提升8倍
【編程課堂】jieba-中文分詞利器
如果你是使用基于 python2 的 goose,有可能會遇到 編碼 上的問題(尤其是 windows 上)。這方面可以在公眾號對話里回復關鍵詞 編碼 ,我們有過相關的講解。
除了 goose 外,還有其他的正文提取庫可以嘗試,比如 python-boilerpipe、python-readability 等。
實例
最后,我們來用 goose3 寫小一段代碼,自動抓取 愛范兒、雷鋒網、DoNews 上的新聞文章:
from goose3 import Goose from goose3.text import StopWordsChinese from bs4 import BeautifulSoup g = Goose({"stopwords_class": StopWordsChinese}) urls = [ "https://www.ifanr.com/", "https://www.leiphone.com/", "http://www.donews.com/" ] url_articles = [] for url in urls: page = g.extract(url=url) soup = BeautifulSoup(page.raw_html, "lxml") links = soup.find_all("a") for l in links: link = l.get("href") if link and link.startswith("http") and any(c.isdigit() for c in link if c) and link not in url_articles: url_articles.append(link) print(link) for url in url_articles: try: article = g.extract(url=url) content = article.cleaned_text if len(content) > 200: title = article.title print(title) with open("homework/goose/" + title + ".txt", "w") as f: f.write(content) except: pass
這段程序所做的事情就是:
抓取網站首頁
從頁面上提取地址中帶有數字的鏈接(因為文章頁基本帶數字,這里為了演示簡單以此判斷)
抓取這些鏈接,提取正文。如果結果超過 200 個字,就保存成文件
效果:
在此基礎上,你可以繼續改進這個程序,讓它不停地去尋找新的地址并抓取文章,并對獲取到的文章進行詞頻統計、生成詞云等后續操作。類似我們之前的分析案例 數據分析:當趙雷唱民謠時他唱些什么?。進一步完善,相信你能做出更有意思的項目。
相關代碼已上傳,獲取地址請在公眾號( Crossin的編程教室 )里回復關鍵字 goose
════
其他文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | 如何debug? | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺
歡迎微信搜索及關注: Crossin的編程教室
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44774.html
摘要:文檔寫得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代碼中派上用場了。 關于爬蟲的案例和方法,我們已講過許多。不過在以往的文章中,大多是關注在 如何把網頁上的內容抓取下來 。今天我們來分享下,當你已經把內容爬下來之后, 如何提取出其中你需要的具體信息 。 網頁被抓取下來,通常就是 str 字符串類型的對象 ,要從里面尋找信息,最直接的想法就是直接通過字符串的 find 方法 ...
摘要:何況不影響我們提取評論內容,只需分類出來考慮就行黑體注意下面余弦相似度這個是我開始的時候想多了大部分情況就是日期評論用戶名,后來我沒有考慮余弦相似度分類,代碼少了,精度也沒有下降。 背景 參加泰迪杯數據挖掘競賽,這次真的學習到了不少東西,最后差不多可以完成要求的內容,準確率也還行。總共的代碼,算上中間的過程處理也不超過500行,代碼思想也還比較簡單,主要是根據論壇的短文本特性和樓層之間...
摘要:何況不影響我們提取評論內容,只需分類出來考慮就行黑體注意下面余弦相似度這個是我開始的時候想多了大部分情況就是日期評論用戶名,后來我沒有考慮余弦相似度分類,代碼少了,精度也沒有下降。 背景 參加泰迪杯數據挖掘競賽,這次真的學習到了不少東西,最后差不多可以完成要求的內容,準確率也還行。總共的代碼,算上中間的過程處理也不超過500行,代碼思想也還比較簡單,主要是根據論壇的短文本特性和樓層之間...
摘要:何況不影響我們提取評論內容,只需分類出來考慮就行黑體注意下面余弦相似度這個是我開始的時候想多了大部分情況就是日期評論用戶名,后來我沒有考慮余弦相似度分類,代碼少了,精度也沒有下降。 背景 參加泰迪杯數據挖掘競賽,這次真的學習到了不少東西,最后差不多可以完成要求的內容,準確率也還行。總共的代碼,算上中間的過程處理也不超過500行,代碼思想也還比較簡單,主要是根據論壇的短文本特性和樓層之間...
閱讀 2263·2021-09-30 09:48
閱讀 3634·2021-09-24 10:27
閱讀 1790·2021-09-22 15:32
閱讀 2026·2021-08-09 13:44
閱讀 3575·2019-08-30 15:55
閱讀 1045·2019-08-29 17:12
閱讀 2000·2019-08-29 17:05
閱讀 2918·2019-08-29 13:43