第一步:爬虫需要的模块包导入
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)
到此为止,我们完成数据分析过程的第一步:采集信息(获取数据)
接下来便可以对这些数据进行数据分析啦!
原文地址:https://www.cnblogs.com/syd123/p/12252684.html
时间: 2024-10-09 22:41:49