您的位置:首页 > 编程语言 > Python开发

[python爬虫]模拟登陆扇贝单词

2016-05-16 16:25 736 查看
登完了教务处,就试试登陆别的吧,这次选择的是扇贝单词的网页版,貌似是用djando搭建的。

用chrome的开发者工具先观察一下登陆的过程,可以发现post表单的内容还是比较简单的,就是自己的用户名密码,还有一个csrftoken的东东,虽然不知道是啥,至少用户名密码没有进行加密处理一切就好办了。

顺便学习一下什么是csrf。

CSRF(Cross-site request forgery)跨站请求伪造,由于目标站无token/referer限制,导致攻击者可以用户的身份完成操作达到各种目的。

不明觉厉。。

多登陆了几次发现这个csrf值是会变每次随机生成的,大概也是为了安全吧,那么怎么获得呢。再次分析一下登陆过程,发现中未登陆前的cookie里会有一个csrf值,和登陆后post表单里的值是一样的,大概就是服务器先随机生成一个token,跟随用户信息一起提交的时候检测是否一致,一致了才产生一个session登陆成功,防止别人盗用这个身份进行攻击,多了一道防御吧。。那么既然如此我们就从cookie中拿出csrf跟随表单一起提交就可以了。

登陆过程还遇到了两个问题,一开始总是登陆超时,是因为Content-Length这个头部,注释掉就好了,后来爬下来的信息出现编码问题,'Accept-Encoding' : 'gzip, deflate'这个头部注释掉也就好了。具体原因我还说不太清楚,网络知识还是太欠缺了。同时也学到了头部信息也不是越多越全就好的。。。

好了,爬下来的信息中包括下面几行,这样就说明登陆成功了。然而登陆成功了之后发现页面是JS渲染的,爬下来的静态网页里显示不了我需要的很多信息。。晕,那就改天再用selenium+phantomjs来爬取一下吧~

<li><a class="sb-nav-menu-a" href="/home/">我的空间</a></li>

<li><a class="sb-nav-menu-a" href="/checkin/mine/">我的打卡</a></li>

<li><a class="sb-nav-menu-a" href="/camp/">我的班级</a></li>

<li><a class="sb-nav-menu-a" href="/checkin/insurance/">我的保险</a></li>

<li class="divider"></li>

<li><a class="sb-nav-menu-a" href="/message/">短信</a></li>

<li><a class="sb-nav-menu-a" href="/coins/account/">贝壳</a></li>

<li class="divider"></li>

<li><a class="sb-nav-menu-a" href="/accounts/setting/">设置</a></li>

<li><a class="sb-nav-menu-a" href="/accounts/logout/">退出</a></li>

下面是代码:

# -*- coding: utf-8 -*-
"""
Created on Fri May 13 20:13:41 2016

@author: DJ
"""

import urllib2
import urllib
import re
import cookielib
import requests

class shanbei:
def __init__(self,username,password):

self.username=username
self.password=password
self.cookiejar = cookielib.LWPCookieJar()#LWPCookieJar提供可读写操作的cookie文件,存储cookie对象
self.cookieSupport= urllib2.HTTPCookieProcessor(self.cookiejar)
self.opener = urllib2.build_opener(self.cookieSupport, urllib2.HTTPHandler)
urllib2.install_opener(self.opener)
self.headerdic={
'Accept'    : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
#            'Accept-Encoding' : 'gzip, deflate',
#            'Accept-Language' : "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4,zh-TW;q=0.2",
'Cache-Control'        : 'max-age=0',
'Connection' : 'keep-alive',
#            'Content-Length' : '119',
#            'Content-Type' : 'application/x-www-form-urlencoded',
'Host' : 'www.shanbay.com',
'Origin' : 'https://www.shanbay.com',
'Referer' : 'https://www.shanbay.com/accounts/login/',
'Upgrade-Insecure-Requests' : '1',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2723.3 Safari/537.36'
}

def login(self):
self.loginURL="https://www.shanbay.com/accounts/login/"
self.response = self.opener.open(self.loginURL)
for item in self.cookiejar:
if item.name=='csrftoken':
self.scrf=item.value
self.postdata={'username':self.username,'password':self.password,'csrfmiddlewaretoken':self.scrf}
postData=urllib.urlencode(self.postdata)
print self.postdata
request=urllib2.Request(url=self.loginURL,data=postData,headers=self.headerdic)
response = self.opener.open(request)
url = response.geturl()
text = response.read()
print url
f=open(r'H:\shanbeispider\a.txt','w')
f.write(text)
print text

if __name__=='__main__':
a=shanbei('用户名','密码')
a.login()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: