现今网络资源发达,其中数据就是一个重要的网络资产。而Python对于爬取网络数据的库很多,其中requests是一个非常人性化的HTTP客户端库。今天我们就用他来快速列出当天的热点事件和对应的热度指数。
安装相关库
pip install requestspip install bs4
定义主要的方法
- 实际就2步,获取页面和解析页面
目标网页
首先要确定的是,我们要从哪个网页中获取当天的热点事件。本文选取某度的今日热点,如上图。数据就在右边红框的表格中。
分析数据位于网页中的位置
- 要确定我们的数据的所在位置,最好的做法就是借助浏览器的工具,大部分的浏览器都提供开发人员工具(F12),可以快速定位页面的物件所在的html位置。
- 上图可以看到,我们需要的数据在一个div标签下的一个table标签里面。为什么不直接找table来定位?因为页面中有很几个table
- 同样地,页面也有许多div,不过,div的class='mainbody'的只有一个,因此我们使用上述的条件进行定位
- table下的每一行就是一个tr,注意第一个tr是标题,我们不需要
- 每个tr下都有4个td,就是表格中的4列
讲解代码
按照上图的代码行号来说明
- (#15) 调用方法requests.get(),获取网页内容,输入了一个请求参数b=341。headers其实不需要指定也可以的
- (#16) requests会自动根据服务器返回的指定编码做处理,但很多时候是错误,比如这里,实际上编码是gbk,但网页返回的只是iso-xxx。因此这里指定我们需要的编码
- (#18) 调用rp.text即可获取网页内容。然后实例化一个 BeautifulSoup对象,实例化时传入网页内容即可
- (#22-24) 通过BeautifulSoup对象的方法find可以方便找出某个标签。这里的查找逻辑于上面的位置分析一样。注意一点是,通过tbs('tr')可以直接列出一个table下的所有的tr标签
- (#26) 之前说过,第一行是标题,我们不需要,所以用 rows[1:] 跳过第一行
- (#27-32) 在遍历中的 r,就是每一行了,因此通过 r('td') 就是行中的所有的td,r('td')[0] 相当于这行中的第一个列
下面就是结果
- 第一位是吴彦祖出事了
- 我们还看到华为的主题有两条
今天的重点
- requests.get(),获取网页内容
- requests.get()返回的对象的encoding用于调整返回text的编码
- BeautifulSoup对象用于方便解析html结构。其中find方法查找第一个符合条件的标签,直接使用tag('tr') 相当于调用方法 find_all,找出多个符合条件的标签
最后
使用Python可以方便爬取网络上的数据,本文以获取今日热点数据为例子做一个简单介绍,虽然例子中只是爬取了数据,但我们可以更进一步去利用这些数据。
比如:利用之前介绍过的情绪分析库,汇总当天所有标题的关键字和情绪倾向
不要限制自己的思维,好好利用学到的知识,你会发现你可以做到的不仅仅于此。
今天就到这里,我的风格就是用实例来学习,欢迎大家留意告诉我有趣的例子,如果对本文代码有疑问可以关注并留言给我。