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

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

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-08-08 18:32:25

豆瓣近五年书籍榜单爬取流程的相关文章

Jsoup-简单爬取知乎推荐页面(附:get_agent())

总览 今天我们就来小用一下Jsoup,从一个整体的角度来看一看爬虫 一个基本的爬虫框架包括: [x] 解析网页 [x] 失败重试 [x] 抓取内容保存至本地 [x] 多线程抓取 *** 分模块讲解 将上述基本框架的模块按逻辑顺序讲解,一步一步复现代码实现过程 失败重试 一个好的模块必然有异常捕捉和处理 在之前的内容中,我们提到过一个简单的异常处理,小伙伴还记得么 简易版 // 爬取的网址 val url = "https://www.zhihu.com/explore/recommendatio

国外电商网站snapdeal爬取流程

首页爬取 1.首页获取各个目录的url 如所有优惠all_offers的其中urlhttps://www.snapdeal.com/products/men-apparel-shirts?sort=plrty 2.访问他的url获取bcrumbLabelId是由于js简单渲染出来的在id="labelId" value="(.*?) 中,如果取不到值该页面为一个优惠卷页面或者其他页面 3.url重新拼接http://www.snapdeal.com/acors/json/pr

requests基础爬取流程

# 需求:爬取搜狗首页的页面数据import requestsif __name__ == '__main__': # 1指定url url = 'https://www.sogou.com/' # 2发起请求 res = requests.get(url=url) # get方法会返回一个响应对象 # 3 获取响应数据.text返回的是字符串形式的响应数据 page_text = res.text print(page_text) # 4 持久化存储 fp = open('./sogou.ht

python网络爬虫:实现百度热搜榜数据爬取

from bs4 import BeautifulSoup from selenium import webdriver import time import xlwt #打开网页 url="http://top.baidu.com/buzz?b=1&fr=topindex" driver = webdriver.Chrome() driver.get(url) #time.sleep(5) #获取网页信息 html=driver.page_source soup=Beauti

amazon爬取流程与思路

第一步:访问分类页面 https://www.amazon.in//gp/site-directory?ref=nav_em_ajax_fail #抓包获得 第二步:获取分类页面下各个分类的url 如 :https://www.amazon.in/gp/browse.html?node=1389401031&ref_=nav_em_T1_0_4_NaN_1_sbc_mobcomp_all_mobiles 由于对方网站也是迭代的出来的这里有很多信息需要自己过滤排查 第三步:翻页的处理 import

【图文详解】scrapy安装与真的快速上手——爬取豆瓣9分榜单

写在开头 现在scrapy的安装教程都明显过时了,随便一搜都是要你安装一大堆的依赖,什么装python(如果别人连python都没装,为什么要学scrapy-.)wisted, zope interface,pywin32---现在scrapy的安装真的很简单的好不好! 代码我放github上了,可以参考: https://github.com/hk029/doubanbook 为什么要用scrapy 我之前讲过了requests,也用它做了点东西,([图文详解]python爬虫实战--5分钟做

简单的实现一个python3的多线程爬虫,爬取p站上的每日排行榜

大概半年前我开始学习python,也就是半年前,我半抄半改的同样的爬虫写了出来,由于是单线程的程序,当中出了一点的小错就会崩溃,但是那个爬虫中的header之类的东西现在依旧还是能够使用的,于是我就把之前那份的保留了下来.由于有一半是抄的,自己得到的并不多,这次重写,我相当于又重新学习了一遍.,当中有可能有认识不足的,欢迎指正. 首先我们要想登陆p站,得构造一个请求,p站登陆的请求包括: request = urllib.request.Request( #创建请求 url=login_url,

爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 2. 中间件的使用 3. selenium在scrapy中的应用 4. CrawlSpider 5. 分布式 5. 增量式 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 爬取流程: 爬虫类中将解析到的图片

利用Scrapy爬取所有知乎用户详细信息并存至MongoDB

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :崔庆才 本节分享一下爬取知乎用户所有用户信息的 Scrapy 爬虫实战. 本节目标 本节要实现的内容有: 从一个大V用户开始,通过递归抓取粉丝列表和关注列表,实现知乎所有用户的详细信息的抓取. 将抓取到的结果存储到 MongoDB,并进行去重操作. 思路分析 我们都知道每个人都有关注列表和粉丝列表,尤其对于大V来说,粉丝和关注尤其更多. 如果我们从一个大V开始,首先可以获取他的个人信息,然后我们获取