豆瓣近五年书籍榜单爬取流程
Posted syd123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了豆瓣近五年书籍榜单爬取流程相关的知识,希望对你有一定的参考价值。
第一步:爬虫需要的模块包导入
1 # 模块导入
2 import requests
3 from bs4 import BeautifulSoup
4 import pandas as pd
5 print(pd.__version__)
第二步:分析网页信息的存储模式并找到规律
# 获取2015-2019年的豆瓣榜单信息(2019年榜单信息储存方式有所不同)
### 访问链接的生成器
### 通过对网页信息的分析,发现榜单信息异步加载在
* https://book.douban.com/ithil_j/activity/book_annual2018/widget/1
* https://book.douban.com/ithil_j/activity/book_annual2018/widget/2
* https://book.douban.com/ithil_j/activity/book_annual2017/widget/1
* https://book.douban.com/ithil_j/activity/book_annual2016/widget/1
* ……
### 2019年的豆瓣榜单信息
### 通过网页信息分析,应首先获取访问的id号,在进行构成url
1. https://book.douban.com/ithil_j/activity/book_annual2019
通过这个链接获取id号
2. * 比如id号为1094 则:https://book.douban.com/ithil_j/activity/widget/1094
* 比如id号为1095 则:https://book.douban.com/ithil_j/activity/widget/1095
第三步:构造访问榜单信息的url,形成一个url存储器
1 # url储存器
2 def url_li():
3 # 2015-2018年所有信息的url
4 years_list = [‘2015‘,‘2016‘,‘2017‘,‘2018‘]
5 # 访问链接的搜集器
6 url_list = []
7 for year in years_list:
8 for i in range(1, 41):
9 # 格式化输出
10 #url = ‘https://book.douban.com/ithil_j/activity/book_annual{}/widget/{}‘.format(year, i)
11 # format的另一种使用方法
12 url = f‘https://book.douban.com/ithil_j/activity/book_annual{year}/widget/{i}‘
13 url_list.append(url)
14
15 # 2019年所有信息
16 # 访问目录
17 url_2019 = ‘https://book.douban.com/ithil_j/activity/book_annual2019‘
18
19 # 设置请求头
20 headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/65.0.3325.181 Safari/537.36‘}
21
22 # 获取id号
23 html_2019 = requests.get(url=url_2019, headers=headers, timeout=30)
24 # 解析json数据
25 html_json = html_2019.json()
26 ids = html_json[‘res‘][‘widget_infos‘]
27 ids_li = [i[‘id‘] for i in ids]
28 for id_i in ids_li:
29 url_1 = f‘https://book.douban.com/ithil_j/activity/widget/{id_i}‘
30 url_list.append(url_1)
31 return url_list
32 # 查看前3个url
33 url_list = url_li()
34 url_list[-3:]
结果显示:
1 [‘https://book.douban.com/ithil_j/activity/widget/1041‘,
2 ‘https://book.douban.com/ithil_j/activity/widget/1042‘,
3 ‘https://book.douban.com/ithil_j/activity/widget/1044‘]
第四步:遍历所有url_list,逐个获取其中的书籍信息
1 # 获取图书信息——榜单显示的信息
2 def get_book(url_list):
3 # 模拟浏览器
4 headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36‘}
5
6 # 获取信息并将信息以json模式解析
7 book_info = []
8 for i in url_list:
9 r = requests.get(url = i, headers = headers, timeout = 30).json()
10 # 分析json数据内容,主要内容存放在subjects中
11 # 为防止获取中报错设置忽略错误url
12 try:
13 info = r[‘res‘][‘subjects‘]
14 except:
15 info_1 = r[‘res‘][‘payload‘][‘widgets‘]
16 info = []
17 for i in range(len(info_1)):
18 info_i = info_1[i][‘subjects‘]
19 info.extend(info_i)
20 book_info.extend(info)
21 return book_info
22
23 # 查看前3条信息
24 book = get_book(url_list)
25 book[:3]
第五步:去除冗余的信息,保留需要的信息
1 # 数据清洗函数
2 def data_clean(book_info):
3 book_data = pd.DataFrame(book_info)
4 # 删除不需要的字段
5 del book_data[‘color_scheme‘], book_data[‘interest‘], book_data[‘is_released‘], book_data[‘orig_title‘], book_data[‘playable‘], 6 book_data[‘rating_stats‘], book_data[‘m_url‘], book_data[‘done_count‘], book_data[‘sharing_img‘], book_data[‘id‘],7 book_data[‘cover‘],book_data[‘desc‘], book_data[‘type‘]
8 return book_data
第六步:利用pandas将信息整理成表格形式
1 book_data = data_clean(book)
2 book_data.head()
结果显示:
1 rating rating_count title url
2 0 8.9 11295 火星救援 https://book.douban.com/subject/26586492/
3 1 8.6 61909 你今天真好看 https://book.douban.com/subject/26602392/
4 2 9.0 20004 最好的告别 https://book.douban.com/subject/26576861/
5 3 8.6 18798 你一生的故事 https://book.douban.com/subject/26295448/
6 4 8.8 4538 最后的耍猴人 https://book.douban.com/subject/26291984/
第七步:利用获得的book_url,获取每本书具体的作者,出版信息
1 # 设置请求头
2 headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36‘}
3 # 遍历所有书籍的访问链接获取作者、出版社、出版年份
4 book_info = []
5 for url in book_url:
6 # 访问每本书的具体信息
7 html_book = requests.get(url=url, headers=headers, timeout=30)
8 # 解析网页信息
9 soup = BeautifulSoup(html_book.text, ‘lxml‘)
10 d = {}
11 try:
12 d[‘book_name‘] = soup.find(‘span‘, property="v:itemreviewed").text
13 except:
14 d[‘book_name‘] = url
15 try:
16 d[‘book_info‘] = soup.find(‘div‘,id="info").text.replace(‘ ‘, ‘‘)
17 except:
18 d[‘book_info‘] = url
19 book_info.append(d)
第八步:将具体信息和每本书进行匹配,表格的连接方式
1 df = pd.DataFrame(book_info)
2 book_data_new = book_data.join(df)
3 book_data_new
结果显示:
1 rating rating_count title url book_name book_info
2 0 8.9 11295 火星救援 https://book.douban.com/subject/26586492/ 火星救援 [, , 作者:, , , [美]安迪·威尔, , 出版社:译林出版社, 原作名:TheMa...
3 1 8.6 61909 你今天真好看 https://book.douban.com/subject/26602392/ 你今天真好看 [, , 作者:, , , [美]莉兹•克里莫, , 出版社:雅众文化/天津人民出版社, 原...
4 2 9.0 20004 最好的告别 https://book.douban.com/subject/26576861/ 最好的告别 [, 作者: , , [美], 阿图·葛文德, , 出版社:浙江人民出版社, 出品方: 湛庐...
5 3 8.6 18798 你一生的故事 https://book.douban.com/subject/26295448/ 你一生的故事 [, 作者: , , [美], 特德·姜, , 出版社:译林出版社, 副标题:特德·姜科幻小...
6 4 8.8 4538 最后的耍猴人 https://book.douban.com/subject/26291984/ 最后的耍猴人 [, 作者: , , 马宏杰, , 出版社:浙江人民出版社, 出版年:2015-3-1, 页...
7 ... ... ... ... ... ... ...
8 1244 9.1 248 中村佑介的插画世界Ⅰ:蓝 https://book.douban.com/subject/34818672/ 中村佑介的插画世界Ⅰ:蓝 [, , 作者:, , , [日]中村佑介, , 出版社:后浪丨湖南美术出版社, 原作名:B...
9 1245 8.4 335 日本色气 https://book.douban.com/subject/34663228/ 日本色气 [, , 作者:, , , [日]九鬼周造、阿部次郎, , 出版社:一頁folio|北京联合...
10 1246 8.3 275 告别的仪式 https://book.douban.com/subject/30217954/ 告别的仪式 [, , 作者:, , , [法]西蒙娜·德·波伏瓦, , 出版社:上海译文出版社, 原作名...
11 1247 9.0 104 陀思妥耶夫斯基 https://book.douban.com/subject/34394911/ 陀思妥耶夫斯基 [, , 作者:, , , [美]约瑟夫·弗兰克, , /, , [美]玛丽·彼得鲁塞维茨编...
12 1248 8.6 198 魔术师时代 https://book.douban.com/subject/34464687/ 魔术师时代 [, , 作者:, , , [德]沃尔夫拉姆·艾伦伯格, , 出版社:上海文艺出版社, 出品...
13 1249 rows × 6 columns
第九步:将爬取的信息写入Excel表格中
1 book_data_new.to_excel(‘豆瓣近五年书单信息.xlsx‘,index = False)
到此为止,我们完成数据分析过程的第一步:采集信息(获取数据)
接下来便可以对这些数据进行数据分析啦!
以上是关于豆瓣近五年书籍榜单爬取流程的主要内容,如果未能解决你的问题,请参考以下文章
使用scrapy简易爬取豆瓣9分榜单图书并存放在mysql数据库中