另类新浪微博基本数据采集方法

0x00 前言

有同学评论说之前绕过新浪访客系统的方法不能用了,我测试了一下,确实不能用了。原因很简单,新浪现在强制登录,没有cookie就是不行,即便是搜索引擎的爬虫也不行。

现在用谷歌搜索出来的结果是这个样子的

现在的
现在的

和之前的对比一下

以前的
以前的

百度同样也被ban了

呵呵
呵呵

快照里同样也是空的

那么这是不是意味着我们即使想采集一些简单的信息(网页标题、微博正文等等)也要使用模拟登录或者新浪开放平台API这样复杂的方法?

完全没必要!只要你仔细观察观察,方法其实非常简单~

0x01 从子域名入手

观察第一张图,可以发现下面几个结果里面是有内容的,而其中一个域名为tw.weibo.com,这说明新浪微博的其他子域名是没有什么限制策略的,那么这一来就很简单了,我们只要把weibo.com域名下的链接做一下转换,去访问对应tw.weibo.com下的页面即可拿到想要的数据。

这里我把新浪的一些子域名列出来供大家参考:

那么如何把weibo.com域名下的链接转换成tw.weibo.com下的对应页面链接呢?简单在前面加一个tw是不行的,还需要对后面的一些参数进行转换。

0x02 参数转换

我们以tw.weibo.com为例进行说明。简单起见,这里只介绍新浪微博上的两种链接形式

用户主页链接

常见的用户主页链接就下面两种形式,后面一堆乱七八糟的参数可以省略……

对应的tw.weibo.com的链接为

用户主页的链接处理起来很简单,直接加上tw即可

某条微博链接

某条微博的链接如下,同样省略了后面的无关参数

对应的tw.weibo.com的链接为

如果对新浪开放平台的API不陌生的话,可知2803301701为用户的uiduid是一个用户的唯一标识。

CeaOU15IT为这条微博的mid,与之相对应的还有一个idid是一条微博的唯一标识,由于id比较长,为了缩短url对id进行了转换变成了midCeaOU15IT对应的id3833781880260331

那么问题来了,这个id如何计算呢?如果是以前,可以直接调用新浪的API进行转换,但是现在新浪对这个简单的API也是强制授权,而且还有次数限制……

好在这个转换的原理并不复杂,就是一个62进制的转换,把下面的代码保存为base62.py,后面的过程要用到


ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def rsplit(s, count):

f = lambda x: x > 0 and x or 0

return [s[f(i - count):i] for i in range(len(s), 0, -count)]

def id2mid(id):

result = ''

for i in rsplit(id, 7):

str62 = base62_encode(int(i))

result = str62.zfill(4) + result

return result.lstrip('0')

def mid2id(mid):

result = ''

for i in rsplit(mid, 4):

str10 = str(base62_decode(i)).zfill(7)

result = str10 + result

return result.lstrip('0')

def base62_encode(num, alphabet=ALPHABET):

"""Encode a number in Base X

`num`: The number to encode

`alphabet`: The alphabet to use for encoding

"""

if (num == 0):

return alphabet[0]

arr = []

base = len(alphabet)

while num:

rem = num % base

num = num // base

arr.append(alphabet[rem])

arr.reverse()

return ''.join(arr)

def base62_decode(string, alphabet=ALPHABET):

"""Decode a Base X encoded string into the number

Arguments:

- `string`: The encoded string

- `alphabet`: The alphabet to use for encoding

"""

base = len(alphabet)

strlen = len(string)

num = 0

idx = 0

for char in string:

power = (strlen - (idx + 1))

num += alphabet.index(char) * (base ** power)

idx += 1

return num

if __name__ == '__main__':

print mid2id('CeaOU15IT')

print id2mid('3833781880260331')

0x03 繁简转换

由于我们访问的页面是微博台湾站,因此页面上的内容都是繁体中文的,因此需要做下转换,比较好的就是大名鼎鼎的opencc了,可以到这里下载安装,使用起来也非常简单~

0x04 实战

废话不多说,直接看代码吧~


# -*- coding: utf-8 -*-

import requests

from bs4 import BeautifulSoup

import re

import opencc

import base62

rawurl = "http://weibo.com/2803301701/CeaOU15IT"

cc = opencc.OpenCC("t2s")

p = re.compile(r"weibo\.com/(\d+)/(\w+)")

m = re.findall(p,rawurl)

if m:

uid = m[0][0]

mid = m[0][1]

id = base62.mid2id(mid)

url = "http://tw.weibo.com/{0}/{1}".format(uid,id)

print u"微博台湾站链接:{0}".format(url)

user_agent = {'User-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'}

r = requests.get(url,headers=user_agent)

soup = BeautifulSoup(r.text)

name = soup.find("div","name")

t_name = name.h1.a.text

s_name = cc.convert(name.h1.a.text)

link = name.h1.a["href"]

weibotext = soup.find("p",id="original_text")

t_weibotext = weibotext.text.strip()

s_weibotext = cc.convert(weibotext.text.strip())

print u"繁体中文版-->\n用户:{0}\t用户主页:{1}\n微博内容:{2}".format(t_name,link,t_weibotext)

print u"简体中文版-->\n用户:{0}\t用户主页:{1}\n微博内容:{2}".format(s_name,link,s_weibotext)

# 输出

# 微博台湾站链接:http://tw.weibo.com/2803301701/3833781880260331

# 繁体中文版-->

# 用户:人民日報    用户主页:http://tw.weibo.com/rmrb

# 微博内容:【「最有情懷辭職信」當事人:辭職非衝動 會對未來負責】「世界那麼大,我想去看看。」10字辭職信當事人、河南省實驗中學女教師顧少強19日表示,辭職並非衝動之舉,而是經過理性考慮。「我會對未來的人生負責。」採訪中,顧少強不時強調「每個人都有選擇自己生活方式的權利」。http://t.cn/RAOeU6q

# 简体中文版-->

# 用户:人民日报    用户主页:http://tw.weibo.com/rmrb

# 微博内容:【「最有情怀辞职信」当事人:辞职非冲动 会对未来负责】「世界那么大,我想去看看。」10字辞职信当事人、河南省实验中学女教师顾少强19日表示,辞职并非冲动之举,而是经过理性考虑。「我会对未来的人生负责。」采访中,顾少强不时强调「每个人都有选择自己生活方式的权利」。http://t.cn/RAOeU6q

0x05 总结

又是子域名,在很多漏洞和入侵的过程中,子域名和旁站都扮演着非常重要的角色,这是不是也给我们敲响了警钟呢?在升级一些安全策略的时候,有没有覆盖到子域名上呢?

从另一角度来说,只要你善于挖掘,没有什么系统是坚不可摧的~

我的人个博客地址:http://bindog.github.io/blog/2015/04/20/other-way-to-collect-sina-data,排版更佳哦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,495评论 18 139
  • 昨天居然灵光一现 脑子里出现一部小说的构造 我动笔去写 眼泪却止不住地流 我没法完成一件事 只好搁置下来 许多细节...
    迷惘之乡阅读 148评论 0 0
  • GreenDao 初始化: public voidinitDB(Context context,String db...
    kecai阅读 8,782评论 1 2