Python3获取豆瓣图书标签的前20本热门书籍(一)

介绍


第一篇主要获取豆瓣的大分类、大分类下的具体分类以及具体分类下的前20本热门书籍,第二篇对获取的数据进行分析。

准备

Python3.6、requests、BeautifulSoup4

演示

douban

代码

1# -*- coding: utf-8 -*- 2# @Author: Sexy Phoenix 3# @Last Modified by: Sexy Phoenix 4import requests 5from bs4 import BeautifulSoup, SoupStrainer 6 7#内容解析类 8class Parse: 9 10 #解析分类 11 def parse_tags(self, content): 12 13 only_div_tags = SoupStrainer('div', 'article') 14 soup = BeautifulSoup(content, 'lxml', parse_only=only_div_tags) 15 16 category = {} 17 sub_category = {} 18 19 # 解析大分类 20 tag_title_wrapper = soup.find_all('a', 'tag-title-wrapper') 21 22 for index,tag in enumerate(tag_title_wrapper): 23 category[index] = tag.get('name') 24 25 # 解析大分类下的具体分类 26 tagCol = soup.find_all('table', "tagCol") 27 for i,tag in enumerate(soup.find_all('table', "tagCol")): 28 a = tag.find_all('a') 29 sub_category[i] = [] 30 for t in a: 31 sub_category[i].append(t.string) 32 33 return category, sub_category 34 35 #解析具体分类前20分书籍 36 def parse_detail_tag(self, content): 37 38 detail_conent = [] 39 only_ul_tags = SoupStrainer('ul', 'subject-list') 40 soup = BeautifulSoup(content, 'lxml', parse_only=only_ul_tags) 41 42 for li in soup.find_all('li', 'subject-item'): 43 44 info = li.find('div', 'info') 45 title = info.h2.a.get('title') 46 star = info.find('span', 'rating_nums') 47 extra_info = info.h2.next_sibling.next_sibling.string.split('/') 48 author = extra_info[0].strip() 49 price = extra_info[-1].strip() 50 appraise = star.string 51 appraise_num = star.next_sibling.next_sibling.string.strip() 52 53 detail_conent.append({ 54 'title': title, 55 'price': price, 56 'author': author, 57 'appraise':appraise, 58 'appraise_num': appraise_num 59 }) 60 61 return detail_conent 62 63#内容获取类 64class Spider: 65 66 def __init__(self): 67 68 self.url = 'https://book.douban.com/tag/?view=type&icn=index-sorttags-all' 69 self.tag_url = 'https://book.douban.com/tag/' 70 self.headers = { 71 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' 72 } 73 self.parse = Parse() 74 75 #获取分类HTML内容 76 def get_all_tag(self): 77 78 data = requests.get(self.url, headers=self.headers) 79 if(data.status_code == requests.codes.ok): 80 return self.parse.parse_tags(data.text) 81 else: 82 print('[ERROR]: GET Category Error') 83 84 #获取书籍HTML内容 85 def get_detail_tag(self, tag_name): 86 data = requests.get(self.tag_url + tag_name, self.headers) 87 if(data.status_code == requests.codes.ok): 88 return self.parse.parse_detail_tag(data.text) 89 else: 90 print('[ERROR]: GET Sub Category Error') 91 92 #显示 93 def show(self): 94 95 category, sub_category = self.get_all_tag() 96 print('豆瓣大分类:') 97 for index,value in category.items(): 98 i = index + 1 99 print("{0}、{1}".format(i, value)) 100 try: 101 key = int(input('请输入您选择的大分类:')) - 1 102 sub_cate = sub_category[key] 103 for index in range(len(sub_cate)): 104 i = index + 1 105 print("{0}、{1}".format(i, sub_cate[index])) 106 try: 107 sub_key = int(input('请输入您选择的具体分类:')) - 1 108 tag_name = sub_cate[sub_key] 109 detail_content = self.get_detail_tag(tag_name) 110 111 for book in detail_content: 112 print('\n') 113 print(book['title']) 114 print("作者:{0}, 价格:{1}, 评分:{2}{3}".format(book['author'],book['price'], book['appraise'], book['appraise_num'])) 115 print('='*50) 116 117 except: 118 print('[ERROR]: 具体分类选择错误') 119 except: 120 print('[ERROR]: 大分类选择错误') 121 122#入口 123if __name__ == '__main__': 124 spider = Spider() 125 spider.show()
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python3获取豆瓣图书标签的前20本热门书籍(一) - HelloWorld