Leetcode-Helper项目全记录1

LeetCode Helper简介:实现对LeetCode中文站的个人数据和提交源码进行爬取,将源码保存至本地,一键更新源码至github仓库,并且根据数据更新源码仓库的readme.md。

本章进展:

  1. 实现对Leetcode-cn的模拟登陆,并获取题目状态。
  2. 将个人做题情况保存到本地csv表格。

爬虫模拟登陆

该部分实现的需求是:建立一个长期的会话,根据用户名和密码,进行模拟登陆,登陆成功后返回登陆成功的会话。

建立会话

这里需要用到requests库建立一个会话。

import requests
session = requests.Session()

发送post请求

登陆网址

# 源站
leetcode_url = 'https://leetcode-cn.com/'
# 登陆地址
sign_in_url = leetcode_url + 'accounts/login/'

请求头参数设置

这里我们需要模拟浏览器登陆,所以请求头中的user-agent需要设置成浏览器的

user_agent = r"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"

其次,我们需要建立一个长期的会话,需要保持登陆的状态,目标站点为登陆站。

headers = {'User-Agent': user_agent, 'Connection': 'keep-alive', 'Referer': sign_in_url}

请求数据

这里我们要发送的数据就是我们的登陆信息,即账号和密码。

login_data = {'login': email, 'password': password }

发送请求

session.post(sign_in_url, headers = headers, data = login_data, allow_redirects = False)

判别登陆状态

这里我们通过cookies进行判断是否登陆成功。

is_login = session.cookies.get('LEETCODE_SESSION') != None
if is_login: 
	print("Login successfully!")
	return session
else: print("Login failed!")

爬取题目状态并保存至CSV

爬取题目状态

上面我们获取到了一个已经登陆的会话,之后我们直接使用该会话进行获取你个人的做题情况。

LeetCode本身就给我们提供了这样的一个api接口,我们直接访问即可。

api_problems_url = "https://leetcode-cn.com/api/problems/all/"
session = login() # 拿到登陆好会话
rec = session.get(api_problems_url)

返回的是一个json格式字符串,我们使用json模块进行解析,就可以得到字典类型的键值对。

rec_json = json.loads(rec.content.decode("utf-8"))

这样我们就可以很轻松的拿到自己的当前信息。

其中stat_status_pairs中包含了所有题目的信息,遍历该key对应的value就可以获取所有题目的详细状态。

# 遍历更新我们需要的信息进题库
for question in rec_json['stat_status_pairs']:
    id = question['stat']['question_id']  # 题目编号
    slug = question['stat']['question__title_slug']  # 题目名称
    status = question['status']  # 题目状态
    # 题目难度级别,1 为简单,2 为中等,3 为困难
    level = question['difficulty']['level']
    vip_only = question['paid_only']  # 是否为付费题目
    # 写入本地csv中
    write_to_csv(id, slug, status, level, vip_only)

保存至csv中

这里我们使用pandas进行csv操作

import pandas as pd

将要写入的信息转化为DataFrame类型,直接调用df.to_csv()写入即可。

def write_to_csv(id, slug, status, level, vip_only):
    # 从配置文件读入输出数据路径
    with open("config.json", "r") as f:
        temp = json.loads(f.read())
        DATAFILE = temp['datafile']
    
    # level_dic = {1: "简单", 2: "中等", 3: "困难"}
    columns = ["id", "slug", "status", "level", "vip_only"]
    cont_ls = [{"id": id, "slug": slug, "status": status,
                "level": level, "vip_only": vip_only}]
    df = pd.DataFrame(cont_ls, columns=columns)
    df.to_csv(DATAFILE, index=False, mode="a+", header=False)

写在后面

这是我第一次尝试写一个项目,可能有点垃圾,还是想记录一下全过程,文中展示的仅仅是项目的关键部分代码,并不是全部,后面写到差不多就会放到github上开源。

猜你喜欢

转载自blog.csdn.net/huiruwei1020/article/details/106620256
今日推荐