豆瓣近五年书籍榜单爬取流程

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数据库中

Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")

爬取豆瓣 Top250书籍

豆瓣书籍数据爬取与分析

爬取豆瓣网评论最多的书籍

python爬取豆瓣首页热门栏目详细流程