写下这篇文章的时候,是博主学习python的第三天( 也许是第四天:( ),python是博主接触的第二门解释型语言(第一门是javascript)。
讲真在很久之前就想要用博客记录自己的学习历程了,然而就像写日记一样,写着写着就放弃了-。-
so今天决定给自己一个好的开端~
博主的学习方式是直奔目的,遇到问题百度各种博客,网站,百度找不到google找,就这样。这种学习方式是真的见效快,但显而易见,基础会比较薄弱。
因此学习python的基本语法,就直奔爬虫了!
-----------------------------------以上是一段大前言---------------------------------------------
今天博主要把三天学习spider的过程,经验分享出来,希望能给一些新手们指点一下道路,也给自己的python生涯刻一道痕迹。
博主愚以为,模拟登陆网站无非有两种方式:
-
一是手动收取cookie。
在浏览器登陆网站并完成登录后,然后打开开发者工具,随便访问某页面,根据实际情况找一条request,把cookie复制下来。
-
二是python收取cookie。
这也是本篇文章详细阐述的。见下。
现在让博主以imooc.com为例讲解一下网站的模拟登陆
开始
博主习惯用urllib2+cookielib的方式写爬虫,所以代码的一开始是这样的:
#coding=utf8 import sys reload(sys) sys.setdefaultencoding('utf8') import urllib2 import urllib import cookielib #以上是套路 #以下创建一个cookiejar管理cookie,同时创建opener并安装到urllib2中 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) opener.addheaders=[('user-agent','Mozilla/5.0')]
opener.addheaders可以以list的形式添加header,非常方便
然后
cookie是一种服务器记录用户信息的小文件,尽管有时候会侵犯大家的隐私,但是在存储用户的登录信息实现自动登陆的方式还是很方便的。
它的工作流程是这样的:
- 首先服务器会在第一次访问网站时向浏览器返回一个response,其中会有几条set-cookie的信息,于是浏览器默默帮你把它记录到cookie中去
- 当你点击登陆,输入用户名、密码等必要信息后,浏览器会将你的信息连同以上cookies中的某些一并post给服务器
- 登陆成功后浏览器又收到服务器的悄悄话——得到几条重要cookie并保存下来
- 如果此时你没关闭浏览器,在访问该网站其他页面时,浏览器会把某些cookie发送给服务器,这时候你发现你已经自动登录了
- 如果登陆时你选择了“自动登录”“7天内自动登陆”诸如此类checkbox,浏览器还会得到一些长久的cookie(十天半个月的)以便你明天登陆,后天登陆。。。。
了解cookie的工作原理后,我们访问一下主页,把cookie搞下来
博主是这样写的:
#先写下几条url url_login = 'http://www.imooc.com/passport/user/login' url_index = 'http://www.imooc.com' url_test = 'http://www.imooc.com/user/setbindsns' data = { 'username':'*********', 'password':'*******', 'verify':'', 'remember':'1', 'pwencode':'0', 'referer':'http://www.imooc.com' } data_encoded = urllib.urlencode(data) #get主页获取cookie req_index = urllib2.Request(url_index) res_index = opener.open(req_index)
我们可以打印下cookie看看:
print cj._cookies
{'www.imooc.com': {'/': {'PHPSESSID': Cookie(version=0, name='PHPSESSID', value='3q1c66hds4h054f19ciqb4rtg2', port=None, port_specified=False, domain='www.imooc.com', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)}}, '.imooc.com': {'/': {'imooc_isnew_ct': Cookie(version=0, name='imooc_isnew_ct', value='1486280759', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), 'cvde': Cookie(version=0, name='cvde', value='5896d8376631d-1', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False), 'imooc_isnew': Cookie(version=0, name='imooc_isnew', value='1', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), 'imooc_uuid': Cookie(version=0, name='imooc_uuid', value='d6a73549-4d53-47b6-90bc-28888d3438b8', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)}}}
这是什么,我不知道。Let it go.
然后
那我们带着cookie去登陆吧!不知道带哪一条?全带走!
req_login = urllib2.Request(url_login,data_encoded)
res_login = opener.open(req_login)
我们试着把结果打印在html上:
imooc = open('e:/imooc.html','w') imooc.write(res_login.read()) imooc.close()
当我们打开:
这TM好像不是个html,通常情况下他会返回一个html,然而这串符号难住了学了3天python的小白。
注意到一条信息: “msg” : "\u6210\u529f"显然是unicode格式的字符串,简单转化后,他的意思是 :“成功”
博主窃喜。既然成功了,那么有效信息一定存在于这串符号中。
到此,正确的思路是,拿着这2条url,uid用开发者工具继续搜索相关信息。
。。
然而博主走了一条小弯路。
逆向分析大法
博主决定把登陆之后的cookies复制下来,逐条测试登陆需要的cookie
很简单,一条一条的删,看什么时候能登陆就好了。。。
。。。。
经过筛选,博主找到2条我们需要的cookie:loginstate、apsid。
于是博主决定在近百条cookie中找一下apsid这条信息
。。。
找到了!
而访问的url就是我们得到的2条之一!只是带了几个参数
实践证明这2条随便选一条get一下就得到我们需要的cookie了。
窃喜
我们需要3个参数:token(url已经附带)、callback、 _(下划线-。-)
经验证 ,callback参数是固定值。
好的,那我们搜索一下下划线的值。
查下cookie,发现它是imooc_isnew_ct的值
到这里基本已经大功告成了~
全部代码:
#coding=utf8 #最后版本 import sys reload(sys) sys.setdefaultencoding('utf8') import urllib2 import urllib import cookielib cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) opener.addheaders=[('user-agent','Mozilla/5.0')] url_login = 'http://www.imooc.com/passport/user/login' url_index = 'http://www.imooc.com' url_test = 'http://www.imooc.com/user/setbindsns' data = { 'username':'13153154784', 'password':'liuweidong', 'verify':'', 'remember':'1', 'pwencode':'0', 'referer':'http://www.imooc.com' } data_encoded = urllib.urlencode(data) #get主页获取cookie req_index = urllib2.Request(url_index) res_index = opener.open(req_index) print cj._cookies print #post登陆页面 req_login = urllib2.Request(url_login,data_encoded) res_login = opener.open(req_login) print res_login.read() res_dict = eval(res_login.read()) url_ssologin = res_dict['data']['url'][0] print url_ssologin import re url_ssologin = re.sub(r'\\/','/',url_ssologin) print url_ssologin params = { 'callback':'jQuery19106404770042720387_1486274878204', '_': str(cj._cookies['.imooc.com']['/']['imooc_isnew_ct'])[23:33] } url_ssologin = url_ssologin+'&'+urllib.urlencode(params) #sso登陆页面 req_sso = urllib2.Request(url_ssologin) res_sso = opener.open(req_sso) # print res_sso.read() # print cj._cookies['.imooc.com']['/']['loginstate'] req_test = urllib2.Request(url_test) res_test = opener.open(req_test) imooc = open('c:/users/asus/desktop/imooc.html','w') imooc.write(res_test.read()) imooc.close()
博主其实遇到了好多问题,走了好多弯路,感谢某dalao的无私帮助:)
第一次写博客,欢迎技术交流与指正~