爬虫系列之豆瓣图书排行
豆瓣上有图书的排行榜,所以这次写了一个豆瓣的爬虫。
首先是分析排行榜的url
根据这个可以很容易的知道不同图书的排行榜就是在网站后面加上/tag/【类别】,所以我们首先要获得图书的类别信息。
这里可以将读书首页的热门标签给爬下来。
爬取标签内容并不难,代码如下:
1 def getLabel(url): #获得热门标签 2 html = getHTMLText(url) 3 soup = BeautifulSoup(html, 'html.parser') 4 a = soup.find_all('a') 5 label_list = [] 6 for i in a: 7 try: 8 href = i.attrs['href'] 9 match = re.search(r'/tag/.*', href) 10 if match and match[0][5]!='?': 11 label_list.append(match[0]) 12 except: 13 continue 14 return label_list
接下来是进入排行榜页面进行信息爬取,
代码如下:
1 def getBookInfo(): 2 label_list = getLabel('https://book.douban.com/') 3 label = get_label(label_list) 4 name = [] 5 author = [] 6 price = [] 7 score = [] 8 number = [] 9 for page in label_list[int(label)-1:int(label)]: 10 for i in range(2): 11 html = getHTMLText('https://book.douban.com' + page + '?start=' + str(i*20) + '&type=T') 12 soup = BeautifulSoup(html, 'html.parser') 13 book_list = soup.find_all('div', attrs={'class':'info'}) #找到书籍的信息列表 14 for book in book_list: 15 a = book.find_all('a',attrs={'title':re.compile('.*')})[0] #找到包含书籍名的a标签 16 name.append(a.get('title')) #获得标题属性 17 18 pub = book.find_all('div', attrs={'class':'pub'})[0] 19 pub = pub.string.strip().replace('\n','') 20 author.append(re.findall(r'(.*?)/', pub)[0].strip()) 21 split_list = pub.split() #空格分割 22 for j in split_list: 23 match = re.search(r'\d.*\..*', j) #获得价格信息 24 if match: 25 price.append(match[0]) 26 27 span = book.find_all('span', attrs={'class':'pl'})[0] #获得评价人数所在标签 28 span = span.string.strip().replace('\n','') 29 number.append(re.findall(r'\d+', span)[0]) #获得人数 30 31 span = book.find_all('span', attrs={'class':'rating_nums'})[0] 32 score.append(span.string) 33 34 tplt = "{:3}\t{:15}\t{:15}\t{:10}\t{:4}\t{:7}" #规定输出格式 35 print(tplt.format("序号", "书籍", "作者", "价格", "评分", "评价人数")) 36 l = len(name) 37 for count in range(l): 38 print(tplt.format(count+1, name[count],author[count],price[count],score[count],number[count]))
最终的总代码为:
1 import requests 2 import re 3 from bs4 import BeautifulSoup 4 5 6 def getHTMLText(url): 7 try: 8 r = requests.get(url, timeout=30) 9 r.raise_for_status() 10 r.encoding = r.apparent_encoding 11 return r.text 12 except: 13 return "" 14 15 16 def getLabel(url): #获得热门标签 17 html = getHTMLText(url) 18 soup = BeautifulSoup(html, 'html.parser') 19 a = soup.find_all('a') 20 label_list = [] 21 for i in a: 22 try: 23 href = i.attrs['href'] 24 match = re.search(r'/tag/.*', href) 25 if match and match[0][5]!='?': 26 label_list.append(match[0]) 27 except: 28 continue 29 return label_list 30 31 32 def get_label(label_list): 33 count = 1 34 for i in label_list: 35 print(str(count) + ': ' + label_list[count-1][5:] + '\t', end='') 36 count = count + 1 37 choose = input('\n\n请输入你想查询的图书类别:') 38 while int(choose)<=0 or int(choose)>=count: 39 choose = input('\n请输入正确的类别编号:') 40 return int(choose) 41 42 def getBookInfo(): 43 label_list = getLabel('https://book.douban.com/') 44 label = get_label(label_list) 45 name = [] 46 author = [] 47 price = [] 48 score = [] 49 number = [] 50 for page in label_list[int(label)-1:int(label)]: 51 for i in range(2): 52 html = getHTMLText('https://book.douban.com' + page + '?start=' + str(i*20) + '&type=T') 53 soup = BeautifulSoup(html, 'html.parser') 54 book_list = soup.find_all('div', attrs={'class':'info'}) #找到书籍的信息列表 55 for book in book_list: 56 a = book.find_all('a',attrs={'title':re.compile('.*')})[0] #找到包含书籍名的a标签 57 name.append(a.get('title')) #获得标题属性 58 59 pub = book.find_all('div', attrs={'class':'pub'})[0] 60 pub = pub.string.strip().replace('\n','') 61 author.append(re.findall(r'(.*?)/', pub)[0].strip()) 62 split_list = pub.split() #空格分割 63 for j in split_list: 64 match = re.search(r'\d.*\..*', j) #获得价格信息 65 if match: 66 price.append(match[0]) 67 68 span = book.find_all('span', attrs={'class':'pl'})[0] #获得评价人数所在标签 69 span = span.string.strip().replace('\n','') 70 number.append(re.findall(r'\d+', span)[0]) #获得人数 71 72 span = book.find_all('span', attrs={'class':'rating_nums'})[0] 73 score.append(span.string) 74 75 tplt = "{:3}\t{:15}\t{:15}\t{:10}\t{:4}\t{:7}" #规定输出格式 76 print(tplt.format("序号", "书籍", "作者", "价格", "评分", "评价人数")) 77 l = len(name) 78 for count in range(l): 79 print(tplt.format(count+1, name[count],author[count],price[count],score[count],number[count])) 80 81 82 83 if __name__ =='__main__': 84 print('豆瓣图书综合排序查询\n') 85 getBookInfo() 86
最后的运行效果:
首先是类别表:
输入图书类别后就可以显示图书信息了:
我这里只爬取了两页的图书信息。
因为有些书的信息是不完整的,所以在爬取时可能会出现错误。我正则表达式写得也不是很好,很多地方都是会出错的,比如价格那儿。
转载于:https://www.cnblogs.com/zyb993963526/p/9188881.html
爬虫系列之豆瓣图书排行相关推荐
- Python爬虫系列(七)豆瓣图书排行榜(数据存入到数据库)
豆瓣用户每天都在对"读过"的书进行"很差"到"力荐"的评价,豆瓣根据每本书读过的人数 以及该书所得的评价等综合数据,通过算法分析产生了豆瓣图 ...
- python爬虫爬取豆瓣图书
爬取豆瓣图书top250的第一页 我最终爬取的是图书的书名,链接 先要做个说明,如果你是编程高手的话,这边文章你就不用看了,如果你是个python爬虫小白的话,可以看看这篇原创 我将用到的软件是pyc ...
- xpath解析爬虫爬取豆瓣图书Top250的数据
这是在学习阶段写的爬虫,爬取的是豆瓣图书Top250榜的名称,作者,评分等数据 第一次写文章,如果有什么问题,欢迎各位大佬进行指正,谢谢来踩. 1.首先需要明确自己想要爬取的内容,并在网页中查看数据是 ...
- Python项目之我的第一个爬虫----爬取豆瓣图书网,统计图书数量
今天,花了一个晚上的时间边学边做,搞出了我的第一个爬虫.学习Python有两个月了,期间断断续续,但是始终放弃,今天搞了一个小项目,有种丰收的喜悦.废话不说了,直接附上我的全部代码. 1 # -*- ...
- python爬取豆瓣书籍_Python爬虫-爬取豆瓣图书Top250
豆瓣网站很人性化,对于新手爬虫比较友好,没有如果调低爬取频率,不用担心会被封 IP.但也不要太频繁爬取. 涉及知识点:requests.html.xpath.csv 一.准备工作 需要安装reques ...
- python爬虫爬取豆瓣图书热评并生成图云
共4个py文件,按照顺序运行即可绘制出图云,效果图在最后,参考b占up主"龙王山小青椒"[Python爬虫+本科毕业论文速成]豆瓣评论-我是余欢水-[数据抓取-情感分析-评分统计- ...
- 爬虫爬取豆瓣电影排行,保存到excel和SQLite
# -*- coding = utf-8 -*- # @Time : 2021/11/18 19:54 # @Author : Vvfrom bs4 import BeautifulSoup # 网页 ...
- python爬虫爬取豆瓣top排行图片
爬虫是什么? "网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁 ...
- python爬虫豆瓣评论论文_Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析...
Date的那一大堆事儿--1 String perfTimeStr = "";// 统一设置日历格式 Calendar calendar = Calendar.getInstanc ...
最新文章
- 数学篇(二) 方差、标准差、协方差
- MDK中利用宏定义__DATE__和__TIME__设置产品的代码固件版本
- mysql32位的能装在64位的电脑上吗,mysql32位能装64位电脑【excle中怎么将log值变回原来的数据库】...
- wifi协议_物联网网关智能家居工业4G路由器通用的物联网WiFi模块 MQTT/TCP协议 Linux嵌入式...
- Socket网络编程--聊天程序(2)
- ILSpy For MacOsX
- 小度wifi的使用说明
- 二次开发环境执行后台事务定义中断问题解决办法
- 手机滚动截屏软件推荐
- FPGA数字信号处理基础----使用HLS生成信号
- 酒店短视频营销,是酒店获客引流的重点推广手段之一
- 计划的主体部分应有哪些内容_知道智慧树应用写作技能与规范网课答案
- winscp 进入mysql命令_Winscp使用密钥登录
- 算法时间复杂度lg是多少_斐波那契数的 O(lgn) 时间复杂度算法 | 学步园
- html多个好看的背景动态效果(附源码)
- 论坛社区项目——项目总结
- 2022年宜昌市高新技术企业申报奖励政策以及认定条件要求汇总!
- 李宏毅作业七其二 Network Compression (Knowledge Distillation)
- 惠普win10一键还原_惠普win10一键还原怎么用 - 卡饭网
- 中国古代十大名曲背后的掌故(转载)
热门文章
- 基于规则的语音合成中文文本前端设计
- vba批量合并指定的sheet_Excel VBA 多个工作表合并方法
- 干货 | 播音主持必知的五十个知识
- 【老板须知】实施ERP系统能为公司带来什么样的好处
- 盘点国内十大免费CDN提供商
- 读懂常见IRP:IRP_MJ_CLEANUP\IRP_MJ_CLOSE\IRP_MJ_CREATE
- linux计算器界面代码,linux 日历,计算器,nano编辑器,开关机、重启,(示例代码)...
- JWT之token机制与双token详解
- 高新技术企业认定评分标准
- gitee如何解决GitHub下载速度慢的问题