今天在看最爱的公众号博主的文章的时候,突然就产生一个念头:想要把这个博主的所有的文章从头到尾看一遍。从16年开始到现在,大概500多篇文章,可是需要一遍遍去微信公众号里面翻就十分麻烦,当时就想:如果能把所有的文章能够爬下来就好了,我只是随便想想,然鹅在一旁的东东哥听了我的想法,就已经拿着电脑开始敲实现代码了。
如果是以前的我,这个想法绝对是想过之后,就没有下文了,说实话,我不仅懒,内心对通过写脚本实现高效率的任务这一件事情,一直心有抵触,一来觉得遇到实现过程卡壳的地方,没有人指点,自己琢磨,既浪费时间从而导致情绪沮丧。二来是觉得,微信平台肯定会做反爬机制,到时候肯定又是竹篮打水一场空。
在东东哥的煽动下,和他一起研究实现过程,在我还没开始把请求的header数据写进去时,东东哥已经大体的框架写完了,这让我内心更想放弃了,东东哥,那你写一个把数据写入表格里的吧,于是我就蹭蹭就回顾了一下之前复习的知识点,还好还好,基本都是把案例copy过来包装成写入表格数据的模块。
到这里,本以为就已经要实现功能了,结果我们遇到了几个问题:
1.request请求里面的url,把请求文章的页数begin的循环范围弄错了,这里使用的rang()需要设置一个页数的步长,这个是每次翻页的时候,begin的值都会发生变化,这里需要观察请求url的参数规律(这是一个get方式的请求)。
2.获取响应数据的格式化,想要的字段有:文章标题,文章链接,文章发布时间。
其中文章标题和文章链接都是可以直接通过json化来获取,而发布时间需要把int的时间秒数格式化为时间戳,用这个create_time = time.strftime("%Y-%m-%d", create_time)就可以实现了,翻了翻笔记,是之前复习过的内容,但是我还是不会怎么用,只是印象中有看到这个,遇到问题的时候,快速找到笔记。
3.写入表格的数据在一次次for循环中反复被覆盖,原因是每次循环子列表时,读取行列的索引都是固定的,导致每循环完一遍都要在表格中横向写入新的数据。
问题是原来写入表格数据的模块使用了xlwt库来实现,xlwt库写入数据后,遇到循环后会再次覆盖之前的数据,不会追加数据。
解决方案是换成了csv库来实现,可以实现数据追加效果。
最后一个问题是微信的反爬虫机制,就是cookie和token会有实效时间,所以需要换成多个微信账号来实现,才能把所有页数请求完成。
到这里就算实现完成了,可以优化的点有:
可以把网页的文章用脚本pdf,有一个弊端是生成的pdf文件没有目录,相当于看书没有目录挺难受的,不过我好像之前看到有小伙伴可以在PDF上是可以自己添加目录的。
临时起意的一个想法,没想要实现它,结果在我们的讨论下(主攻:东东哥,菜鸟猪猪:盈盈)竟然真的实现了这个需求哈哈哈哈,虽然它有很多待完善的地方,但又不能不能用,足够了,以后想要看某一个作者的文章,可以直接全部爬下来,看哪指哪,另外也可以预防该作者的文章被删掉,避免找不到心会痛。
另外,需要代码的小伙伴可以去自己动手写一写。
2022.03.03