简单爬虫实现登录新浪微博(python2.7)

因为图论作业,所以要写一个爬虫,就开始学python。接触python开始,就觉得这个语言非常舒服,不需要定义变量,不需要分号,非常简洁。

下面就聊聊,我写爬虫的经历。上网搜了一下爬虫的代码,发现简单爬虫还是非常好写的,主要用到python中的urllib,urllib2这些库,对于网页进行操作,同时会用到正则表达式获取想要的内容。

有一个问题是,我们有时候需要爬取一些登录之后的信息,如果没有登录,获得的信息非常少,没法满足我们的需求。

下面以新浪微博为例。

先贴代码,注释很详细,等大作业写完有时间了,再详细说如何一步步做。简单说就是需要处理:postdata,cookie,prelogin,加密算法。

#coding=utf8
# import 这边需要注意的是只有一个rsa这个模块是需要install的,其他的都是内置
import re , urllib , urllib2, cookielib , base64 , binascii , rsa

# 让接下来的所有get和post请求都带上已经获取的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support , urllib2.HTTPHandler)
urllib2.install_opener(opener)

# 封装一个用于get的函数,新浪微博这边get出来的内容编码都是-8
def getData(url) :
    request = urllib2.Request(url)
    response = urllib2.urlopen(request)
    text = response.read().decode('utf-8')
    return text

# 封装一个用于post的函数,验证密码和用户名都是post的,所以这个postData在本demo中专门用于验证用户名和密码
def postData(url , data) :
# headers需要我们自己来模拟
    headers = {'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'}
# 这里的urlencode用于把一个请求对象用'&'来接来字符串化,接着就是编码成utf-8
    data = urllib.urlencode(data).encode('utf-8')
    request = urllib2.Request(url , data , headers)
    response = urllib2.urlopen(request)
    text = response.read().decode('gbk')
    return text


def login_weibo(nick , pwd) :
#==========================获取servertime , pcid , pubkey , rsakv===========================
# 预登陆请求,获取到若干参数
    prelogin_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.15)&_=1400822309846' % nick
    preLogin = getData(prelogin_url)
# 下面获取的四个值都是接下来要使用的
    servertime = re.findall('"servertime":(.*?),' , preLogin)[0]
    pubkey = re.findall('"pubkey":"(.*?)",' , preLogin)[0]
    rsakv = re.findall('"rsakv":"(.*?)",' , preLogin)[0]
    nonce = re.findall('"nonce":"(.*?)",' , preLogin)[0]
#===============对用户名和密码加密================
# 各种加密,最后形成了加密后的su和sp
    su = base64.encodestring(urllib.quote(nick))
    rsaPublickey = int(pubkey , 16)
    key = rsa.PublicKey(rsaPublickey , 65537)
    message = str(servertime) + '\t' + str(nonce) + '\n' + str(pwd)
    sp = binascii.b2a_hex(rsa.encrypt(message , key))
#=======================登录=======================  
#param就是激动人心的登陆post参数,这个参数用到了若干个上面第一步获取到的数据
    param = {'entry' : 'weibo' , 'gateway' : 1 , 'from' : '' , 'savestate' : 7 , 'useticket' : 1 , 'pagerefer' : 'http://login.sina.com.cn/sso/logout.php?entry=miniblog&r=http%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl%3D' , 'vsnf' : 1 , 'su' : su , 'service' : 'miniblog' , 'servertime' : servertime , 'nonce' : nonce , 'pwencode' : 'rsa2' , 'rsakv' : rsakv , 'sp' : sp , 'sr' : '1680*1050' ,
             'encoding' : 'UTF-8' , 'prelt' : 961 , 'url' : 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack'}
# 这里就是使用postData的唯一一处,也很简单
    s = postData('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)' , param)
# 这个urll是登陆之后新浪返回的一段脚本中定义的一个进一步登陆的url,之前还都是获取参数和验证之类的,这一步才是真正的登陆,所以还需要再一次把这个urll获取到并用get登陆即可
    urll = re.findall("location.replace\(\'(.*?)\'\);" , s)[0]
    getData(urll)

# 登录微博
login_weibo('你的账号名','你的密码')
#======================获取粉丝====================
# 可以尝试着获取自己的微博主页
text = getData('http://weibo.com/5548896862/follow?from=page_100505&wvr=6&mod=headfollow#place').encode('utf-8')
fp = open('yeah.txt' , 'w')
fp.write(text)
fp.close()

最后是我的的微博主页,跪求互粉~~

http://weibo.com/u/5778958604

此博客中的内容均为原创或来自网络,不用做任何商业用途。欢迎与我交流学习,我的邮箱是lsa0924@163.com

posted @ 2015-11-29 14:02  华丽的sky  阅读(562)  评论(3编辑  收藏  举报