在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的更多相关文章

  1. python爬取网页的通用代码框架

    python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...

  2. python爬虫学习(7) —— 爬取你的AC代码

    上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...

  3. python爬取豆瓣视频信息代码

    目录 一:代码 二:结果如下(部分例子)   这里是爬取豆瓣视频信息,用pyquery库(jquery的python库). 一:代码 from urllib.request import quote ...

  4. python爬取许多图片的代码

    from bs4 import BeautifulSoup import requests import os os.makedirs('./img/', exist_ok=True) URL = & ...

  5. Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

  6. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  7. python爬取某个网页的图片-如百度贴吧

    python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...

  8. Python:爬取乌云厂商列表,使用BeautifulSoup解析

    在SSS论坛看到有人写的Python爬取乌云厂商,想练一下手,就照着重新写了一遍 原帖:http://bbs.sssie.com/thread-965-1-1.html #coding:utf- im ...

  9. 使用python爬取MedSci上的期刊信息

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

随机推荐

  1. 开发自己PHP MVC框架(一)

    本教程翻译自John Squibb 的Build a PHP MVC Framework in an Hour,但有所改动,原文地址:http://johnsquibb.com/tutorials 这 ...

  2. [Android学习笔记]ScrollView的使用

    竖直滚动使用ScrollView 水平滚动使用HorizontalScrollView 如果需要禁止ScrollView的滚动,则需要扩展ScrollView类,重写onTouchEvent方法.

  3. C语言char s[] 和 char *s的差别

    C语言char s[] 和 char *s的差别,以下这个回答解说的非常清晰. The difference here is that char *s = "Hello world" ...

  4. Nginx分时段限制下载速度解决方案(原创)_于堡舰_新浪博客

    Nginx分时段限制下载速度解决方案(原创)_于堡舰_新浪博客 Nginx分时段限制下载速度解决方案(原创)    (2011-03-02 16:40:49)    转载▼    标签:    ngi ...

  5. set与map容器

    首先来看看set集合容器: set集合容器实现了红黑树的平衡二叉树数据结构,在插入元素时它会自动调整二叉树的排列,把该元素放到适当的位置,并且 保证左右子树平衡.平衡二叉检索树采用中序遍历算法. 对于 ...

  6. deque,list,queue,priority_queue

    1.deque deque双端队列容器与vector一样,采用线性表顺序存储结构,但与vector唯一不同的是,deque采用分块的线性存储结构来存 储数据,每块的大小一般为512字节,称为一个deq ...

  7. SCU 3133(博弈)

    传送门:windy和水星 -- 水星游戏 2 题意:在一张由 n*m 的格子组成的棋盘上放着 k 个骑士每个骑士的位置为(xi,yi),表示第xi行,第yi列骑士如果当前位置为(x,y),一步可以走的 ...

  8. Extjs 3.4 和 web SSH(Ajaxterm)-howge-ChinaUnix博客

    Extjs 3.4 和 web SSH(Ajaxterm)-howge-ChinaUnix博客   Extjs 3.4 和 web SSH(Ajaxterm) 2013-04-07 15:20:17 ...

  9. 福利 城市名的python list

    ["上海","北京","北京市","朝阳","朝阳区","海淀","元 ...

  10. Netflix公司监控内部安全的开源项目

    Netfix公司已经公布了三个内部工具,用于捕捉黑客在使用互联网服务时留下的痕迹. AndyHoernecke和Netflix公司的云安全团队成员ScottBehrens指出:"很多安全团队 ...