syd123

第一步:爬虫需要的模块包导入

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)

到此为止,我们完成数据分析过程的第一步:采集信息(获取数据)

接下来便可以对这些数据进行数据分析啦!

分类:

技术点:

相关文章:

  • 2021-07-16
  • 2021-10-08
  • 2021-04-04
  • 2021-07-17
  • 2021-06-13
  • 2021-12-05
  • 2021-10-24
  • 2022-01-10
猜你喜欢
  • 2021-09-15
  • 2022-01-31
  • 2021-07-17
  • 2021-11-18
  • 2022-01-17
  • 2021-05-11
  • 2022-01-20
相关资源
相似解决方案