Python爬虫案例:抓取豆瓣编程类高评分书籍

对于不少正在学习计算机的朋友来讲,选择合适的学习材料是很是重要的。
本文将经过 Python 来爬取豆瓣编程类评分大于 9.0 的书籍。
此案例很适合入门爬虫的朋友学习,总共也就 3 个函数。

下图是最终的结果:
python

下面进入正题:

1、采集源分析:

首先咱们找到豆瓣的编程类书籍网址:正则表达式

https://book.douban.com/tag/编程

进入网址以后咱们翻到最下面的分页导航:

编程

经过分析分页地址咱们能够得出:后端

https://book.douban.com/tag/%...{偏移量}&type=T

这个地址则是咱们要采集的内容。第一页 start = 0,第二页 start = 20 ... 以此类推。数组

找到了要采集的 URL 以后,接下来就是分析咱们真正须要的数据在 HTML 文档中的位置。数据结构

F12 打开控制台发现,这些 li 标签正是咱们的目标内容。

书名、评论、评分分别对应li 下面的 h2 标签、class 为 rating_nums 的 span 标签, class 为 pl 的 span 标签。多线程

见下图:
函数

有了以上内容,那么咱们很容易就有了思路:学习

  1. 抓取页面上全部的 li 标签
  2. 循环处理这里 li 标签,找到咱们所需的三个内容,并存储到列表中
  3. 根据评分排序
  4. 保存数据到 csv

2、依赖的包:

除了上次使用到的 requests, BeautifulSoup, 还增长了几个包。编码

  • re 正则表达式处理
  • numpy 很强大的数据处理库,由于本文要进行排序,因此使用这个包会很方便
  • csv 用于把最终的结果保存到csv中
  • time 这里主要用到了 sleep 功能

3、编码

  1. 首先咱们定义一个 get 函数,接受一个页码,表示要爬取到多少页。

这个函数的主要功能就是抓取指定页码全部的书的信息,包括书名、评分、评论数。而且保存到一个二维数组中。



代码解读:

由于豆瓣的分页是根据 URL 中的 start 参数(至关于偏移量)来分的,因此在刚开始定义了一个 offset 变量,根据咱们传入的页码来计算正确的 start 参数的值。

后面经过 find_all 方法获取全部的 li 对象,存入 book_info_list 列表中,那么接下来就是遍历这个列表,从每个元素中获得 star、 title、comment 三个变量。最终获得一个二维数组 result。

  1. 定义排序方法,接收上面得出的 result 变量,而且将这个列表根据评分来排序。

  1. 将最终排好的数据写入 csv 中。

4、总结

以上则是咱们爬取豆瓣的小案例,有经验的朋友们会发现这个案例有很大的不足之处。

在运行这个程序的时候,咱们会发现会很是缓慢。缘由就是每次请求豆瓣的分页 URl 以后,接下来紧跟着一条龙的获取书名等操做,获取完这个页面的全部数据以后再接着抓取下一个分页页面。也就是彻底同步的编码方式。因此慢是必然的。

那么如何调整代码结构才能使程序运行迅速呢?

这里介绍一个简单又经常使用的方法:

咱们能够采用多线程技术,python 的 threading 包是专门用于多线程处理的。采用这种方式又多增长了两个包:

  1. threading
  2. queue

能够将上述代码的下载分页 URL 部分代码放入一个单独的线程去跑,并将下载好的 HTML 文档存入一个队列中。而后多开几个线程去队列中读取数据,并用 BS4 来分析,将分析获得的 list 数据结构追加到外部的另外一个list 中。最后再去排序这另外一个列表。

获取源码请到:“ 后端漫谈 ” 公众号后台回复 “douban”。

相关文章
相关标签/搜索