Python模拟新浪微博登录
最近实验室的项目,需要一些真实的数据,而我们选择了从新浪微博抓取数据。对于新浪微博来说,只要登录了以后,微博以及关注和被关注等等信息才是可见的,所以要抓取,第一步是要模拟登录。
一开始,我打算按照这里的方法登录weibo.com并获取信息,但是发现新浪微博初始的页面的数据是放在JS中并以json格式存放的,页面加载的时候才渲染到HTML中,于是我解析了JS代码,证明此法可行,但是接下来遇到问题,因为我们打开新浪微博是不会一次性加载的,移到页面低端的时候才会加载一部分,这个很难模拟,虽然可以通过分析ajax数据得到,但是由于GET的参数多达十几个,这需要时间来分析这些参数的含义,这么做很麻烦。于是我想到,可以通过登录手机版的微博:weibo.cn来获取,而手机版的页面几乎没有JS,数据几乎都在HTML中,而且加载剩余的数据是通过分页进行的。
weibo.cn和weibo.com不是使用一种登录机制,下面直接贴出代码,代码的内容并不难,主要是登录的流程。
代码中用到了lxml库来解析HTML。Windows系统可以在这里下载二进制包。
import urllib2 import urllib import cookielib import lxml.html as HTML class Fetcher(object): def __init__(self, username=None, pwd=None, cookie_filename=None): self.cj = cookielib.LWPCookieJar() if cookie_filename is not None: self.cj.load(cookie_filename) self.cookie_processor = urllib2.HTTPCookieProcessor(self.cj) self.opener = urllib2.build_opener(self.cookie_processor, urllib2.HTTPHandler) urllib2.install_opener(self.opener) self.username = username self.pwd = pwd self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer':'','Content-Type':'application/x-www-form-urlencoded'} def get_rand(self, url): headers = {'User-Agent':'Mozilla/5.0 (Windows;U;Windows NT 5.1;zh-CN;rv:1.9.2.9)Gecko/20100824 Firefox/3.6.9', 'Referer':''} req = urllib2.Request(url ,urllib.urlencode({}), headers) resp = urllib2.urlopen(req) login_page = resp.read() rand = HTML.fromstring(login_page).xpath("//form/@action")[0] passwd = HTML.fromstring(login_page).xpath("//input[@type='password']/@name")[0] vk = HTML.fromstring(login_page).xpath("//input[@name='vk']/@value")[0] return rand, passwd, vk def login(self, username=None, pwd=None, cookie_filename=None): if self.username is None or self.pwd is None: self.username = username self.pwd = pwd assert self.username is not None and self.pwd is not None url = 'http://3g.sina.com.cn/prog/wapsite/sso/login.php?ns=1&revalid=2&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%D0%C2%C0%CB%CE%A2%B2%A9&vt=' rand, passwd, vk = self.get_rand(url) data = urllib.urlencode({'mobile': self.username, passwd: self.pwd, 'remember': 'on', 'backURL': 'http://weibo.cn/', 'backTitle': '新浪微博', 'vk': vk, 'submit': '登录', 'encoding': 'utf-8'}) url = 'http://3g.sina.com.cn/prog/wapsite/sso/' + rand req = urllib2.Request(url, data, self.headers) resp = urllib2.urlopen(req) page = resp.read() link = HTML.fromstring(page).xpath("//a/@href")[0] if not link.startswith('http://'): link = 'http://weibo.cn/%s' % link req = urllib2.Request(link, headers=self.headers) urllib2.urlopen(req) if cookie_filename is not None: self.cj.save(filename=cookie_filename) elif self.cj.filename is not None: self.cj.save() print 'login success!' def fetch(self, url): print 'fetch url: ', url req = urllib2.Request(url, headers=self.headers) return urllib2.urlopen(req).read()
登录完成后,就可以访问相应的页面来进行HTML的解析了。
单纯的数据 可以去 爬盟下载啊
海量sina微波的数据.
感谢你让我知道了爬盟,我们可能还是需要数据抓下来直接按需要存放,从那边下载后可能也要处理,并且,自己抓的还是更可控一点,需要什么,不需要什么。
不过还是感谢。
这个blog就是用你自己的那套源码开发的?
真心不错!帮顶!
我也写过 http://liamchzh.0fees.net/?p=162
ok,其实本文提到的不是和Oauth相关的。
因为,通过oauth确实可以获取到一个用户的信息,但是,这点是用户许可后才可以。我们可能需要上百万用户的数据,要这么多人授权很难办到。
用Oauth登陆自己的微博,跟你这样登陆之后,不是一样可以去爬数据了吗?
不是的,我不是指获取timeline里的东西,而是获取1百万个用户的微博等等,光我的timeline里才多少个用户啊,我关注的人不过几百人而已。
登录的意义是,只有登录了以后,所有用户的信息才是可见的。微博不像人人,只有好友信息才可见。
statuses/user_timeline是不是可以获取一个用户的所有微博?刚刚我去查了一下API,似乎是可以的。
不好意思,可能我的理解也有问题,我再仔细看看这个接口。
用手机登录可不可以直接使用url的sid呢,可以的话貌似直接请求就可以了
学长你好,我最近也在做类似的项目,我也是使用weibo.cn抓数据的。但遇到了一个问题:使用某固定ip,每次抓取某固定用户的微博约4000~5000条时,ip就会被封掉……我把两次抓数据间隔时间设成1~2秒也还会出现这个问题,不知道你在实现过程中有碰到过类似的麻烦吗?多谢…
抱歉回复晚了。
这个问题是存在的,根据我的经验,1~2秒是远远不够的。新浪的封锁机制似乎是单位时间内的访问次数。不过好的地方是,即使被封掉,过段时间(可能需要半个小时或者更多)会解禁,所以一种做法是过一段时间重新尝试。
如果把间隔时间设长,效率会很低下,所以我的做法是用多个爬虫。
另外,你也可以实验,一旦被封,尝试用别的帐号登录看看是否还被封,这个我还没有试过。
我发现如果被封后,切换账号也是不行的(连退出都不行),但切换ip后就可以切换账号或是继续抓取信息了,所以感觉新浪应该是封ip的。
至于说多个爬虫,因为我是个人的小项目(作业),所以只有一个ip,所以看起来这样也不太现实…
不过总之还是感谢你的回复~
不知道博主在后来的cola爬虫框架中使用mechanize,与这篇中使用到的urllib2在对抗新浪封锁时有什么区别呢?
这里WeiboCrawler主要还是通过设置访问间隔来防止被封锁,这样导致效率低下。用Mechanize是模拟真实浏览器,效率上会高很多。
抱歉,还是不太理解你的意思。我在看COLA代码(有些看不懂~)时,发现也是是用mechanize产生的浏览器对象直接下载URL,这种方式与urllib2的下载有什么区别呢?网上关于mechanize的入门资料比较少,认识不很清楚。。
遇到验证码是不是就没办法了
登录手机版的微博,请问,你用的是什么工具进行的手机HTTP信息获取?
博主,我刚用了这个方法发现不好使,想问一下是我的问题还是这个方法不好使啦?
呃,可惜我一点都不懂Python。来个PHP的指导一下?
现在貌似不能用了,作者最近试过这段代码吗,,,貌似weibo.cn改版了,模拟登陆有问题了,麻烦作者看看
现在的跳转部分有问题了
没错,登录跳转部分已经不行了
我也在学习这个诶,发现不行,留个联系方式咱交流交流呗~我的邮箱zyjnjnu@163.com
LZ你好,我最近在做新浪微博手机版的模拟登陆,按照你提供的代码可以访问页面,但是登录不上去。应该是我的问题,我想问cookie是在前面绑定好后面有系统自动维护,还是需要每次在request里面加入cookie,谢谢。
如果可能,希望通过qq164736772进一步向你学习
我记得以前有同学问过这个问题,你参考下面代码看看能不能解决。
http://t.cn/RZ1OR6k
http://login.weibo.cn/login/?rand=
现在表单提交链接改成上面那个了。我用 chrome 看了一下,新浪服务器做了三次跳转。然后就登陆不了,不知道怎么处理跳转时的流程了。有没有什么方法帮帮我?
您好,我最近在用着个爬虫,怕的是weibo.cn,但是显示成功后,爬取其他页面是,输出的页面源码还是没登陆状态,请问下您怎么解决
lz,我最近也在尝试做新浪微博的爬虫,不过是电脑版的,不过请问我模拟登录之后怎么用xpath?
如果可以的话,能否加个QQ向你请教? 我的QQ是247259010,不胜感激
给作者留言
关于作者
残阳似血(@秦续业),程序猿一枚,把梦想揣进口袋的挨踢工作者。现加入阿里云,研究僧毕业于上海交通大学软件学院ADC实验室。熟悉分布式数据分析(DataFrame并行化框架)、基于图模型的分布式数据库和并行计算、Dpark/Spark以及Python web开发(Django、tornado)等。
博客分类
搜索
点击排行
标签云
扫描访问
主题
残阳似血的微博
登录
最新评论
yosong 在文章“Django mptt介绍以及使用”下评论
。
yosong 在文章“Django mptt介绍以及使用”下评论
这个多级评论咋做呀,啊啊啊啊啊啊
热搜 在文章“PyOdps 0.4版本发布,从一个故事说起”下评论
文章不错交个朋友
啊啊 在文章“Django mptt介绍以及使用”下评论
console.log('helloworld')
admin22 在文章“Django mptt介绍以及使用”下评论
111111
关于作者
残阳似血(@秦续业),程序猿一枚,把梦想揣进口袋的挨踢工作者。现加入阿里云,研究僧毕业于上海交通大学软件学院ADC实验室。熟悉分布式数据分析(DataFrame并行化框架)、基于图模型的分布式数据库和并行计算、Dpark/Spark以及Python web开发(Django、tornado)等。
所有分类
友情链接
联系信息
地址
上海闵行区东川路800号
上海交通大学
200240
Mail
chinekingseu@gmail.com
QQ
344861256