这几天想爬下豆瓣读书时发现 github 上他人分享的源码都有一定年份了,豆瓣读书的页面貌似也稍微改了,于是就在前人轮子的基础上改进一下重新爬下豆瓣读书。Python 版本是 3.7。
1.爬取信息
简单的思路还是用 urllib 的 request 模块抓取豆瓣读书页面 URL 内容,然后用 bs4 解析页面,最后用 openpyxl 处理保存到 excel 文件中(eazy)。
首先分析下豆瓣读书页面
可以发现豆瓣读书一页能显示 20 本书籍信息,而且关键信息都放在一起不需要再点击进去了(省事了呀)。所以我们就知道 url 地址:
http://book.douban.com/tag/编程?start=0
也就是说
url = 'https://book.douban.com/tag/' + urllib.parse.quote(book_tag) + '?start=' + str(page_num * 20)
我们需要的信息是书名,评分和评分人数,作者/译者,出版信息。对应网页标签也很容易就能找到。
书名在 a 标签以及 span 副标题合并可得
bookname = ''.join(list(book_info.find('a').stripped_strings))
作者及出版信息在「pub」标签,存在 List 后分割即可
desc = book_info.find('div', {'class': 'pub'}).string.strip()
评分信息在「rating_nums」和「pl」标签下,注意由于评分人数太少时候会出现‘少于10’以及‘目前无’。所以保存下来时注意如果用 int 可能会报错,简单粗暴的解决办法是保存为 excel 文件时候直接用 str 来保存。
相关信息都爬下来后就可以构建书单的数组了
book_list.append([title, rating, people_num, author_info, pub_info])
2.保存为 Excel 文件
Python 的 openpyxl 模块可以方便我们对爬取下来的信息用 excel 来储存数据。建立表单之后把书单信息的数组一一对应存进去即可
def print_book_lists_excel(book_lists, book_tag_lists):
wb = Workbook(write_only=True)
ws = []
for i in range(len(book_tag_lists)):
ws.append(wb.create_sheet(title=book_tag_lists[i]))
for i in range(len(book_tag_lists)):
ws[i].append(['序号', '书名', '评分', '评价人数', '作者/译者', '出版社'])
count = 1
for bl in book_lists[i]:
ws[i].append(
[count, bl[0],
float(bl[1]),
str(bl[2]), bl[3], bl[4]])
count += 1
save_path = 'book_list'
for i in range(len(book_tag_lists)):
save_path += ('-' + book_tag_lists[i])
save_path += '.xlsx'
wb.save(save_path)
3.爬取结果
根据自己想要爬取的豆瓣读书的标签,就可以得到例如如下结果
4.关于反反爬虫
由于豆瓣有反爬虫,所以尽管加入了伪装 user-agent 以及随机延时,在爬取的时候还是会有 ip 被检测到异常然后直接 403 的情况,尝试加入 ip 池但是由于免费 ip 池不稳定而且就算 403 了再重新登录账号修改密码后获取新的 cookie即可重新爬了,建议是不要一次爬取 N 个标签,分开爬取更稳妥。(有代理 ip 池的话也可)
本文发于公众号「黑科技良菌」,一个分享黑科技,产品,技术的地方。
源码地址:https://github.com/LiangJunChan/douban-clawergithub.com