这只是我以前想做的项目,现在完成了。别看代码多,其实都是写过的函数,爬虫写得多了,很多相似的功能都可以从其他项目中找到对应的函数,复制即用。
工具使用
fiddler classic
postman
chrome
pycharm
爬取思路
1.通过fiddler抓包微信客户端,定位到想要获取的公众号文章列表页,通常第一次抓包数据可能会不完整,此时清空fiddler后刷新一遍
2.复制url到postman中分析接口的参数信息,判断其用途、是否变化、是否是多余等。复制第一次ajax的url和第二次的url,对比参数的变化,可以发现变化的只有begin_msgid是变化的,此时我们就知道它是控制翻页的参数,但它是怎么来的呢?
3.我以前做的upupoo那个就用的类似的方法,直接到请求返回的json数据中查找,复制第二次的ajax请求url的begin_msgid值,发现标记到article_list里面的最后一条中,这时我们就知道,它的下一次请求会携带的begin_msgid的值在返回的json数据的第十条内。
4.以及在点击正序时会添加的参数is_reverse,再判断正序和倒序的is_reverse的值,然后就可以通过改变它的值来进行正序和倒序的爬取。
5.构思代码实现,这有很多种方法,根据自己的习惯即可。
注意:如果是通过微信客户端复制链接到浏览器打开,它是没有 key、uin、pass_ticket、等关键参数的,而少了这些参数,像阅读数等一些数据就没有。
我这里的代码思路是,通过抓包获取ajax的请求链接,将它赋值给goal_url这个参数,从返回的json数据提取下一次begin_msgid的值等数据,通过一个字典来存储,判断is_reverse的值,经过分析,知道is_reverse的值在链接中的和json数据返回的是相反的,在处理其中的逻辑时,因为我想不出怎么通过一个判断联系起来,即is_reverse=0时的处理逻辑和is_reverse=1的处理逻辑 ,因为正序的返回是从1到总数据页数,倒序是从总书记页数到1。开始时我是想通过文章的pos_num的值来与总数据数比较,结果正序时没问题,倒序就提前退出递归了,因为总页数与倒序的第一个数是相等的。
在百思不得其解后,通过GPT给出的解决方法才成功,之后使用递归函数来一直获取数据直到数据列表为空退出。
期间遇到的困难:就是在正序和倒序的处理部分,其实我能想到更简单的,就是在goal_url中设置is_reverse这个参数就行了,但我就是想复制链接执行,不在链接上做更改,有点死脑筋了。所幸GPT能够理解我的提问,哈哈哈。
代码实现
运行成果
数据为空的是key的时效过了,需要重新抓包。
请登录后发表评论
注册
停留在世界边缘,与之惜别