今天想到了一个需求:抓取Leetcode题目,并将其推送到打卡群中!比如:每日一题~
这个需求很简单,但是实现起来呢,呵呵。大家可以尝试一下,不过总体而言,还是爬虫的套路!
那么今天这篇文章,无代码,纯思路,剥茧抽丝,一步步深入研究。
大家都知道leetcode有中文站点,也有英文站点,这次爬虫指的哪一个呢?
最后的结论是抓取的中文站点,相对于英文站点而言,中文站点要难一些!
如果自己实力有限,推荐大家先从英文站点尝试,再来中文站点。
两者的区别在于,中文站点多了一个翻译!
首先第一步获取中文站点的所有题名!
这里的题名包含两部分,一部分是中文的,一部分是英文的。
如下两图所示:
中文题名:
英文题名:
中文题名获取是通过post请求,英文题名是通过get请求。经过对比,可以得到中文题名的id与英文题名id一致时候,就代表英文翻译为中文,比如:页面上的两数之和就对应英文的two-sum。
经过上述题名获取,现在就需要获得每个题名对应的具体内容与题目解析。
点击题目,进入题目的具体详情页面,通过f12里的xhr,我们发现基本内容都在graphql(上述的中文post获取也是这个,url都不变)中!如下图所示:
此时通过分析json数据格式,便可以获取到页面的内容,随后做一些处理即可。
处理过程中的难点问题在于:如何同页面呈现一样!
你获取的内容很乱,如下图所示:
怎么处理呢?
首先看到这里面有很多html标签,那么思路来了只要将这些内容从html转为markdown后,便可以实现同页面呈现类似的无多余字符串,格式不会很乱的效果!
但是问题又来了,你会发现此时的url是通过换行符断开了,markdown里面的所有图片404了,哈哈~
此时莫慌,正则来了,直接正则匹配一下,然后做替换即可!
最后贴一张,最终存储的样板:
在做完题,我们要参照标准答案,那么如何获取标准答案,也就是题目解析呢?
当你点击解决方案后,会在xhr
中出现solution/
,那么这个便是解决方案页面,此时你去看请求,会发现是get方式,而且get的内容全为markdown语法内容,这不简单,我心一想,so easy,直接存储为markdown格式就可以啦!
题目解析内容,如下图所示:
事实并非如此,重点中的重点来了:你打开markdown内容,在原页面呈现的代码,在你的markdown里面则是iframe标签内容,根本加载不出来代码内容!
这又是为何?
继续去xhr
,找到了一串串graphql
,而这里面便是代码,如下图所示:
看到了代码,欣喜若狂!然后post数据,使用正则匹配找到iframe
标签,直接做替换即可得到所有的代码。
效果图:
【题目】
数据存储
文件内容
【题目解析】
数据存储
文件内容
【检查完整性】
本地数据:
对比发现都是996,数据完整!
直接模拟群发知识星球或者利用itchat
群发消息即可实现上面内容的发送,如何定时保证每日都会接收到,那直接放在服务器上运行就行了。