新浪微博 抓取 滚屏数据抓取方法有哪些

Growth Hacker 奇技淫巧一则:零授权,抓取新浪微博任何用户的微博内容 - 推酷
Growth Hacker 奇技淫巧一则:零授权,抓取新浪微博任何用户的微博内容
有时或基于以下凡此种种需求,我们会想要去抓取新浪微博的内容:
产品冷启动,导入外部数据,而非从头积累;
通过大数据+语义分析获取用户兴趣行为偏好,提供智能推荐;
监控微博舆情,对特定关键词或是用户行为进行响应;
想必新浪深知微博内容本身是最其有价值的资产,一旦被竞争对手大批量抓取导入,则辛苦建立起的门槛将瞬间化作他人之嫁衣,因此做了非常繁复的安全保护,包括强制登录跳转认证、跨域检测、cookie 植入、禁止账号密码登录而启用 OAuth2.0 等等。
近期个人有一些抓取需求,在查询大量过时的网络资料测试无果后,决定另辟蹊径完成这一目标,并最终测试成功。在此分享出来。(这篇文章将提供解决问题的方法思路,但不会给出具体代码。伸手党请移步百度或 Github。)
你需要准备:
一个个人微博账号,我们将透过它去访问其他用户页面,从而抓取。除此之外,别无所求。
解题思路:
1.最初我从微博 Web 版入手,发现即使是浏览器中可正常查看的内容,若直接通过 PHP 的 curl 或者 file_get_contents 读取,也无法直接取得,而是读取到一串 js 代码,作用是跨域判断+cookie判断+header跳转。料想要模拟的请求和一重重越过的限制定会很多。
2.转换思路,既然微博的 Web 版限制很多,那就从移动版下手(移动网页 ,而非指移动 App)。移动版碍于手机机能的限制,身份验证要求会降低很多。经过实验,微博移动版的展示规则是:加V用户、微博广场,可直接访问其页面;普通用户,则必须登录才能看到。而判定当前登录用户身份的标识,则应该是手机浏览器本身存储的 cookie 与服务端的某个 session 比对。
3.由于我需要获取普通用户的微博内容,因此还要想办法继续绕。你当然可以每次直接模拟用户登录,但相对繁琐,我希望能一劳永逸。既然移动版的身份判定很大程度上依赖手机浏览器 cookie,而一般浏览器 cookie 不那么容易取,且某些土鳖机型连 cookie 都无法记录(号称 1.3 亿月活跃用户的上市公司一定会照顾穷苦大众的),那么微博一定提供了其他退而求其次的解决方法。于是我注意到了登陆框下的「记住登录状态,需支持并打开手机的cookie功能。」选项。
See?默认是勾上的,也即是说微博团队主观上是希望用户勾上这个,从而借助 cookie 判断来提高登录安全性的。
我遂果断取消勾选该选项,输入任何一个自己的微博账号密码,点击登录。
4.值得注意的情况出现了:登录时的验证网页走的是 ,而非勾选状态下会走的 。说明此种情况下,登录验证的确是进行了特殊的处理,从而让没有开启 cookie 功能的手机也能被判定为登录。
查看跳转页面的源代码,发现有如下一行:
如果没有自动跳转,请&a href=&/?s2w=login&gsid=4uwc8bfa1vnw8ivzI9gUd706F3W&vt=4&&点击这里&/a&
注意这个 gsid 参数,料想它就是判定本地用户身份的标识,于是整个提取出来(为了我的账号安全,我对这个案例中的 gsid 做了修改,你们直接照搬是无法成功的,还是自己跑一遍登录流程吧)。
5.最精彩的情况来了。为了验证我们能不能凭这一串 gsid 伪造登录后的身份,我开启 Chrome 的隐身模式,随便找了一个正常情况下必须登录才能看到页面的非加V用户,然后在地址栏后面加上了 gsid 参数,URL 整个变成:
/u/?vt=4&st=7fe6&gsid=4uwc8bfa1vnw8ivzI9gUd706F3W
(当然这里的 gsid 我也做了改动,只是作为演示,实际 gsid 还请自行获得)
直接回车!擦,虽然此前没有执行过登录动作,但是已经以登录后的的身份在看他的页面内容了哟。这样,我就可以直接凭借上述固定 URL 去爬去用户的内容。
(上图中的「我们都关注XDash」,你就可以知道当前是登录状态,取到了用户身份的。事实上的确如此。)
背后原理应该是,以 GET 方式在 URL 中发送了本地登录后的身份标识,微博服务器比对这串标识来判定对应的登录用户身份,然后返回到本地,本地于是就以这个用户身份登录,堂而皇之地获取数据了。(大一的时候我曾参与过一个基于 ASP 的校园社区的开发,阅读了帝国 CMS 的代码,那时候对于手机用户的身份认证就是这么原始哒。)
现在想要的尽收眼底了,接下来…Hulk,smash!
微博手机版,阿喀琉斯的脚后跟。
关系恒久远,一开永流传!
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见当前位置:&>&&>&&>&
python模拟登录新浪微博抓取数据(cookielib和urllib2)
发布时间:编辑:
本文介绍了python模拟登录新浪微博的例子,python使用cookielib和urllib2模块实现模拟登陆新浪微博抓取数据,需要的朋友参考下。
http是无连接的状态协议,但是客户端和端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限。
用浏览器登录微博,必须先登录,登陆成功后,打开其他的网页才能够访问。
用程序登录新浪微博或其他验证网站,关键在于需要保存cookie,之后附带cookie再来访问网站,才能够达到效果。
需要的cookielib和urllib2等的配合,将cookielib绑定到urllib2在一起,就能够在请求网页的时候附带cookie。
首先第一步,用firefox的httpfox插件,在浏览器衷开始浏览新浪微博首页,然后登陆,从httpfox的记录中,查看每一步发送了那些数据请求了那个URL;
之后在python中模拟这个过程,用urllib2.urlopen发送用户名密码到登陆页面,获取登陆后的cookie,之后访问其他页面,获取微博数据。
复制代码 代码示例:
#!/usr/bin/python
# coding=utf8
import urllib
import urllib2
import cookielib
import base64
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 = '.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=9'
&&& data = urllib2.urlopen(url).read()
&&& p = re.compile('\((.*)\)')
&&&&&&& 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 = 'www.crazyant.net'& # 微博账号
&&& pwd = 'xxxx'& # 微博密码
&&& url = '.cn/sso/login.php?client=ssologin.js(v1.3.18)'
&&&&&&& 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/ Firefox/8.0'}
&&& # 其实到了这里,已经能够使用urllib2请求新浪任何的内容了,这里已经登陆成功了
&&& req = urllib2.Request(
&&&&&&& url=url,
&&&&&&& data=postdata,
&&&&&&& headers=headers
&&& result = urllib2.urlopen(req)
&&& text = result.read()
&&& # print text
&&& p = re.compile('location\.replace\(\'(.*?)\'\)')
&&&&&&& 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=4276&pre_page=1&end_id=7724&pagebar=1&_k=960&uid=&_t=0&__rnd=0',)
&&& result = urllib2.urlopen(req)
&&& text = result.read()
&&& print len(result.read())
&&& # unicode(eval(b),&utf-8&)
&&& print eval(&u'''& + text + &'''&)
获取了模拟登陆后的urllib2,可以做抓数据等工作。
甚至可以写一个多线程的来爬遍新浪微博,大家有时间可以研究下。
与 python模拟登录新浪微博抓取数据(cookielib和urllib2) 有关的文章
本文标题:
本页链接:
12345678910
12345678910微博数据抓取方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
微博数据抓取方法
本​篇​文​档​为​您​整​理​微​博​数​据​抓​取​方​法​的​详​细​介​绍​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢& & & & 很多人都喜欢在网站上DIY自己的微博,所以我也写了一个。& & 这里直接抓取了新浪微博工具中的微博秀地址。& & 复制代码代码如下:& & <?php& & set_time_limit(0);& & $url="/weiboshow/index.php?language=&width=0&height=550&fansRow=2&ptype=1&speed=0&skin=1&isTitle=1&noborder=1&isWeibo=1&isFans=1&uid=&verifier=8738a0fa&dpc=1"; //微博秀地址& & $ch=curl_init();& & curl_setopt($ch,CURLOPT_HEADER,false);& & curl_setopt($ch,CURLOPT_URL,$url);& & curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);& & $content=curl_exec($ch);& & curl_close($ch);& & preg_match_all('/(.*)/iUs',$content,$text);//获取文字& & preg_match_all('/& & Tags:php curl& & 复制链接收藏本文打印本文关闭本文返回首页& & 上一篇:php判断页面是否是微信打开的示例(微信打开网页)& & 下一篇:php使用GeoIP库实例& & 相关文章php生成EAN_13标准条形码实例关于二级目录拖拽排序的实现(源码示例下载)php加密算法之实现可逆加密算法和解密分享ThinkPHP CURD方法之where方法详解php读取纯真ip数据库使用示例PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子百度地图API应用之获取用户的具体位置php 模拟get_headers函数的代码示例php URL跳转代码 减少外链PHP 异步执行方法,模拟多线程的应用分析& & 文章评论& & 最 近 更 新& & 用Php编写注册后Email激活验证的实例代码php对数组排序代码分享PHP 基于文件头的文件类型验证类函数codeigniter教程之多文件上传使用示例PHP生成静态页非常好用的Zend Framework分页类XAMPP安装与使用方法详细解析Yii2使用小技巧之通过 Composer 添加 Fon深入php之规范编程命名小结php的hash算法介绍& & 热 点 排 行& & php 变量定义方法简单PHP上传图片、删除图片实现代一个简单的PHP&MYSQL留言板源PHPExcel读取Excel文件的实现代码网页游戏开发入门教程二(游戏模php 购物车的例子[php] 我的微型论坛的简单教程[已PHP生成HTML静态页面实例代码php mysql数据库操作类php 网页游戏开发入门教程一(we
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向上学吧网站投诉>>
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.002 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益}

我要回帖

更多关于 新浪微博推广方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信