Leetcode爬虫实践
背景
由于Leetcode网站高频率地打不开,想到了做个Leetcode客户端,通过自己的服务器来查看Leetcode的题目。
那么现在需要的就是Leetcode里面的题目信息和如何实现用户登录。
这时候爬虫当然是首选啦。
观察网页请求
把浏览器cookies清除掉后,从登录页面开始,访问你需要爬取信息的网页,看数据是如何请求的。
由于Leetcode有中英双版页面,那么爬取不同的数据就需要走两遍同样的流程。
Host:
- 中文Leetcode:
leetcode-cn.com
- 英文Leetcode:
leetcode.com
主页: - 中文Leetcode:
https://leetcode-cn.com
- 英文Leetcode:
https://leetcode.com
下面以中文Leetcode为例,介绍爬取流程。
用~
来代替主页前缀。
登录
API接口: ~/accounts/login
首先发送一次GET请求
,模拟打开登录页面。
然后填好用户名和密码后,发送登录POST请求
:
1 | { |
服务器收到GET请求后,会返回给你一个Cookie,里面包含一个token值,这个token值在你登录的POST请求里必须附上,否则服务器将认定登录请求非法。
服务器收到登录POST请求后,验证用户合法性,如果判断登录成功,也会返回给你一个Cookie,同样包含上次的token,不过token的值更新了。这个Cookie就作为该登录用户的标志。
用户进度(用户登录之后)
API: ~/progress/all
发送GET请求
,获取当前登录用户的刷题进度。
服务器返回Json:
1 | { |
题目简洁信息(免登陆可获取)
API接口: ~/api/problemset/all
发送GET请求
,获取所有问题的简洁信息,包括:
- 题目后端id
- 题目前端显示id
- 题目标题
- 题目难度
- 题目AC数
…
服务器返回的是一个json数据,包含了如下内容:
1 | { |
question_id
是后端id,question_frontend_id
是前端展示id。
题目标题翻译(英文版Leetcode不需要做这一步)
API: ~/graphql
Params: getQuestionTranslation
发送POST请求
,获取所有问题对应的标题翻译(中文)。
1 | { |
遍历之前获取的题目信息,根据题目后端id
,将题目的翻译标题添加进信息中。
题目标签(免登陆获取)
API: ~/problems/api/tags
发送GET请求
,获取所有题目存在的分类。
1 | { |
题目详情(免登陆可获取)
API: ~/graphql
Params:
1 | { |
根据titleSlug,发送POST请求
。
获取服务器的返回json:
1 | { |
收藏列表 & 榜单
API: ~/graphql
Params:
1 | { |
发送POST请求
,获取当前用户的收藏列表。(附带获得了隐藏的榜单信息)
服务器返回Json:
1 | { |
提交记录
API: ~/graphql
Params:
1 | { |
服务器返回Json:
1 | { |
面试信息
API: ~/graphql
Params:
1 | { |
服务器返回Json:
1 | { |
- 本文链接:http://katherineleeyq.cn/2019/03/03/Leetcode爬虫实践/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!