Python爬取登录后的OJ练习中的题目数据

备注:python:2.7.12  ubantu:16.04(32位)浏览器:Firefox


这段时间一直在研究爬虫,也写过爬小电影磁力链接、花瓣网美女图片啥的,不过那些都没什么卵用,为了正义,这次我选择了爬OJ题目!

(其实是因为想练习一下request登录之后保存cookies~~)


博主是湖南农业大学的大三学生,因为本校ACM较弱(苦笑脸),OJ也没啥人维护,窃以为很容易爬,就拿来练手啦hhhhhhh

OJ地址:http://210.43.224.19/oj/

找到登录页面按好F12~~~

Python爬取登录后的OJ练习中的题目数据_第1张图片



然后我们随便输入一个账号和密码,这样网页会给我们弹出一个密码错误的提示,不会跳转,就可以抓到一个post请求

Python爬取登录后的OJ练习中的题目数据_第2张图片


点进去就可以在右边看到headers和要传的参数,这样就可以对症下药啦

Python爬取登录后的OJ练习中的题目数据_第3张图片


在消息头的右边的右边有个参数 -.-

Python爬取登录后的OJ练习中的题目数据_第4张图片

这样我们需要post的数据就已经出来了

datas={'user_id':'xxx','password':'xxx','csrf':csrf}

id和password都好理解,但是这个csrf是个什么东西呢??


其实这个csrf在原来的登录页面的html里面有,不信可以找找看?

Python爬取登录后的OJ练习中的题目数据_第5张图片


但是= =  尴尬的是 我本来以为直接urlopen获取的html里面就有!但是。。。我用正则匹配了半天竟然没找到! 生气

你们可以先试试。。。。

------------------------------------------

后来看了一下network才发现,点进这个页面的时候竟然有个get请求,天啦噜

Python爬取登录后的OJ练习中的题目数据_第6张图片



而且这名字。。。真的通俗易懂,点浏览器进去查看了一下html代码发现真的是那个csrf的vaule,就很气。。。。。

Python爬取登录后的OJ练习中的题目数据_第7张图片


好啦,到这里所有参数都获取到了 接下来就是敲代码登录以及爬取题目数据了,登录好了就可以用BeautifulSoup处理了,都很简单了啦~就不多写了~

最重要的!贴代码!


#author:huxinjianzs

import requests
import urllib2
import re
from bs4 import BeautifulSoup

loginurl='http://210.43.224.19/oj/login.php'    #实际提交表单页面
headers={'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:55.0) Gecko/20100101 Firefox/55.0'}

def getcsrf():
    firsturl='http://210.43.224.19/oj/csrf.php'   #获取csrf请求页面
    req=urllib2.Request(firsturl)
    page=urllib2.urlopen(req)
    html=page.read()
    t=re.compile(r'name="csrf" value="(.+)" ')      #使用正则表达式进行匹配
    list=t.findall(html)
    return list[0]
def login(datas):
    geturl='http://210.43.224.19/oj/contest.php?cid=2176'   #需要爬取的登录之后的页面 
    s=requests.session()            #构建session对象
    Post=s.post(loginurl,data=datas,headers=headers)   #post数据
    Get=s.get(geturl,cookies=Post.cookies,headers=headers) 
    return Get.content          #返回html
def download(html):
    Soup=BeautifulSoup(html)
    list=Soup.findAll('tr',class_={'evenrow','oddrow'})
    name=re.compile(r'">(.+)')
    href=re.compile(r'href="(.+)">')
    url='http://210.43.224.19/oj/'
    for i in list:
        print i.text+'  '+url+i.find('a').attrs['href']
csrf=getcsrf()
paprm={'user_id':'xxx','password':'xxx','csrf':csrf}
html=login(paprm)
download(html)






你可能感兴趣的:(其他)