#Python爬虫#前面讲过python爬虫的常用技巧总结,带你轻松入门,今天补实战指南,爬取知识星球里某个星球的所有数据,对,你没有听错,是所有数据,包括了内容、问答、评论、图片、文件、甚至是谁点了赞!心动了吧,赶快行动吧。
当然,本篇文章需要你有一点python基础,如果没有的话,建议你先收藏,去找一些教程学习一下这门工具人语言。
好了,废话不多说,马上开始。
首先,导入所需要的包:
导入所需要的包准备数据库
把获取的数据存入MongoDB中,为什么选择MongoDB?因为非关系型数据库比较简单,我们用到的数据结构也不复杂,开发起来比较快。
准备数据库分析知识星球的网络请求数据
用Chrome浏览器的开发者工具对知识星球PC端的网络请求进行观察,发现获取星球话题的请求只有一个,我们把它赋值给BASE_URL。同时发现登录的token就在cookie里面:zsxq_access_token,啧啧,太明显了。
BASE_URL和请求头的构造对话题数据进行分析,可以归纳总结出以下结论:
话题类型有两种:talk是普通话题,只有1条内容,qa是问答,问答含有提问和回答2条内容。所有内容均可能包含图片或者文件(不太确定问答的内容是否会包含文件,因此当作可能包含文件处理)。当请求返回的话题数量为0时,说明已经爬取完毕。我的CPU有4个核心,考虑到文本、图片、文件出现的频次和下载时间,多线程设计如下:
设计3个队列:topic_q、images_q、files_q,分别存取end_time、图片信息、文件信息,分别用于获取话题信息、下载图片、下载文件。设计4个线程,1个获取话题信息,2个下载图片,1个下载文件。当所有队列结束时,程序结束。
流程
为了能让你更好地理解,我画了一副流程图,可以配合流程图来理解代码,事半功倍。
流程图多线程并行
根据上面的分析,创建3个队列,4个线程,并把下面地代码放到连接、关闭数据库代码的中间:
多线程并行下面是各个线程函数,作用是不断的从对应任务队列中取出参数并执行处理方法,fetch_topics、fetch_images、fetch_files分别是下载对应内容的方法。
各个线程函数下载话题数据
创建fetch_topics方法,用来发送获取星球话题的请求,上面已经设置好了BASE_URL,这里设置请求参数即可。
观察发现,API的参数有3个,分别是:
scope:话题范围,例如:精华话题还是图片话题。all代表全部话题。count:返回的话题数量,网站里默认20个,但经测试,30个也能正常返回,40个以上报错。end_time:关键参数,知识星球通过它来分页,不填则返回最新的count个话题,比如20,如果你想得到第21-40个话题,那么就需要设置end_time为第20条话题的创建时间,并且要把创建时间的毫秒数减1。
下载话题数据下载图片
图片可能包含三种类型:thumbnail缩略图、large大图、original原图,不一定全都有,因此在下载前要判断。
下载图片下载文件
知识星球PC端是无法下载文件的,我用手机抓包后才得到了下载