请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你

[复制链接]
查看: 95|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
80226
发表于 2019-12-5 12:52 | 显示全部楼层 |阅读模式
一、前言简述

  由于近来微信心书出了网页版,加上自己也在闲暇的时候看了两本书,不由猎奇什么样的书更受接待,哪位作者又更受读者爱好呢?话不多说,爬一下就能有个了解了。

二、页面分析

  首先翻开微信心书:https://weread.qq.com/,往下拉以后可以看到有榜单举荐,而且表现总共有25个榜单,有的榜单只要几百本,有的榜单却有几万本书。
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191204132253907-1826942727

  翻开“文学艺术榜”,可以看到一页表现了20条书籍信息,下拉以后很轻易就能发现这些书籍信息是经过 AJAX 来加载的。
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191204132701044-716426949

  更关键的是,要获得这些书籍信息,只需要获得分类 ID 和参数 maxIndex。不外测试发现,每个分类只会返回50个页面的内容,也就是最多一千条书籍信息。那末,假如只要这25个种此外榜单,能获得的数据还是有点少的,所以要怎样获得更多的数据呢?
  仔细的人可以发现右侧还能挑选种别!以下图:
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191204133713155-2003817060

  不外,检察这些元素发现里面是没有表现 URL 的,以下图:
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191204133956628-996280510

  可是这也不表现没有法子了,全局搜索一下就能找到了,以下图:
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191204134321461-13276621

  CategoryId 就是这个分类的 ID,也就是 URL 中“bookListInCategory/”背面的内容。至于 maxIndex,可以先设为0,然后发送请求获得这一分类的书籍总数“totalCount”,然后按照这个书籍总数能否横跨一千来设备页数,就能获得这一分类下可以大要爬取到的全数 URL 了。

三、爬取步伐

  前面经过分析已经晓得只要拿到书天职类 ID,就能发送请求获得书籍总数,也就能机关该分类下的全数页面的 URL 了。那要怎样获得全数分类呢?前面全局搜索的时候已经搜到了书天职类的 CategoryId 等信息,以下图:
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191204134321461-13276621

  所以只需先请求页面然后用正则婚配 CategoryId 就行了!然后对每个分类发送一次请求,用于获得书籍总数,并机关这一分类下的全数 URL。这一部分代码以下: 
  1. 1 def prepare(base_url="https://weread.qq.com/web/category/1700000") -> list: 2     """ 3     prepare for crawler 4     :param base_url: weread base url 5     :return: page url list 6     """ 7     def request(url) -> list: 8         """ 9         request function10         :param url: url11         :return: page url list12         """13         page_urls = []14         try:15             res = requests.get(url=url, headers=headers)16             if res.status_code == 200:17                 count = res.json()["totalCount"]18                 cnt = 50 if count >= 1000 else count // 2019                 page_urls = [url + "?maxIndex={}".format(i * 20) for i in range(cnt)]20             else:21                 logging.error("Error request!")22         except Exception as e:23             logging.error(e)24         finally:25             return page_urls26 27     resp = requests.get(url=base_url, headers=headers)28     # check status code29     if resp.status_code == 200:30         id_list = re.findall('"CategoryId":"(.+?)"', resp.text)31         id_list = list(set([i for i in id_list if i[0].isdigit()]))32         href_list = ["https://weread.qq.com/web/bookListInCategory/{}".format(i) for i in id_list]33         result = []34         for href in href_list:35             result += request(href)36         logging.info("Url count: {}".format(len(result)))37         return result38     else:39         logging.error("Prepare error!")40         exit()
复制代码
  举行到这一步,背面就很简单了,就是获得请求成果并分解即可。步伐运转时打印输出以下:
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191203231653766-959668502

  可以看到总链接数有7091条,那末爬到的书籍信息有几多条呢?由于我用的是 MongoDB 保存的,所以翻开 Robot3T 检察,总共有141137条,成果以下图:
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191203232004964-866910224


四、绘图分析

  熟悉 Python 的都晓得,matplotlib 是 Python 中用的最多的 2D 图形绘图库。不外我在这举荐一个好用的第三方库:pyecharts,这是一个用于天生 Echarts 图表的类库,天生的图表加倍精巧,可视化成果更好,不外需要留意的是 pyecharts 的0.5版本和1.0版本利用方式是差此外。下面就是利用这个库天生的横向柱状图了,别离表现评分前十的书籍、阅读量前十的书籍和总阅读量前十的作者:
  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191203232421277-1019303164

  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191203232246777-438642514

  
【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你  游戏 1450803-20191203232325138-311254573

  可以发现评分高的书籍阅读量却不愿定高,阅读量更多的凡是是一些收集小说。为什么似乎现在名著都不怎样讨喜,而收集小说却能让更多人沉迷呢?小我料想是小说里的全国大要加倍可以大要满足现在年轻人的理想吧,现实保存疲惫不胜,就会加倍迷恋小说中的“世外桃源”吧。

  完整代码已上传到 GitHub

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表