python爬取Leetcode所有未ac题目
事情起源于寒假刚开始的时候
立下假期要好好学习的flag
决定继续刷leetcode 然而在不知道从什么时候开始刷leetcode到现在
居然从三百多题增长到了四百多题 感觉自己刷题速度都要跟不上增长了
按以前的列表刷难免漏题 决定写个”爬虫”
0.前言
再分析需求的时候查了很多博客。。完全无压力直接访问-解析html-提取所需信息一气呵成
然而leetcode改版了。。。我还没有查到改版后的爬取博客orz
随着前端的发展。。很多网页的主要信息已经变成js异步加载的了
大概leetcode改版之后题目列表就是动态加载的了:判断依据就是查看网页源代码的html里面没有table表格
而使用F12审查元素时可以看到table表格以及题目的各种信息
1.方案
为了解决这个问题可以采取以下几个途径:
0.5:爬取量不大时直接审查元素右键另存为嘛2333333
然后直接写个解析就好了嘛(作为一只咸鱼我首先想到的真的是这个QAQ)
1:模拟浏览器登录,等js加载完毕之后再解析。
2:先抓个包试试
以下将会详细分析
2.流程&方案执行
整个流程规划如下:
由于是自己的未完成题目: 模拟登录 - 进入题目列表 - 访问题目列表知道没有下一页
由于题目一直在增加想隔一段时间执行一次执行脚本
抛弃方案0.5首先选择的是模拟浏览器 代码比较简单
1 | browser = spynner.Browser() |
然而在实际操作的过程中发现运行太慢
资源占用比太大
家里网络不好常常直接timeout
然后我个智障某天拿手机开了个热点调试。。。。成功耗尽一个月的流量包。。
最后选择抓包尝试
网络请求如下图:
前3个请求为:https://leetcode.com/accounts/login/
https://leetcode.com/problemset/
https://leetcode.com/problemset/algorithms/
登录 - 进入题目列表
查看倒数第六个请求的返回值:
调用的是一个api接口:https://leetcode.com/api/problems/algorithms/
返回的是json数据~还是全部的orz
此文终结
最后提一下模拟登录的坑
需要提交一个csrftoken值
所以网络请求有4次
成果图
主要代码:
1 | # coding=utf-8 |
立个flag某狗狗说刷完leetcode带我去玩耍