先来看看页面长啥样的:https://book.douban.com/top250


我们将要爬取哪些信息:书名、链接、评分、一句话评价……

1. 爬取单个信息

我们先来尝试爬取书名,利用之前的套路,还是先复制书名的xpath:


得到第一本书《追风筝的人》的书名xpath如下:

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a


得到xpath,我们就可以按照之前的方法来尝试一下:


返回的竟然是空值,这就很尴尬了。

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


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

切记:浏览器复制 xpath 不是完全可靠,看到 tbody 标签特别要注意。


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

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[1]/a

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

//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[1]/a


好了,我们试试把这一页全部书名爬下来:

2.爬取多个信息


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

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[2]/span[2]
//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[2]/span[2]
//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[2]/span[2]
//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[2]/span[2]

相信你已经可以秒写出爬取全部评分的xpath了:

//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[2]/span[2]

把评分的xpath放入之前的代码,运行:


现在我们再把书名和评分同时爬取下来:


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

书名xpath 后的@title 改为 text(),获取的文本数量与评分数量不一致,出现匹配错位。


如果我们以每本书为单位,分别取获取对应的信息,那肯定完全匹配


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

//*[@id="content"]/div/div[1]/div/table[1]


我们将整本书和书名的xpath进行对比

//*[@id=“content”]/div/div[1]/div/table[1]   #整本书
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a   #书名
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2]   #评分


不难发现,书名和评分 xpath 的前半部分和整本书的 xpath 一致的,
那我们可以通过这样写 xpath 的方式来定位信息:

file=s.xpath(“//*[@id=“content”]/div/div[1]/div/table[1]”)
title =div.xpath(“./tr/td[2]/div[1]/a/@title”)
score=div.xpath(“./tr/td[2]/div[2]/span[2]/text()”)


在实际的代码中来看一下:


刚刚我们爬了一本书的信息,那如何爬这个页面所有书呢?很简单啊,把 xpath 中

后面定位的序号去掉就ok。


终于看到庐山真面目了,不过,等等~

title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]

为什么这两行后面多了个 [0] 呢?我们之前爬出来的数据是列表,外面带个方框,看着非常难受,列表只有一个值,对其取第一个值就OK。如果不熟悉列表的知识,可以回去补补。

接下来就是按照这样的方式多爬几个元素啦!


有一个点需要注意的是:

num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")")

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

嗯,已经把一个页面搞定了,接下来需要,把所有页面的信息都爬下来。

3.翻页,爬取所有页面信息

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

https://book.douban.com/top250?start=0   #第一页
https://book.douban.com/top250?start=25   #第二页
https://book.douban.com/top250?start=50   #第三页

url 变化的规律很简单,只是 start=() 的数字不一样而已,而且是以每页25为单位,递增25,这不正是每页的书籍的数量吗?于是,我们只需要写一个循环就可以了啊。

for a in range(10):    url = 'https://book.douban.com/top250?start={}'.format(a*25)#总共10个页面,用 a*25 保证以25为单位递增


这里要强调一下 Python range() 函数

基本语法:range(start, stop, step)
start:计数从 start 开始。默认是从 0 开始。例如 range(5) 等价于range(0,5);
end:计数到 end 结束,但不包括 end。例如:range(0,5)是 [0,1,2,3,4] 没有5
step:步长,默认为1。例如:range(0,5) 等价于 range(0,5,1)

>>>range(10)    #从 0 开始到 10 (不包含)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 11)    #从 1 开始到 11 (不包含)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> range(0, 30, 5)    #从0到30(不包含),步长为5
[0, 5, 10, 15, 20, 25]


加上循环之后,完整代码如下:

from lxml import etree
import requests
import timefor a in range(10):url = 'https://book.douban.com/top250?start={}'.format(a*25)data = requests.get(url).texts=etree.HTML(data)file=s.xpath('//*[@id="content"]/div/div[1]/div/table')time.sleep(3)for div in file:title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip()scrible=div.xpath("./tr/td[2]/p[2]/span/text()")if len(scrible) > 0:print("{},{},{},{},{}\n".format(title,href,score,num,scrible[0]))else:print("{},{},{},{}\n".format(title,href,score,num))


来运行一下:

请务必要自己练习几遍,你觉得自己看懂了,还是会出错,不信我们赌五毛钱。

Python 的基础语法很重要,没事的时候多去看看:字符串、列表、字典、元组、条件语句、循环语句……

编程最重要的是实战,比如你已经能够爬TOP250的图书了,去试试TOP250电影呢。

好了,这节课就到这里!

白白~

如果你想有专业老师授课、有系统性知识、有实时在线答疑的老师的话,可以加入我们的课程《Python爬虫(入门+进阶)》。

下节预告:Python爬虫入门 | 5 爬取小猪短租租房信息

完整7节课程目录:
Python爬虫入门 | 1 Python环境的安装
Python爬虫入门 | 2 爬取豆瓣电影信息
Python爬虫入门 | 3 爬虫必备Python知识
Python爬虫入门 | 4 爬取豆瓣TOP250图书信息
Python爬虫入门 | 5 爬取小猪短租租房信息
Python爬虫入门 | 6 将爬回来的数据存到本地
Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题

Python爬虫入门 | 4 爬取豆瓣TOP250图书信息相关推荐

  1. Python爬虫入门(爬取豆瓣电影信息小结)

    Python爬虫入门(爬取豆瓣电影信息小结) 1.爬虫概念 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或脚本.爬虫的本质是模拟浏览器打开网页,获取网页中我们想要的那部分数据. 2.基本流程 ...

  2. python采用requests+bs4爬取豆瓣top250电影信息

    爬取豆瓣top250电影说明 (链接:https://movie.douban.com/top250,可爬取一页或者多页(输出电影的正标题(肖申克的救赎),副标题( The Shawshank Red ...

  3. 基于Requests的Python爬虫入门实例------爬取豆瓣图书排行榜的前25本图书(小白福利)

    话不多说,先上代码: # -*- coding:utf-8 -*- import sys import requests import lxml from bs4 import BeautifulSo ...

  4. python爬取b站搜索结果_Python爬虫实例:爬取猫眼电影——破解字体反爬,Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取,Python爬虫实例:爬取豆瓣Top250...

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  5. Python爬虫入门 | 5 爬取小猪短租租房信息

    小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 小猪短租(成都)页面:http://cd.xiaozhu.com/   1.爬取租房标题 ...

  6. Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除)

    Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除) import requests from bs4 import BeautifulSoup import ti ...

  7. [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

    这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...

  8. Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(下)

    在Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(上)中,我们最后爬出来的结果不是很完美,这对于"精益求精.追求完美的"程序猿来说怎么能够甘心 所以,今天,用pyth ...

  9. python爬虫入门(一)爬取钓鱼吧

    python爬虫入门(一)爬取钓鱼吧 # Date : 2022/1/1 17:11 ''' 需求:1.输入贴吧名称:钓鱼吧https://tieba.baidu.com/f?kw=钓鱼吧&p ...

最新文章

  1. “吴恩达deeplearningai”微信公众号上线,将发布《机器学习训练秘籍》
  2. Python之lambda表达式和内置函数
  3. 使用thymeleaf中超链接失效
  4. 如何利用反射实现EL表达式
  5. 可能是全网首个前端源码共读活动,诚邀加入学习
  6. 03-27 耗电量测试
  7. Discuz论坛分表以及memcache缓存优化
  8. Java ResultSet教程
  9. 【报错】android.database.sqlite.SQLiteException: no such column: id (code 1): , while compiling: select
  10. Datawhale 社区黑板报(第1期)
  11. 【MySQL:查看自己数据库文件所在的位置】
  12. matlab app designer:夫琅禾费圆孔衍射仿真
  13. 无线共享打印机无法连接服务器,“不能连接网络共享打印机”常见原因及处理方法:...
  14. java第十一次作业
  15. 背包问题(Knapsack Problem)—— 0/1 背包问题 —— 总价值最大问题
  16. 三d眩晕可以学计算机,如何才能避免3D晕眩?3种方法教你解决!
  17. 计算机自动计算的条件,电脑表格怎样自动计算
  18. 10个最佳iOS Photo App模板
  19. Swoole实现基于WebSocket的群聊私聊
  20. favicon.ico文件简介

热门文章

  1. VirtualBox找不到桥接网卡问题解决
  2. 日期选择器 当前日期之前不允许选择
  3. NC65点击单据按钮打开web窗口
  4. SpringBoot 速记
  5. 华为手机,果然有顶级的产品经理 —— 手机克隆太好用了
  6. 12306 Bug:同一张身份证,买了同一车次的两张票
  7. 蓝桥杯-第九届决赛——整理玩具
  8. MSSQL之一 数据库系统简介 与SQL Server 2008概述
  9. oss 浏览器访问pdf文件不能预览
  10. 虫师Selenium2+Python_4、webdriver API