您的位置:首页 > 其它

登录百度下载博客

2015-02-06 16:05 288 查看
[align=left]#coding:utf8[/align][align=left]#Author = yyobin@gmail.com[/align][align=left]#Create = 20120517[/align][align=left]
[/align][align=left]import cookielib, urllib2, urllib[/align][align=left]import os, sys,socket ,re[/align][align=left]
[/align][align=left]#解析有多少页博客[/align][align=left]pageStr = """allCount : '(\d+)',\s+pageSize : '(\d+)'"""[/align][align=left]pageObj = re .compile(pageStr, re .DOTALL)[/align][align=left]
[/align][align=left]#获取登陆token[/align][align=left]login_tokenStr = '''bdPass.api.params.login_token='(.*?)';'''[/align][align=left]login_tokenObj = re .compile(login_tokenStr,re .DOTALL)[/align][align=left]
[/align][align=left]#获取博客标题和url[/align][align=left]blogStr = r'''<div class="hide q-username"><a href=".*?" class=a-normal target=_blank>.*?</a></div><a href="(.*?)" class="a-incontent a-title cs-contentblock-hoverlink" target=_blank>(.*?)</a></div><div class="item-content cs-contentblock-detailcontent">'''[/align][align=left]blogObj = re .compile(blogStr,re .DOTALL)[/align][align=left]
[/align][align=left]class Baidu(object ):[/align][align=left] def __init__(self ,user = '' , psw = '' , blog = '' ):[/align][align=left] self .user = user#暂未考虑中文 ID[/align][align=left] self .psw = psw[/align][align=left] self .blog = blog[/align][align=left]
[/align][align=left]
[/align][align=left] if not os.path .exists( self.user ):[/align][align=left] os .mkdir( self.user )[/align][align=left]
[/align][align=left] self .cookiename = 'baidu%s.coockie' % ( self.user )[/align][align=left] self .token = ''[/align][align=left]
[/align][align=left] self .allCount = 0[/align][align=left] self .pageSize = 10[/align][align=left] self .totalpage = 0[/align][align=left]
[/align][align=left] self .logined = False[/align][align=left] self .cj = cookielib.LWPCookieJar ()[/align][align=left] try:[/align][align=left] self .cj. revert(self .cookiename)[/align][align=left] self .logined = True[/align][align=left] print "OK"[/align][align=left] except Exception,e:[/align][align=left] print e[/align][align=left]
[/align][align=left] self .opener = urllib2.build_opener(urllib2.HTTPCookieProcessor (self. cj))[/align][align=left] self .opener. addheaders = [('User-agent','Opera/9.23')][/align][align=left] urllib2 .install_opener(self.opener )[/align][align=left]
[/align][align=left] socket .setdefaulttimeout(30)[/align][align=left]
[/align][align=left] #登陆百度[/align][align=left] def login(self ):[/align][align=left] #如果没有获取到cookie,就模拟登陆一下[/align][align=left] if not self.logined :[/align][align=left] print "need logon"[/align][align=left] #第一次访问一下,目的是为了先保存一个 cookie下来[/align][align=left] qurl = '''https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false'''[/align][align=left] r = self. opener.open (qurl)[/align][align=left] self .cj. save(self .cookiename)[/align][align=left]
[/align][align=left] #第二次访问,目的是为了获取 token[/align][align=left] qurl = '''https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false'''[/align][align=left] r = self. opener.open (qurl)[/align][align=left] rsp = r. read()[/align][align=left] self .cj. save(self .cookiename)[/align][align=left]
[/align][align=left] #通过正则表达式获取token[/align][align=left] matched_objs = login_tokenObj.findall(rsp )[/align][align=left] if matched_objs:[/align][align=left] self .token = matched_objs[0 ][/align][align=left] print self. token[/align][align=left] #然后用token 模拟登陆[/align][align=left] post_data = urllib.urlencode({'username' :self. user,[/align][align=left] 'password':self .psw,[/align][align=left] 'token':self .token,[/align][align=left] 'charset':'UTF-8' ,[/align][align=left] 'callback':'parent.bd12Pass.api.login._postCallback' ,[/align][align=left] 'index':'0' ,[/align][align=left] 'isPhone':'false' ,[/align][align=left] 'mem_pass':'on' ,[/align][align=left] 'loginType':'1' ,[/align][align=left] 'safeflg':'0' ,[/align][align=left] 'staticpage':' https://passport.baidu.com/v2Jump.html',[/align][align=left] 'tpl':'mn' ,[/align][align=left] 'u':' http://www.baidu.com/',[/align][align=left] 'verifycode':'' ,[/align][align=left] })[/align][align=left] #path = 'http://passport.baidu.com/?login '[/align][align=left] path = ' http://passport.baidu.com/v2/api/?login'[/align][align=left] self .opener = urllib2.build_opener(urllib2.HTTPCookieProcessor (self. cj))[/align][align=left] self .opener. addheaders = [('User-agent','Opera/9.23')][/align][align=left] urllib2 .install_opener(self.opener )[/align][align=left] headers = {[/align][align=left] "Accept": "image/gif, */*",[/align][align=left] "Referer": "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" ,[/align][align=left] "Accept-Language": "zh-cn",[/align][align=left] "Content-Type": "application/x-www-form-urlencoded" ,[/align][align=left] "Accept-Encoding": "gzip, deflate",[/align][align=left] "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",[/align][align=left] "Host": "passport.baidu.com",[/align][align=left] "Connection": "Keep-Alive",[/align][align=left] "Cache-Control": "no-cache"[/align][align=left] }[/align][align=left] req = urllib2.Request(path ,[/align][align=left] post_data ,[/align][align=left] headers =headers,[/align][align=left] )[/align][align=left] rsp = self. opener.open (req). read()[/align][align=left] #如果觉得有必要的话,在这里自己读一下 rsp判断一下是否登陆OK,我打印过登陆没问题[/align][align=left] self .cj. save(self .cookiename)[/align][align=left] else:[/align][align=left] print "Login Fail"[/align][align=left] sys .exit( 0)[/align][align=left]
[/align][align=left] #获取博客一共有多少页,如果有私有博客的话,登陆和不登陆获取的是不一样的[/align][align=left] def getTotalPage(self ):[/align][align=left] #获取博客的总页数[/align][align=left] req2 = urllib2.Request(self .blog)[/align][align=left] rsp = urllib2.urlopen(req2 ).read()[/align][align=left] if rsp:[/align][align=left] rsp = rsp. replace('\r' ,''). replace('\n' ,''). replace('\t' ,'')[/align][align=left] matched_objs = pageObj.findall(rsp )[/align][align=left] if matched_objs:[/align][align=left] obj0 ,obj1 = matched_objs[0 ][/align][align=left] self .allCount = int(obj0 )[/align][align=left] self .pageSize = int(obj1 )[/align][align=left] self .totalpage = (self .allCount / self.pageSize ) + 1[/align][align=left] print self. allCount,self .pageSize,self.totalpage[/align][align=left]
[/align][align=left] #获取每一页里的博客链接[/align][align=left] def fetchPage(self ,url):[/align][align=left] req = urllib2.Request(url )[/align][align=left] rsp = urllib2.urlopen(req ).read()[/align][align=left] if rsp:[/align][align=left] rsp = rsp. replace('\r' ,''). replace('\n' ,''). replace('\t' ,'')[/align][align=left] matched_objs = blogObj.findall(rsp )[/align][align=left] if matched_objs:[/align][align=left] for obj in matched_objs:[/align][align=left] #这里可以用多线程改写一下 ,单线程太慢[/align][align=left] self .download(obj[0 ],obj[ 1])[/align][align=left]
[/align][align=left] def downloadBywinget(self ,url, title):[/align][align=left] pass#比如使用 wget之类的第三方工具,自己填参数写[/align][align=left]
[/align][align=left] #下载博客[/align][align=left] def download(self ,url, title):[/align][align=left] path = '%s/%s.html' % (self .user, title.decode ('utf-8'))[/align][align=left]
[/align][align=left] url = ' http://hi.baidu.com%s' % (url)[/align][align=left] print "Download url %s" % (url )[/align][align=left]
[/align][align=left] nFail = 0[/align][align=left] while nFail < 5:[/align][align=left] try:[/align][align=left] sock = urllib.urlopen(url )[/align][align=left] htmlSource = sock. read()[/align][align=left] myfile = file( path,'w' )[/align][align=left] myfile .write( htmlSource)[/align][align=left] myfile .close()[/align][align=left] sock .close()[/align][align=left] return[/align][align=left] except:[/align][align=left] nFail += 1[/align][align=left] print 'download blog fail:%s' % (url )[/align][align=left]
[/align][align=left] def dlownloadall(self ):[/align][align=left] for page in range(1 ,self. totalpage+1 ):[/align][align=left] url = "%s?page=%d" % (self .blog, page)[/align][align=left] #这里可以用多线程改写一下 ,单线程太慢[/align][align=left] self .fetchPage(url)[/align][align=left]
[/align][align=left]def main ():[/align][align=left] user = 'yourname' #你的百度登录名[/align][align=left] psw = 'password' # 你的百度登陆密码 ,不输入用户名和密码,得不到私有的文章[/align][align=left] blog = "http://hi.baidu.com/yourname " #你自己的百度博客链接[/align][align=left]
[/align][align=left] baidu = Baidu (user, psw,blog )[/align][align=left] baidu.login ()[/align][align=left] baidu.getTotalPage ()[/align][align=left] baidu.dlownloadall ()[/align][align=left]
[/align][align=left]if __name__ == '__main__':[/align][align=left] main()[/align]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: