介绍
第一篇主要获取豆瓣的大分类、大分类下的具体分类以及具体分类下的前20本热门书籍,第二篇对获取的数据进行分析。
准备
Python3.6、requests、BeautifulSoup4
演示

代码
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()