python爬虫实践——零基础快速入门(三)爬取豆瓣图书

上一篇文章讲的是python爬虫实践——零基础快速入门(二)爬取豆瓣电影,爬取豆瓣电影一页的信息。那想要爬取多个网页信息呢?那写代码就有点不够了。

下面我们来爬取豆瓣TOP250图书信息,地址如下:

https://book.douban.com/top250

我们要爬取哪些信息呢?如下图:

1.检查并复制《追风筝的人》书名的xpath如下:

我们按照同样套路来尝试一下:

我靠,什么情况,居然返回是空值???

注意:浏览器复制的 xpath 信息并不是完全 可靠的,浏览器经常会自己在里面增加多余的 tbody 标签,我们需要手动把这些标签删掉。

修改xpath后再来尝试一下,结果如下:

输出:

完美,终于把数据搞下来了,接着往下走~~

切记:浏览器复制xpath 不是完全可靠的,看到tbady标签要特别注意,可以去网页源码看看是否这一层级。

2、爬取多本书名的xpath信息

对比不同的书名的xpath信息,分别复制《追风筝的人》,《小王子》,《围城》,《解忧杂货铺》“书名”的xpath信息进行对比:

比较可以发现书名的xpath信息仅仅table后的序号不一样,并且跟书的序号一致,于是去掉序号,我们就可以得到所有书名通用的xpath信息:

OK,我们试着把这一页所有书名都爬取下来:

结果如下:

这样,就把所有书名都爬取下来了,我们继续啊,爬取评分,评价

3、爬取多本书的评分xpath信息

分别复制《追风筝的人》,《小王子》,《围城》,《解忧杂货铺》“评分”的xpath信息进行对比:

发现,还是table序号不一样,所以,你已经可以快速写出页面全部评分的xpath信息了:

虽然你狠自信,但还是要看一下 能否把评分爬取下来:

结束输出:

OK,接下来我们把两种元素合在一起进行爬取:

结果输出:

看起来是不是很简单,是不是感觉登上了人生巅峰了~~

但其实这里面的坑你是想不到的。

4、异常处理

仔细看下面代码:

这里我们默认书名和评分爬到的都是完全、正确的信息,这种默认情况一般没有问题,但其实是有缺陷的,如果我们某一项少爬或者多爬了信息,或者有些书根本就没有评分,那么两种数据的量就不一样了,从而匹配错误,比如下面的例子~~

书名xpath后的title改为text()

获取的文本数量与评分数量不一致,出现匹配错误。

结果:

那你说怎么办??怎么办???

5、爬取整本书的信息

如果我们以每本书为单位,分别获取对应的信息

书名的标签肯定在这本书的框架内,于是我们从书名的标签上找,发现覆盖整本书的标签(左边网页会有代码包含内容的信息)。把xpath信息复制下来:

我们将整本书和书名、评分的xpath信息进行对比:

不难发现,书名和评分 xpath 的前半部分和整本书的xpath 一致

那我们可以通过这样写 xpath 的方式来定位信息:

ok ,在实际代码中实现一下:

结果输出:

刚刚我们爬了一本书的信息,那想要爬取真个页面或者多个页面的信息呢?很简单啊,把xpath中定位的序号续貂就ok了。

来看一下新代码:

结果输出:

是吧,终于看到完整代码了,不过,等等~~~

这里为什么后面多了个 [0] 呢?

我们之前爬出来的数据是以列表的形式输出,像这样

外面带个框不好看,列表只有一个值,对其去一个值就可以了,根据我们列表的访问方式,我门取第一个就行,不会的可以去看下列表的操作啊。

接下来,就照猫画虎,按照同样的方式多爬几条数据下来,比如评价人数、一句话总结、对应的链接等。

追风筝的人-->8.9-->为你,千千万万遍-->300174人评价 -->https://book.douban.com/subject/1770782/

小王子-->9.0-->献给长成了大人的孩子们-->234507人评价 -->https://book.douban.com/subject/1084336/

围城-->8.9-->对于“人艰不拆”四个字最彻底的违抗-->194599人评价 -->https://book.douban.com/subject/1008145/

解忧杂货店-->8.6-->一碗精心熬制的东野牌鸡汤,拒绝很难-->262603人评价 -->https://book.douban.com/subject/25862578/

有一点需要注意:

这行代码用了几个strip() 方法,() 里面表示要删除的内容,strip(‘(‘) 表示删除括号,strip() 表示删除空白符。

如果不用strip() 方法,有很多无用的信息会被爬取,内容混乱,如下:

爬取了括号等不必要的信息。所以我们把他们删除。

6、爬取多个页面的图书信息

OK,已经搞定一个页面了,下面我们爬取所有页面,共25页的信息。

先来看一下翻页后,url 是如何变化的。

第一页:https://book.douban.com/top250?start=0

第二页:https://book.douban.com/top250?start=25

第三页:https://book.douban.com/top250?start=50

第四页:https://book.douban.com/top250?start=75

…… ……..

url 变化很规律,只是start=() 的数字不一样而已

而且是已每页25为单位递增。什么?25?这不正是每页书籍的数量吗?

所以只需要加个循环即可。

写一个简单循环来遍历所有 url :

OK,这样就可以运行完整代码了。真是不容易,但是想通了也就很容易了。赶快去试试吧~~~~

注意:这里加个sleep语句,以免爬太快,IP被封,虽然豆瓣反爬虫力度不大,但还是要养成这个习惯,去爬任何网站都适用。

另外:python的 range() 语法不会用的童鞋,自己要看看啊,毕竟基础很重要的。

下一篇将讲解 python爬虫实践——零基础快速入门(四)爬取小猪租房信息敬请期待哦。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180228G0P1JE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动