【原创】用Python爬取LeetCode的AC代码到Github
在leetCode写了105道题高调膜科,考虑搬迁到自己的GitHub上,做成一个解题题库,面试的时候也可以秀一个
但是!但是!
leetCode在线IDE的功能不要太舒服,我直接线上A了不少题,本地没有代码,除非有题调试半天A不来,本地才有存代码
于是我就考虑,直接用Python把leetCode上的AC代码爬下来,然后扔到本地github文件夹里,然后一个同步大法
大概涉及的知识:
0、cookie
1、网站的结构分析
2、脚本登陆
3、脚本爬站
----------------------------------------------------------------------------------------------------------------------------------------------
一、自动登录
Python的cookielib + urllib2 + urllib,然后leetCode这个网站有个Django的什么鸟码,在访问主页时会作为cookie发送过来,而在登录页面需要同时提交这个码,这个时候注意先访问主页,提取了这个码以后再访问登录页面,然后一同提交。
再有就是要修改header,我改了referer,之前一直403,wtf。。
code :
import urllib2
import cookielib
import urllib
mydir = r'C:/Users/user/Documents/GitHub/leetcode/'
myhost = r'https://oj.leetcode.com'
cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
urlOpener = urllib2.build_opener(handler)
urlOpener.open('https://oj.leetcode.com/')
csrftoken = ""
for ck in cookie:
csrftoken = ck.value
login = "shadowmydx"
mypwd = "**********" # 密码
values = {'csrfmiddlewaretoken':csrftoken,'login':login,'password':mypwd,'remember':'on'}
values = urllib.urlencode(values)
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6)Gecko/20091201 Firefox/3.5.6', \
'Origin':'https://oj.leetcode.com','Referer':'https://oj.leetcode.com/accounts/login/'}
request = urllib2.Request("https://oj.leetcode.com/accounts/login/",values,headers=headers)
url = urlOpener.open(request)
page = url.read()
二、爬站
切割成几个子问题。首先,找到AC的题目地址,其次,找到AC的代码地址,最后,把AC代码爬到本地的GitHub项目文件夹中。
由于leetCode的IDE是js实现的动态页面,所以不能用FireBug直接审查元素来抓,而是要从发送过来的js代码中抓AC代码。这就意味着需要一个字典来转换特殊字符
def saveCode(code,title):
global mydir
f = open(mydir + title + '.cpp','w')
f.write(code)
def downloadCode(refer,codeadd,title):
global headers
global urlOpener
global myhost
headers['Referer'] = refer
request = urllib2.Request(codeadd,headers=headers)
url = urlOpener.open(request)
all = url.read()
tar = "storage.put('cpp',"
index = all.find(tar,0)
start = all.find('class Solution',index)
finis = all.find("');",start)
code = all[start:finis]
toCpp = {'\u000D':'\n','\u000A':'','\u003B':';','\u003C':'<','\u003E':'>','\u003D':'=',\
'\u0026':'&','\u002D':'-','\u0022':'"','\u0009':'\t','\u0027':"'",'\u005C':'\\'}
for key in toCpp.keys():
code = code.replace(key,toCpp[key])
saveCode(code,title)
def findCode(address,title):
global headers
global urlOpener
global myhost
headers['Referer'] = address
address += 'submissions/'
print 'now is dealing ' + address + ': ' + title
request = urllib2.Request(address,headers=headers)
url = urlOpener.open(request)
all = url.read()
tar = 'class="text-danger status-accepted"'
index = all.find(tar,0)
start = all.find('href="',index)
finis = all.find('">',start)
downloadCode(address,myhost + all[start + 6:finis],title)
def findAdd(page):
index = 0
while 1:
index = page.find('class="ac"',index)
if index != -1:
index += 1
start = page.find('<td><a href="',index)
finis = page.find('">',start)
tmpfin = page.find('<',finis)
title = page[finis + 2:tmpfin]
findCode(myhost + page[start + 13:finis],title)
else:
break
最后,调用findAdd(page),大功告成
后记:最先的想法是做一个多线程的版本,后来想想还是先实现功能再说,否则就又增加一个烂尾玩具了。。
【原创】用Python爬取LeetCode的AC代码到Github的更多相关文章
- python爬取网页的通用代码框架
python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...
- python爬虫学习(7) —— 爬取你的AC代码
上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...
- python爬取豆瓣视频信息代码
目录 一:代码 二:结果如下(部分例子) 这里是爬取豆瓣视频信息,用pyquery库(jquery的python库). 一:代码 from urllib.request import quote ...
- python爬取许多图片的代码
from bs4 import BeautifulSoup import requests import os os.makedirs('./img/', exist_ok=True) URL = & ...
- Python 爬取所有51VOA网站的Learn a words文本及mp3音频
Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...
- python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
- python爬取某个网页的图片-如百度贴吧
python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...
- Python:爬取乌云厂商列表,使用BeautifulSoup解析
在SSS论坛看到有人写的Python爬取乌云厂商,想练一下手,就照着重新写了一遍 原帖:http://bbs.sssie.com/thread-965-1-1.html #coding:utf- im ...
- 使用python爬取MedSci上的期刊信息
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
随机推荐
- POJ 2991 Crane(线段树+计算几何)
POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...
- delphi 回调函数
program Project2; {$APPTYPE CONSOLE} uses SysUtils; type //定义一个对象事件方法 TCallbackFunc = function (i: I ...
- SetDlgItemText控件运行错误
SetDlgltem函数把一个WM_SETTEXT消息发送到指定的控件. 今天在测试一个小程序,发现使用SetDlgItemText控件编译没问题,但是运行就出错误. 语句为: time=CTime: ...
- [IDEs]Eclipse设置花括号样式
用惯Vistual Studio,在使用Eclipse时发现有很多东西还是挺不习惯,第一个就要解决花括号的样式 步骤: 1.Windows->Preferences->Java->C ...
- Mysql rr和rc隔离
REPEATABLE READ This is the default isolation level for InnoDB. For consistent reads, there is an im ...
- 10105 - Polynomial Coefficients
描述:杨辉三角与二项式定理 #include <cstdio> int solve(int n,int m) { int sum=1; for(int i=n; i>m; --i) ...
- 不要打开文件,阅读Rvt信息档案
叶老师,想问一下是否能基于revit API 2014,直接在开发时传递给程序要处理的文件名称和路径.而不用再在revit软件中打开为当前活动视图,就直接获得文件里信息.这样可行不? 答: 能够.你能 ...
- OCP读书笔记(12) - 执行闪回数据库
闪回数据库使用的是闪回日志,闪回日志存在于闪回目录(也就是快速闪回区中)闪回日志:就是数据块修改之前的镜像,简称前像 1.查看闪回目录的位置:show parameter recovery 如果闪回目 ...
- POj 1879 Tempus et mobilius Time and motion (模拟+群)
题目特别长,大意为球的传递. 三个轨道,一个库.各自是分钟单位的轨道.5min单位的轨道.一小时单位的轨道.还有就是n容量的库. 每过一分钟,一个小球从库里面出来,库符合先进先出,进入分钟轨道.假设分 ...
- (step 8.2.13)hdu 1524(A Chess Game)
题目大意 : 在一个 有向无环图顶点上面有几个棋子, 2个人轮流操作, 每次操作就是找一个棋子往它能够移 动的地方移动一格, 不能操作的人输. 输入第一行 为一个 N , 表示有 N 个顶点 0 -& ...