第一步就是要登录网站,而目前主流网站的登陆过程大同小异。于是乎,我就拿了人人网(www.renren.com)来试手。至于为什么用它,因为很多网站的登陆过程太复杂了,它稍微简单点。
主要用python实现了对网站的模拟登录。需要自己构造数据接口,这就需要抓包看登陆的时候到底发了什么数据。
firefox有一个很好用的工具HTTPfox来抓取http数据包,主要看url,postdata,header,cookie,user-agent等数据。
我们要构造自己的HTTP数据包,并发送给指定url。我们通过urllib2等几个模块提供的API来实现request请求的发送和相应的接收。
大部分网站登录时需要携带cookie,所以我们还必须设置cookie处理器来保证cookie。
#!/usr/bin/python
# -*- coding:utf-8 -*-
import urllib
import urllib2
import cookielib
#登录的主页面
hosturl = 'http://www.renren.com/'
#post数据接收和处理的页面,点登陆的时候http POST的链接
posturl = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20151021027896'
#设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
#打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
h = urllib2.urlopen(hosturl)
#构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0',
'Referer' : 'http://www.renren.com/'
}
#抓包获取参数,password一般会通过某种方式加密。
postData = {
'email':'xxxxxx',
'icode':'',
'origURL':'http://www.renren.com/home',
'domain':'renren.com',
'key_id':1,
'captcha_type':'web_login',
'password':'xxxxxx',
'rkey':'70153f87e588d34f588cccecdd878d66',
'f':''
}
postData = urllib.urlencode(postData)
#通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程
request = urllib2.Request(posturl, postData, headers)
print request
response = urllib2.urlopen(request)
text = response.read()
text = text.replace("true","1").replace("false","0")
text = eval(text)
url = text.get('homeUrl') # 这个才是你人人主页的真实url
if not url:
print "error"
response = urllib2.urlopen(url)
result = response.read().decode("utf-8").encode("gbk")
print result
注:
2.http POST登陆的链接有可能是动态的,从GET返回的信息中获取。
3.PASSWORD有些是明文发送,有些是加密后发送,腾讯的更牛逼,动态加密的,里面有很多其他数据的加密信息,不只是密码。不过好像能通过查看JS源码获得加密算法。
4.大多数网站的登陆整体流程类似,可能有些细节不一样。所以不能保证其他网站登陆成功,还有待研究。