豆瓣上有图书的排行榜,所以这次写了一个豆瓣的爬虫。

首先是分析排行榜的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

爬虫系列之豆瓣图书排行相关推荐

  1. Python爬虫系列(七)豆瓣图书排行榜(数据存入到数据库)

    豆瓣用户每天都在对"读过"的书进行"很差"到"力荐"的评价,豆瓣根据每本书读过的人数 以及该书所得的评价等综合数据,通过算法分析产生了豆瓣图 ...

  2. python爬虫爬取豆瓣图书

    爬取豆瓣图书top250的第一页 我最终爬取的是图书的书名,链接 先要做个说明,如果你是编程高手的话,这边文章你就不用看了,如果你是个python爬虫小白的话,可以看看这篇原创 我将用到的软件是pyc ...

  3. xpath解析爬虫爬取豆瓣图书Top250的数据

    这是在学习阶段写的爬虫,爬取的是豆瓣图书Top250榜的名称,作者,评分等数据 第一次写文章,如果有什么问题,欢迎各位大佬进行指正,谢谢来踩. 1.首先需要明确自己想要爬取的内容,并在网页中查看数据是 ...

  4. Python项目之我的第一个爬虫----爬取豆瓣图书网,统计图书数量

    今天,花了一个晚上的时间边学边做,搞出了我的第一个爬虫.学习Python有两个月了,期间断断续续,但是始终放弃,今天搞了一个小项目,有种丰收的喜悦.废话不说了,直接附上我的全部代码. 1 # -*- ...

  5. python爬取豆瓣书籍_Python爬虫-爬取豆瓣图书Top250

    豆瓣网站很人性化,对于新手爬虫比较友好,没有如果调低爬取频率,不用担心会被封 IP.但也不要太频繁爬取. 涉及知识点:requests.html.xpath.csv 一.准备工作 需要安装reques ...

  6. python爬虫爬取豆瓣图书热评并生成图云

    共4个py文件,按照顺序运行即可绘制出图云,效果图在最后,参考b占up主"龙王山小青椒"[Python爬虫+本科毕业论文速成]豆瓣评论-我是余欢水-[数据抓取-情感分析-评分统计- ...

  7. 爬虫爬取豆瓣电影排行,保存到excel和SQLite

    # -*- coding = utf-8 -*- # @Time : 2021/11/18 19:54 # @Author : Vvfrom bs4 import BeautifulSoup # 网页 ...

  8. python爬虫爬取豆瓣top排行图片

    爬虫是什么? "网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁 ...

  9. python爬虫豆瓣评论论文_Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析...

    Date的那一大堆事儿--1 String perfTimeStr = "";// 统一设置日历格式 Calendar calendar = Calendar.getInstanc ...

最新文章

  1. 数学篇(二) 方差、标准差、协方差
  2. MDK中利用宏定义__DATE__和__TIME__设置产品的代码固件版本
  3. mysql32位的能装在64位的电脑上吗,mysql32位能装64位电脑【excle中怎么将log值变回原来的数据库】...
  4. wifi协议_物联网网关智能家居工业4G路由器通用的物联网WiFi模块 MQTT/TCP协议 Linux嵌入式...
  5. Socket网络编程--聊天程序(2)
  6. ILSpy For MacOsX
  7. 小度wifi的使用说明
  8. 二次开发环境执行后台事务定义中断问题解决办法
  9. 手机滚动截屏软件推荐
  10. FPGA数字信号处理基础----使用HLS生成信号
  11. 酒店短视频营销,是酒店获客引流的重点推广手段之一
  12. 计划的主体部分应有哪些内容_知道智慧树应用写作技能与规范网课答案
  13. winscp 进入mysql命令_Winscp使用密钥登录
  14. 算法时间复杂度lg是多少_斐波那契数的 O(lgn) 时间复杂度算法 | 学步园
  15. html多个好看的背景动态效果(附源码)
  16. 论坛社区项目——项目总结
  17. 2022年宜昌市高新技术企业申报奖励政策以及认定条件要求汇总!
  18. 李宏毅作业七其二 Network Compression (Knowledge Distillation)
  19. 惠普win10一键还原_惠普win10一键还原怎么用 - 卡饭网
  20. 中国古代十大名曲背后的掌故(转载)

热门文章

  1. 基于规则的语音合成中文文本前端设计
  2. vba批量合并指定的sheet_Excel VBA 多个工作表合并方法
  3. 干货 | 播音主持必知的五十个知识
  4. 【老板须知】实施ERP系统能为公司带来什么样的好处
  5. 盘点国内十大免费CDN提供商
  6. 读懂常见IRP:IRP_MJ_CLEANUP\IRP_MJ_CLOSE\IRP_MJ_CREATE
  7. linux计算器界面代码,linux 日历,计算器,nano编辑器,开关机、重启,(示例代码)...
  8. JWT之token机制与双token详解
  9. 高新技术企业认定评分标准
  10. gitee如何解决GitHub下载速度慢的问题