iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么用Python代码实现新闻爬虫
  • 707
分享到

怎么用Python代码实现新闻爬虫

2023-06-16 13:06:33 707人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“怎么用python代码实现新闻爬虫”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!新闻源:Reddit我们可以通过Reddit

本篇内容介绍了“怎么用python代码实现新闻爬虫”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

新闻源:Reddit

我们可以通过Reddit提交新闻链接并为之投票,因此Reddit是个很好的新闻来源。但接下来的问题是:怎样才能获取每天最流行的新闻?在考虑抓取之前,我们应该先考虑目标网站有没有提供api。因为使用API完全合法,更重要的是它能提供机器可读的数据,这样就无需再分析html了。幸运的是Reddit提供了API。我们可以从API列表中找到所需的功能:/top。该功能可以返回Reddit或指定subreddit上最流行的新闻。接下来的问题是:这个API怎么用?仔细阅读了Reddit的文档之后,我找到了最有效的用法。第一步:在Reddit上创建一个应用。登录之后前往“preferences  → apps”页面,底部有个名为“create another app...”的按钮。点击后创建一个“script”类型的应用。我们不需要提供“about  url”或“redirect url”,因为这个应用不对公众开放,也不会被别人使用。

怎么用Python代码实现新闻爬虫

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

怎么用Python代码实现新闻爬虫

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

$ curl -X POST -H 'User-Agent: myawesomeapp/1.0' -d grant_type=client_credentials --user 'OUR_CLIENT_ID:OUR_CLIENT_SECRET'  https://www.reddit.com/api/v1/access_token

该命令会返回access token:

{"access_token": "ABCDEFabcdef0123456789", "token_type": "bearer", "expires_in": 3600, "scope": "*"}

太好了!有了access  token之后就可以大展拳脚了。最后,如果不想自己写API的访问代码的话,可以使用Python客户端:Https://GitHub.com/praw-dev/praw先做一下测试,从/r/Python获取最流行的5条新闻:

>>> import praw >>> import pprint >>> reddit = praw.Reddit(client_id='OUR_CLIENT_ID', ...                      client_secret='OUR_SECRET', ...                      grant_type='client_credentials', ...                      user_agent='mytestscript/1.0') >>> subs = reddit.subreddit('Python').top(limit=5) >>> pprint.pprint([(s.score, s.title) for s in subs]) [(6555, 'Automate the boring stuff with python - tinder'),  (4548,   'MS is considering official Python integration with excel, and is asking for '   'input'),  (4102, 'Python Cheet Sheet for begineers'),  (3285,   'We started late, but we managed to leave Python footprint on r/place!'),  (2899, "Python Section at Foyle's, London")]

成功了!

抓取新闻页面

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

subs = [sub for sub in subs if not sub.domain.startswith('self.')]

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

for sub in subs:   res = requests.get(sub.url)   if (res.status_code == 200 and 'content-type' in res.headers and       res.headers.get('content-type').startswith('text/html')):     html = res.text

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

提取新闻内容

下一步是从HTML中提取内容。我们的目标是提取新闻的标题和正文,而且可以忽略其他不需要阅读的内容,如页首、页脚、侧边栏等。这项工作很难,其实并没有通用的完美解决办法。虽然BeautifulSoup可以帮我们提取文本内容,但它会连页首页脚一起提取出来。不过幸运的是,我发现目前网站的结构比以前好很多。没有表格布局,也没有和<font>和<br>,整个文章页面清晰地用<h2>和<p>标出了标题和每个段落。而且绝大部分网站会把标题和正文放在同一个容器元素中,比如像这样:

<header>Site Navigation</header> <div id="#main">   <section>     <h2 class="title">Page Title</h2>   </section>   <section>     <p>Paragraph 1</p>     <p>Paragraph 2</p>   </section> </div> <aside>Sidebar</aside> <footer>Copyright...</footer>

这个例子中顶层的<div id="#main">就是用于标题和正文的容器。所以可以利用如下算法找到正文:

  • 找到<h2>作为标题。出于SEO的目的,通常页面上只会有一个<h2>;

  • 找到<h2>的父元素,检查该父元素是否包含足够多的<p>;

  • 重复第2步,直到找到一个包含足够多<p>的父元素,或到达<body>元素。如果找到了包含足够<p>的父元素,则该父元素就是正文的容器。如果在找到足够的<p>之前遇到了<body>,说明页面不包含任何可供阅读的内容。

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

soup = BeautifulSoup(text, 'html.parser') # find the article title h2 = soup.body.find('h2') # find the common parent for <h2> and all <p>s. root = h2 while root.name != 'body' and len(root.find_all('p')) < 5:   root = root.parent if len(root.find_all('p')) < 5:   return None # find all the content elements. ps = root.find_all(['h3', 'h4', 'h5', 'h6', 'h7', 'p', 'pre'])

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

转换成易于阅读的格式

最后一步是将提取出的内容转换为易于阅读的格式。我选择了markdown,不过你可以写出更好的转换器。本例中我只提取了和<h#>和<p>、<pre>,所以简单的函数就能满足要求:

ps = root.find_all(['h3', 'h4', 'h5', 'h6', 'h7', 'p', 'pre']) ps.insert(0, h2)    # add the title content = [tag2md(p) for p in ps] def tag2md(tag):   if tag.name == 'p':     return tag.text   elif tag.name == 'h2':     return f'{tag.text}\n{"=" * len(tag.text)}'   elif tag.name == 'h3':     return f'{tag.text}\n{"-" * len(tag.text)}'   elif tag.name in ['h4', 'h5', 'h6', 'h7']:     return f'{"#" * int(tag.name[1:])} {tag.text}'   elif tag.name == 'pre':     return f'```\n{tag.text}\n```'

完整的代码

跑一下试试:

Scraping /r/Python...   - Retrieving https://imgs.xkcd.com/comics/python_environment.png       x fail or not html   - Retrieving https://thenextWEB.com/dd/2017/04/24/universities-finally-realize-java-bad-introductory-programming-language/#.tnw_PLAz3rbJ       => done, title = "Universities finally realize that Java is a bad introductory programming language"   - Retrieving https://github.com/numpy/numpy/blob/master/doc/neps/dropping-python2.7-proposal.rst       x fail or not html   - Retrieving http://www.thedurkweb.com/sms-spoofing-with-python-for-Good-and-evil/       => done, title = "SMS Spoofing with Python for Good and Evil"   ...

抓取的新闻文件:

怎么用Python代码实现新闻爬虫

“怎么用Python代码实现新闻爬虫”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么用Python代码实现新闻爬虫

本文链接: https://www.lsjlt.com/news/283797.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用Python代码实现新闻爬虫
    本篇内容介绍了“怎么用Python代码实现新闻爬虫”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!新闻源:Reddit我们可以通过Reddit...
    99+
    2023-06-16
  • python PyQt5 爬虫实现代码
    搞一个图形化界面还是挺酷的,是吧 安装库什么的应该不用多说了吧。。 一般来说会让你把 designer.exe(编辑图形化界面的东西,跟vb差不多) 当作外部工具导入到 pychar...
    99+
    2024-04-02
  • Python爬虫代码怎么写
    这篇“Python爬虫代码怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python爬虫代码怎么写”文章吧。爬虫是什么...
    99+
    2023-07-05
  • python实现Scrapy爬取网易新闻
    1. 新建项目 在命令行窗口下输入scrapy startproject scrapytest, 如下 然后就自动创建了相应的文件,如下 2. 修改itmes.py文件 打开s...
    99+
    2024-04-02
  • 如何用5行python代码爬取新闻网最新资讯
    这期内容当中小编将会给大家带来有关如何用5行python代码爬取新闻网最新资讯,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。大家都知道python语言的强大,以强大的胶水语言著称,其简洁性,实在是令其它语...
    99+
    2023-06-02
  • Python实现网页爬虫基本实现代码怎么编写
    Python实现网页爬虫基本实现代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python是一款功能强大的计算机程序语言,同时也可以被看做是一款面向...
    99+
    2023-06-17
  • Node.js简单实现爬虫代码怎么写
    以下是一个简单的Node.js爬虫代码示例: const request = require('request'); const c...
    99+
    2023-10-26
    Node.js
  • Python爬虫怎么实现搭建代理ip池
    这篇“Python爬虫怎么实现搭建代理ip池”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python爬虫怎么实现搭建代理i...
    99+
    2023-07-02
  • python爬虫实现最新12306抢票
    1.环境 python 3.7谷歌浏览器chromedriver.exe(浏览器驱动程序,要与浏览器版本对应,并将其添加到环境变量或放到当前py文件所在目录下) 2.相关模块 tim...
    99+
    2024-04-02
  • Python批量爬虫下载PDF文件代码实现
    本文的背景是:大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载,但是这样太费人力和时间了。我想起了之前的爬虫经验,给老师分析了一下可...
    99+
    2023-09-27
    python 爬虫 pdf
  • ​Python爬虫怎么实现url去重
    这篇文章主要介绍“Python爬虫怎么实现url去重”,在日常操作中,相信很多人在Python爬虫怎么实现url去重问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python爬虫怎么实现url去重”的疑惑有所...
    99+
    2023-06-02
  • Python爬虫实现搭建代理ip池
    目录前言一、User-Agent二、发送请求三、解析数据四、构建ip代理池,检测ip是否可用五、完整代码总结前言 在使用爬虫的时候,很多网站都有一定的反爬措施,甚至在爬取大量的数据或...
    99+
    2024-04-02
  • 如何使用python爬虫实现最新12306抢票
    这篇文章将为大家详细讲解有关如何使用python爬虫实现最新12306抢票,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.环境python 3.7谷歌浏览器chromedriver.exe(浏览器驱动程...
    99+
    2023-06-26
  • Python爬虫教程:200行代码实现一个滑动验证码
    Python爬虫教程:教你用200行代码实现一个滑动验证码做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动、点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的原理以及带大家实现一个...
    99+
    2023-06-02
  • Python爬虫技术入门实例代码分析
    这篇“Python爬虫技术入门实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python爬虫技术入门实例代码分析...
    99+
    2023-07-05
  • Python怎么实现selenium多线程爬虫
    要在Python中实现Selenium多线程爬虫,你可以按照以下步骤进行操作: 导入必要的库: from selenium im...
    99+
    2023-10-24
    Python selenium
  • 怎么使用Python爬虫
    本篇内容介绍了“怎么使用Python爬虫”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!导入模块import re fro...
    99+
    2023-06-16
  • Java 实现网络爬虫框架详细代码
    目录Java 实现网络爬虫框架一、每个类的功能介绍二、每个类的源代码Java 实现网络爬虫框架 最近在做一个搜索相关的项目,需要爬取网络上的一些链接存储到索引库中,虽然有很多开源的强...
    99+
    2024-04-02
  • Python爬虫XPath怎么用
    这篇文章主要为大家展示了“Python爬虫XPath怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python爬虫XPath怎么用”这篇文章吧。一、问题描述1.什么是XPath?xpath...
    99+
    2023-06-25
  • Python怎么进行简单的百度新闻爬取
    Python怎么进行简单的百度新闻爬取,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。这个实战例子是构建一个大规模的异步新闻爬虫,但要分几步走,从简单到复杂,循序...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作