100 行代码找出你中意的书
“ 阅读文本大概需要 5 分钟
炎热的夏天,酷暑难挡,难免会心烦意燥,睡前随手拿起枕边看过很多遍的「平凡的世界」。看书,会让躁动的心瞬间安静下来。
生活不能等待别人来安排,要自己去争取和奋斗;而不论其结果是喜是悲,但可以慰藉的是,你总不枉在这世界上活了一场。有了这样的认识,你就会珍重生活,而不会玩世不恭;同时,也会给人自身注入一种强大的内在力量。
——路遥 《平凡的世界》
读完一本书后,是不是发现找不到合适的书看了?今天就给大家分享下怎么用 python 爬虫找出你中意的书。
今天的目标网站是豆瓣读书,把豆瓣读书里的书本信息爬取下来,保存为 csv 文件,保存的信息包括:书籍类型、书籍名称、作者、译者、豆瓣评分、出版社、出版日期、评价人数、价格、简介。
爬取结果:
项目环境
语言环境:python 3.6
编辑工具:PyCharm
导包:requests、BeautifulSoup、time、random、csv
程序结构:
程序主要是由 6 个函数组成:
get_html():用 requests 请求页面,返回页面 html 源码。
get_pageurl(base_url):从 html 源码中提取分页链接部分字段。
def bookinfo(url):提取图书信息,以列表形式返回。
get_num(person):判断评价人数,没有评价人数的图书按 10 人处理。
write2csv():将图书信息保存为 csv 文件。
main():程序执行的主函数。
程序思路:
1.分析豆瓣读书链接,分析分页链接规律。
2.循环提取链接中书本信息。
3.将书本信息保存为 csv 文件
源码请求
为了防止反爬,需要模拟真实浏览器访问,请求网页时加入代理 IP 和请求头 headers。
分析不同的图书标签的规律,发现是只是链接后面的 tag 不同,从源码中提取全部 tag 和固定 url 进行拼接形成新的 url 链接列表并返回。
提取图书信息
data=[]
for bookname, detail, rating, person, intro in zip(booknames, details, ratings, peoples, intros):
info = {}
try:
info['类型']=tag
booktitle = bookname.get_text().split()[0]
info['书籍名称'] = booktitle
author = detail.get_text().split('/', 4)[0].lstrip('\n ').rstrip('\n ')
info['作者'] = author
translator = detail.get_text().split('/', 4)[1]
info['译者'] = translator
rating_num = rating.get_text() # 评分
info['豆瓣评分'] = rating_num
press = detail.get_text().split('/', 4)[2]
info['出版社'] = press
date = detail.get_text().split('/', 4)[3].split('-')[0]
info['出版日期'] = date
price = detail.get_text().split('/', 4)[4].lstrip('\n ').rstrip('\n ')
info['价格'] = price
person = get_num(person) # 评价人数
info['评价人数'] = person
introduction = intro.get_text()
info['简介'] = introduction
data.append(info)
except IndexError:
try:
info['类型'] = tag
booktitle = bookname.get_text().split()[0]
info['书籍名称'] = booktitle
author = detail.get_text().split('/', 3)[0].lstrip('\n ').rstrip('\n ')
info['作者'] = author
translator = ""
info['译者'] = translator
press = detail.get_text().split('/', 3)[1]
rating_num = rating.get_text()
info['豆瓣评分'] = rating_num
info['出版社'] = press
date = detail.get_text().split('/', 3)[2].split('-')[0]
info['出版日期'] = date
price = detail.get_text().split('/', 3)[3].lstrip('\n ').rstrip('\n ')
info['价格'] = price
person = get_num(person)
info['评价人数'] = person
introduction = intro.get_text()
info['简介'] = introduction
except (IndexError, TypeError):
continue
except TypeError:
continue
return data
这里对有译者图书信息的提取和没有译者的图书信息提取分开做了处理。
数据保存
将数据通过循环跳转分页保存数据,每次分页时加了个随机等待几秒的操作,反爬虫操作。
这样,你就可以打开爬下来 CSV 图书文件,用 Excel 打开,通过豆瓣评分和简介来找你中意的书了。
源码在微信后台回复「豆瓣读书」可以获取。
推荐阅读
python 爬虫爬取煎蛋网妹子图
关注我,一起共同进步吧!