爬蟲萬金油,一鵝在手,抓遍全球:goose 簡介!


GOOSE 現已棄用

經過多年的服務,GOOSE接口和支持它的MySQL數據現已棄用 。 在我們進行替換的同時,我們建議尋找一般查詢功能的用戶在http://rdf.geneontology.org上使用我們的公共RDF端點。 為了幫助理解圖形存儲的內容,我們提供了一些示例查詢和初始文檔 。 
GOOSE仍可供使用,但數據可能已過時。 請使用查詢“SELECT max(assocdate)FROM association;” 獲取最新的注釋日期。 “lite”數據庫應該提供更新的結果。

 

 

爬蟲抓取數據有兩個頭疼的點,寫過爬蟲的小伙伴們一定都深有體會:

網站的 防抓取 機制。你要盡可能將自己偽裝成“一個人”,騙過對方的服務器反爬驗證。

網站的 內容提取 。每個網站都需要你做不同的處理,而且網站一旦改版,你的代碼也得跟着更新。

第一點沒什么捷徑可走,套路見得多了,也就有經驗了。關於第二點,今天咱們就來介紹一個小工具,在某些需求場景下,或許可以給你省不少事。

Goose

Goose 是一個 文章內容提取器 ,可以從任意資訊文章類的網頁中提取 文章主體 ,並提取 標題、標簽、摘要、圖片、視頻 等信息,且 支持中文 網頁。它最初是由 http:// Gravity.com 用 Java 編寫的。python-goose 是用 Python 重寫的版本。

有了這個庫,你從網上爬下來的網頁可以直接獲取正文內容,無需再用 bs4 或正則表達式一個個去處理文本。

項目地址:

(py2) https:// github.com/grangier/pyt hon-goose

(py3) https:// github.com/goose3/goose 3

安裝

網上大多數教程提到的 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 為中文分詞器,可一定程度上提高中文文章的識別准確率,但更耗時。

進群:548377875   即可獲取數十套PDF以及大量的學習教程!

其他說明

1.

Goose 雖然方便,但並不能保證每個網站都能精確獲取,因此 適合大規模文章的采集 ,如熱點追蹤、輿情分析等。它只能從概率上保證大多數網站可以相對准確地抓取。我經過一些嘗試后發現,抓取英文網站優於中文網站,主流網站優於小眾網站,文本的提取優於圖片的提取。

2.

從項目中的 requirements.txt 文件可以看出,goose 中使用到了 Pillow、lxml、cssselect、jieba、beautifulsoup、nltk ,goose3 還用到了 requests ,我們之前很多文章和項目中都有所涉及:

這個男人讓你的爬蟲開發效率提升8倍 【編程課堂】jieba-中文分詞利器

3.

如果你是使用基於 python2 的 goose,有可能會遇到 編碼 上的問題(尤其是 windows 上)。這方面可以在公眾號對話里回復關鍵詞 編碼 ,我們有過相關的講解。

4.

除了 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 個字,就保存成文件

效果:

 
 

在此基礎上,你可以繼續改進這個程序,讓它不停地去尋找新的地址並抓取文章,並對獲取到的文章進行詞頻統計、生成詞雲等后續操作。類似我們之前的分析案例 數據分析:當趙雷唱民謠時他唱些什么? 。進一步完善,相信你能做出更有意思的項目。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM