前言
先上一波爬取的结果:
数据库中部分截图
实战
引入类库
分析页面请求
分析目标页面
打开开发者模式,查看链接
点击任意标签,分析页面请求
分别请求不同的标签页面,分析请求链接,可以发现如下规律:
由此,我们可以构建以下代码,以获取标签页面所有标签链接:
我们进入单个标签页面,分析图书列表页面,解析我们需要存储的字段
我们通过bs4解析我们需要的字段,如:出版时间,作者/译者,豆瓣评分,售价,评价人数等。
到这里,我们已经可以获取到单个tag下单页的图书信息,这个时候我们只需要加入翻页功能就可以实现单个tag下所有图书的信息爬取。
点击下一页,分析页面请求
可以看到页面多了start和type两个参数,同时start参数是从0开始并以20的偏移量递增的,我们按照这个规律可以构建一个生成器以生成start参数。
从文章的第一张图,可以看出不同的tag页有不同的数量的图书,那页面数量也不尽相同,这时应该如何构建生成器?
这个时候我们发现所有的tag在第50页之后都请求不出信息了,所以我们只需构建前50页的页面链接即可,第51页显示如下:
第51页的显示结果
反反爬
豆瓣的反爬简单粗暴,直接封IP,为了爬虫的健壮,可以使用代理或者随机Header+随机时延的方式,随机时延可以设置为30到40之间,不过这样大大影响了爬取速率,如果需要快速爬取可以采用代理+多线程+随机Header+随机时延这样就能避过反爬又能快速爬取。
留心
写给之后的自己
文章是写完代码后,重新回顾的时候写的,回顾之后发现有很多需要优化的地方,比如异常处理部分经常考虑不周导致在爬取的时候异常中断,不得不重新排查错误。还有爬虫的断点续传的功能应该去了解学习下。
尾言
领取专属 10元无门槛券
私享最新 技术干货