获取Leetcode数据

具体见 [Python爬虫实现Leetcode内容抓取]

设计后端

从Leetcode上获取到的数据有如下几种:

  1. 刷题进度
  2. 喜欢的题
  3. TOP榜单
  4. 所有题目
  5. 题目详情,包括题目内容、提示等
  6. 题目提交记录
  7. 标签分类的题

不登录也可爬取的部分:

  1. 所有题目
  2. 标签分类的题
  3. 题目详情,包括题目内容、提示等

必须要登录的部分:

  1. 刷题进度
  2. 喜欢的题(隐含3. TOP榜单, 可用我自己的帐号获取,也可以看做不登录也可获取)
  3. 题目提交记录

由于Leetcode网页在国内不太稳定,所有内容都由实时去请求不太现实。
经过考虑后可以采用如下设计:

  1. 将不需要登录部分的数据获取设计为周期性获取更新,如一天更新一次。
  2. 与用户相关的部分在用户登录后,后端进行自动获取。需要使用时客户端向后端请求获取。

数据库

MySQL数据库的使用见:[MySQL傻瓜式教程]

设计如下数据表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
mysql> show tables;
+--------------------+
| Tables_in_leetcode |
+--------------------+
| Question |
| QuestionDetail |
| TagItem |
| TopList |
+--------------------+

mysql> desc Question;
+-------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| p_id | int(11) | NO | PRI | NULL | |
| frontend_id | int(11) | NO | | NULL | |
| title_slug | tinytext | YES | | NULL | |
| title | tinytext | YES | | NULL | |
| difficulty | int(11) | YES | | NULL | |
| status | int(11) | YES | | NULL | |
| paid_only | int(11) | YES | | NULL | |
| is_favor | int(11) | YES | | NULL | |
| frequency | int(11) | YES | | NULL | |
| progress | int(11) | YES | | NULL | |
+-------------+----------+------+-----+---------+-------+
10 rows in set (0.00 sec)

mysql> desc QuestionDetail;
+----------------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+----------+------+-----+---------+-------+
| content | text | YES | | NULL | |
| similarQuestions | text | YES | | NULL | |
| hints | text | YES | | NULL | |
| topic_tags | text | YES | | NULL | |
| likes | int(11) | YES | | NULL | |
| dislikes | int(11) | YES | | NULL | |
| total_ac | tinytext | YES | | NULL | |
| total_submission | tinytext | YES | | NULL | |
| total_ac_raw | int(11) | YES | | NULL | |
| total_submission_raw | int(11) | YES | | NULL | |
| ac_rate | tinytext | YES | | NULL | |
| title_slug | tinytext | YES | | NULL | |
| p_id | int(11) | NO | PRI | NULL | |
| frontend_id | int(11) | NO | | NULL | |
+----------------------+----------+------+-----+---------+-------+
14 rows in set (0.00 sec)

mysql> desc TagItem;
+---------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| tag_name | tinytext | YES | | NULL | |
| tag_slug | varchar(100) | NO | PRI | NULL | |
| tag_questions | text | YES | | NULL | |
+---------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> desc TopList;
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| name | varchar(150) | NO | PRI | NULL | |
| question_ids | text | YES | | NULL | |
+--------------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

设计客户端

  1. 每次打开App请求一次题库是否有更新

如果有用户登录

  1. 每次打开App,重新请求刷题进度和AC题
  2. 喜欢列表需要手动刷新