[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>
下面是代码:
用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()
相关文章推荐
- PySide——Python图形化界面入门教程(二)
- 自学Python实现简答的爬虫
- Element is not clickable at point (1108, 190). Other element would receive the click
- Python unittest测试框架详解
- PYTHON介绍
- python数据分析2:双色球 蓝红球分析统计
- Python中的反射
- 安装PIL库时提示python未注册错误(自定义python安装路径)
- 如何进行 Python性能分析,你才能如鱼得水?
- [Python]第六讲:tuple
- [Python]第五讲:list
- 如何进行 Python性能分析,你才能如鱼得水?
- Python-open读写模式
- python操作字典类型的常用方法(推荐)
- Python:正则表达式
- PYTHON-基础-时间日期处理小结
- python核心编练习答案
- python字典的常用操作方法小结
- 使用python读取大文件
- 使用python读取大文件