热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python爬虫代码新闻_如何用100行Python代码实现新闻爬虫?

原标题:如何用100行Python代码实现新闻爬虫?每天我都要坐地铁上班,而地铁里完全没有手机信号。但我希望在坐地铁的时候读些新闻&#x

原标题:如何用 100 行 Python 代码实现新闻爬虫?

每天我都要坐地铁上班,而地铁里完全没有手机信号。但我希望在坐地铁的时候读些新闻,于是就写了下面这个新闻爬虫。

我并没有打算做很漂亮的应用,所以只完成了原型,它可以满足我最基本的需求。其思路很简单:

找到新闻源;

用Python抓取新闻;

利用BeautifulSoup分析HTML并提取出内容;

转换成容易阅读的格式并通过邮件发送。

下面详细介绍每个部分的实现。

▌新闻源:Reddit

我们可以通过Reddit提交新闻链接并为之投票,因此Reddit是个很好的新闻来源。但接下来的问题是:怎样才能获取每天最流行的新闻?

在考虑抓取之前,我们应该先考虑目标网站有没有提供API。因为使用API完全合法,更重要的是它能提供机器可读的数据,这样就无需再分析HTML了。

幸运的是Reddit提供了API。我们可以从API列表(https://www.reddit.com/dev/api/)中找到所需的功能:/top。该功能可以返回Reddit或指定subreddit上最流行的新闻。

接下来的问题是:这个API怎么用?

仔细阅读了Reddit的文档(https://github.com/reddit-archive/reddit/wiki/OAuth2)之后,我找到了最有效的用法。

第一步:在Reddit上创建一个应用。登录之后前往“preferences → apps”页面,底部有个名为“create another app...”的按钮。点击后创建一个“”类型的应用。我们不需要提供“about url”或“redirect url”,因为这个应用不对公众开放,也不会被别人使用。

59e6ba0c1d1a4da385e05752993e894f.jpeg

应用创建之后,可以在应用信息里找到App ID和Secret。

963c976211b2492a9057fa387e9e7c8a.jpeg

下个问题是如何使用App ID和Secret。由于我们只需获取指定SubReddit上最流行的新闻,而无需访问任何与用户相关的信息,所以理论上来说我们无需提供用户名或密码之类的个人信息。Reddit提供了“Application Only OAuth”(https://github.com/reddit-archive/reddit/wiki/OAuth2#application-only-oauth)的形式,通过这种方式,应用可以匿名访问公开的信息。运行下面这条命令:

58f00d5778f14286a3cfa1f9e441fd8d.png

该命令会返回access token:

c2608801a89e43c4a76165a193e40ad3.png

太好了!有了access token之后就可以大展拳脚了。

最后,如果不想自己写API的访问代码的话,可以使用Python客户端:https://github.com/praw-dev/praw

先做一下测试,从/r/Python获取最流行的5条新闻:

be3e1c5efe004115998877f441ccf6b3.jpeg

成功了!

▌抓取新闻页面

下一步的任务是抓取新闻页面,这其实很简单。通过上一步我们可以得到Submission对象,其URL属性就是新闻的地址。我们还可以通过domain属性过滤掉那些属于Reddit自己的URL:

我们只需要抓取该URL即可,用Requests很容易就可以做到:

d493b5c813df4d50895918ac7caffb0f.png

这里我们略过了content type不是text/html的新闻地址,因为Reddit的用户有可能会提交直接指向图片的链接,我们不需要这种。

▌提取新闻内容

下一步是从HTML中提取内容。我们的目标是提取新闻的标题和正文,而且可以忽略其他不需要阅读的内容,如页首、页脚、侧边栏等。

这项工作很难,其实并没有通用的完美解决办法。虽然BeautifulSoup可以帮我们提取文本内容,但它会连页首页脚一起提取出来。

不过幸运的是,我发现目前网站的结构比以前好很多。没有表格布局,也没有和
,整个文章页面清晰地用

标出了标题和每个段落。而且绝大部分网站会把标题和正文放在同一个容器元素中,比如像这样:

c04d869d0b9c4cdb9d36e5deb4a2faad.png

这个例子中顶层的

就是用于标题和正文的容器。所以可以利用如下算法找到正文:

找到

作为标题。出于SEO的目的,通常页面上只会有一个;

找到

的父元素,检查该父元素是否包含足够多的

;

重复第2步,直到找到一个包含足够多

的父元素,或到达

元素。如果找到了包含足够

的父元素,则该父元素就是正文的容器。如果在找到足够的

之前遇到了

,说明页面不包含任何可供阅读的内容。

这个算法虽然非常简陋,并没有考虑任何语义信息,但完全行得通。毕竟,算法运行失败时只需要忽略掉那篇文章就行了,少读一篇文章没什么大不了的……当然你可以通过解析、或#main、.sidebar等语义元素来实现更准确的算法。

用这个算法可以很容易地写出解析代码:

8d62f6c3f96e40798575785f7bf3130e.png

这里我利用len(root.find_all(&#39;p&#39;)) <5作为正文过滤的条件&#xff0c;因为真正的新闻不太可能少于5个段落。大家可以根据需要调整这个值。

▌转换成易于阅读的格式

最后一步是将提取出的内容转换为易于阅读的格式。我选择了Markdown&#xff0c;不过你可以写出更好的转换器。

本例中我只提取了和

&#xff0c;所以简单的函数就能满足要求&#xff1a;

5554353d662644b08f669caa7ceaf29d.jpeg

▌完整的代码

我在Github上分享了完整的代码&#xff0c;链接如下&#xff1a;

https://gist.github.com/charlee/bc865ba8aac295dd997691310514e515

正好100行 &#xff0c;跑一下试试&#xff1a;

8aee6ff39ea347a2a119506056e38576.jpeg

抓取的新闻文件&#xff1a;

1bd9b27173dd4aaf8ec707da8a9387d3.jpeg

最后需要做的是将这个脚本放在服务器上&#xff0c;设置好cronjob每天跑一次&#xff0c;然后将生成的文件发到我的信箱。

我没有花太多时间关注细节&#xff0c;所以其实这个脚本还有很多值得改进的地方。有兴趣的话你可以继续添加更多的功能&#xff0c;如提取图像等。

文章经授权转自&#xff1a;CSDN返回搜狐&#xff0c;查看更多

责任编辑&#xff1a;



推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • Oracle 和 mysql的9点区别【MySQL】
    数据库|mysql教程oracle,Oracle,money,mysql,coun数据库-mysql教程1.组函数用法规则mysql中组函数在select语句中可以随意使用,但在o ... [详细]
  • css如何设置span的宽度
    这篇文章给大家分享的是有关css如何设置span的宽度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。css设置span宽度 ... [详细]
author-avatar
o0沢田纲吉0o
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有