自动采集文章内容(第一点没什么捷径可走,或许可以给你省不少事 )

优采云 发布时间: 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的编程课堂

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线