Python爬虫笔记:豆瓣图书TOP250单页内容提取

前言

上次我们通过glidedsky的第一关实现了获取到单页的数据,但是可能有些小伙伴会觉得只是获取到一些数字并不能直观的体现出Python爬虫的方便之处。
所以今天我跟大家分享一个小小的案例,这不是在家空闲时间比较多,又不想太过于颓废,于是我打算在豆瓣挑选一些评分比较高的书分享给大家。
当然手动筛选工作量太大了,所以我决定用python写一个爬虫,爬取豆瓣图书TOP250的简单数据,并整理成表格保存在本地。


image.png

网页元素分析

因为上篇文章只讲了获取单页数据,所以这次我们的目标也是先获取一页数据。
这个页面本身比较干净,数据也很清晰,获取会比较方便一些。
还是先f12查看页面元素,确定所要获取的数据。


image.png

通过审查元素可以看出所有数据特点:

书名包含在a标签中,
作者及出版社等信息保存在命名为pl的p标签中,并通过斜杠分割不同数据,
评分保存在class=allster_rums的span标签中,
评价人数在class='pl'的span标签中,

发现了吗?这些数据没有做任何加密,同时每一个数据标识各不相同,非常容易分辨。
这也是为什么很多人在初学爬虫时都会接触到爬取豆瓣top250例子的原因,因为数据内容有用,爬取难度相对较小。
这里还需要注意一个问题,就是这部分图书并不全是中文书籍,还有一部分是外文书,这就导致了他们之间有一个地方数据有差别:


image.png

外文书会多出一个译者名字,所以之后在保存数据到表格文件中时,需要特别注意。

代码实现

在开始之前还是先明确一下程序执行流程:

  • 访问网页
  • 获取源代码
  • 提取数据
  • 分别保存到excel文件中
    首先解决访问网页和获取源代码的问题:
import requests
from bs4 import BeautifulSoup
url = 'https://book.douban.com/top250?start='
headers = {
    'cookie':'你自己的cookie',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}

response = requests.get(url,headers=headers).text
bs4 = BeautifulSoup(response,'html.parser')
print(bs4)
image.png

获取到之后当然就是对数据进行提取

bookName = bs4.find_all('div',class_='pl2')
for book in bookName:
    name = book.find('a')
    name = name.text.strip()
    name = name.replace(' ','')
    print(name)

这段代码首先在获取到的html文本中寻找Class=pl2的div元素

image.png

这是没有提取a标签中书名时的原始数据
find_all()是BeautifulSoup模块提供的一个用来快速查询数据的方法,返回一个列表。
所以我们下面使用for循环遍历出所有找到的数据。
从上面的图片中可以看到,只匹配div元素的话会有很多干扰数据,我们此时只想要一个书名,也就是a标签的文本信息。
所以我们还需要在列表中使用find()方法匹配到a标签的内容,然后使用strip方法去除两边空格,使用replace方法将文本中多余的空格替换为空,最终可以得到:
image.png

获取到数据之后,我们希望能够把它存放到excel文件中的话需要用到一个外部库xlwt

image.png

使用pip命令安装xlwt(因为我的电脑中同时安装了py2和py3,所以将pip的版本进行了区分,只有一个python的话直接用pip即可)
然后使用 import xlwt在程序中引入该模块。

wb = xlwt.Workbook()
ws = wb.add_sheet('test_sheet')
ws.write(0,0,'书名')
ws.write(0,1,'出版信息')
ws.write(0,2,'评价人数')
ws.write(0,3,'评级')
wb.save('doubanTest.xls')

首先实例化workbook()对象,然后调用了add_sheet()方法为这个excel文件新建一个表

image.png

关于这个add_sheet()方法,前面说过python调用的外部模块保存在*Python安装目录\Lib\site-packages*下,所以我们可以在这个目录下找到Workbook类文件,从这里面查看add_sheet()的具体实现方法以及主要参数。
image.png

注意这段代码中引入Worksheet这个文件,本文中主要用到的是Worksheet中的write()方法,即将数据保存到表格文件中。
image.png

在Worksheet.py中找到write函数,注释给的非常详细,r和c分别是row和column的缩写,表示从0开始的行和列。
label参数默认为空,表示数据。
这样一来上述代码就通了,表示在第一行从第一列开始分别添加标题。
image.png

所有东西都设置好了之后就是保存这个文件,使用Workbook中的save()方法
image.png

传入一个文件名即可。
这块啰嗦了一点,主要还是希望大家能够养成多看引入模块源文件的习惯。
其他数据的获取其实和获取书名类似
获取作者及出版信息

i = 1
j = 1
k = 1
l = 1
authors = bs4.find_all('p',class_='pl')
for author in authors:
    anthor = author.text
    ws.write(j,1,author)
    j+=1
    print(author)

获取评分及评价人数

rating_nums = bs4.find_all('div',class_='star clearfix')
for rating in rating_nums:
    star = rating.find_all('span')
    reg = '\d+'
    vote = re.findall(reg,star[2].text)
    ws.write(k,2,vote)
    ws.write(l,3,star[1].text)
    k+=1
    l+=1
wb.save('doubanTest.xls')

ijkl分别代表的是不同的行数,作用在于换行时使用。
这里还有一点需要注意的地方,在获取评分及评价人数时,因为两个数据在同一个div下保存,而且是同级别的span标签并列表示的。
所以使用find_all()方法获取到全部span标签内容后可以使用下标的方式查询到不同的数据。


image.png

至此,我们的程序就大功告成了,运行后会在该目录下生成一个douban.xls文件


如果出现这种错误


image.png

说明你之前已经生成了一个doubanTest.xls文件而且没有关闭它。
解决办法是更改生成的文件名或者将原文件关闭。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容