自动采集文章内容(第一点没什么捷径可走,或许可以给你省不少事 )
优采云 发布时间: 2022-01-08 23:19自动采集文章内容(第一点没什么捷径可走,或许可以给你省不少事
)
爬虫爬取数据有两个比较头疼的问题,写过爬虫的朋友一定深有体会:
网站 的反抓取机制。你要尽可能的伪装成“一个人”来欺骗对方的服务器反爬验证。网站 的内容提取。每个 网站 都要求你做一些不同的事情,一旦 网站 被修改,你的代码也必须更新。
第一点是没有捷径。你看到的套路越多,你就会有越多的经验。关于第二点,今天我们将介绍一个小工具,它在某些场景下可能会为您省去很多麻烦。
鹅
Goose是一个文章内容提取器,可以从任何文章类型的网页信息中提取文章正文,提取标题、标签、摘要、图片、视频等信息。 ,并支持中文网页。它最初是用 Java 编写的。python-goose 是用 Python 重写的版本。
有了这个库,你从网上爬取的网页可以直接获取正文内容,无需使用bs4或正则表达式对文本进行一一处理。
项目地址:
(py2)
(py3)
安装
网上大部分教程中提到的python-goose项目目前只支持python2.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)
输出:
除了titletitle和bodycleaned_text之外,还可以获得一些额外的信息,比如:
如果对程序爬取有一些网站限制,也可以根据需要添加user-agent信息:
g = Goose({'browser_user_agent': 'Version/5.1.2 Safari/534.52.7'})
如果是goose3,因为requests库作为request模块,所以headers和proxy等属性也可以类似配置。
上面例子中使用的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
════
其他 文章 和答案:
欢迎微信搜索关注:Crossin的编程课堂