这个方法抓下来的网页,得不到相册图片,新浪要js动态生成图片,解决方法能够是:1. 本地用webkit跑抓下来的js;2.抓移动版微博的静态相册。 但都暂时未实现,欢迎回帖好方法,如下是转文。
----------------------------------------- php
咱们都知道HTTP是无链接的状态协议,可是客户端和服务器端须要保持一些相互信息,好比cookie,有了cookie,服务器才能知道刚才是这个用户登陆了网站,才会给予客户端访问一些页面的权限。 python
用浏览器登陆新浪微博,必须先登陆,登录成功后,打开其余的网页才可以访问。用程序登陆新浪微博或其余验证网站,关键点也在于须要保存cookie,以后附带cookie再来访问网站,才可以达到效果。 web
这里就须要Python的cookielib和urllib2等的配合,将cookielib绑定到urllib2在一块儿,就可以在请求网页的时候附带cookie。 ajax
具体作法,首先第一步,用firefox的httpfox插件,在浏览器衷开始浏览新浪微博首页,而后登录,从httpfox的记录中,查看每一步发送了那些数据请求了那个URL;以后再python里面,模拟这个过程,用urllib2.urlopen发送用户名密码到登录页面,获取登录后的cookie,以后访问其余页面,获取微博数据。 json
具体代码,来自豆瓣的一篇文章:地址 浏览器
本人加了点注释,欢迎你们一块儿品尝该同窗的完美代码: 服务器
#coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib
#获取一个保存cookie的对象
cj = cookielib.LWPCookieJar()
#将一个保存cookie对象,和一个HTTP的cookie的处理器绑定
cookie_support = urllib2.HTTPCookieProcessor(cj)
#建立一个opener,将保存了cookie的http处理器,还有设置一个handler用于处理http的URL的打开
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
#将包含了cookie、http处理器、http的handler的资源和urllib2对象板顶在一块儿
urllib2.install_opener(opener)
postdata = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'userticket': '1',
'ssosimplelogin': '1',
'vsnf': '1',
'vsnval': '',
'su': '',
'service': 'miniblog',
'servertime': '',
'nonce': '',
'pwencode': 'wsse',
'sp': '',
'encoding': 'UTF-8',
'url': '/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', 'returntype': 'META'
}
def get_servertime():
url = '/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939' data = urllib2.urlopen(url).read()
p = pile('\((.*)\)') try:
json_data = p.search(data).group(1)
data = json.loads(json_data)
servertime = str(data['servertime'])
nonce = data['nonce'] return servertime, nonce
except:
print 'Get severtime error!' return None
def get_pwd(pwd, servertime, nonce):
pwd1 = hashlib.sha1(pwd).hexdigest()
pwd2 = hashlib.sha1(pwd1).hexdigest()
pwd3_ = pwd2 + servertime + nonce
pwd3 = hashlib.sha1(pwd3_).hexdigest() return pwd3
def get_user(username):
username_ = urllib.quote(username)
username = base64.encodestring(username_)[:-1] return username
def main():
username = ''#微博帐号
pwd = 'xxxx'#微博密码
url = '/sso/login.php?client=ssologin.js(v1.3.18)' try:
servertime, nonce = get_servertime()
except: return global postdata
postdata['servertime'] = servertime
postdata['nonce'] = nonce
postdata['su'] = get_user(username)
postdata['sp'] = get_pwd(pwd, servertime, nonce)
postdata = urllib.urlencode(postdata)
headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/0101 Firefox/8.0'}
#其实到了这里,已经可以使用urllib2请求新浪任何的内容了,这里已经登录成功了
req = urllib2.Request(
url = url,
data = postdata,
headers = headers
)
result = urllib2.urlopen(req)
text = result.read()
#print text
p = pile('location\.replace\(\'(.*?)\'\)') try:
login_url = p.search(text).group(1)
print login_url
#print login_url
urllib2.urlopen(login_url)
print "login success"
except:
print 'Login error!'
#测试读取数据,下面的URL,能够换成任意的地址,都能把内容读取下来
req = urllib2.Request(url='/aj/mblog/mbloglist?page=1&count=15&max_id=3463810566724276&pre_page=1&end_id=3458270641877724&pagebar=1&_k=134138430655960&uid=2383944094&_t=0&__rnd=1341384513840',) result = urllib2.urlopen(req)
text = result.read()
print len(result.read())
#unicode(eval(b),"utf-8")
print eval("u'''"+text+"'''")
main()
其实获取了模拟登录后的urllib2,能够作抓数据等任何事情,你甚至能够写一个多线程的爬虫来爬遍新浪微博,我一直有这个想法,可历来没有实现。若是您有什么进展,请联系我共同进步。 cookie