0x00 前言
有同學(xué)評論說之前繞過新浪訪客系統(tǒng)的方法不能用了,我測試了一下华嘹,確實不能用了吧趣。原因很簡單,新浪現(xiàn)在強制登錄耙厚,沒有cookie就是不行强挫,即便是搜索引擎的爬蟲也不行。
現(xiàn)在用谷歌搜索出來的結(jié)果是這個樣子的
和之前的對比一下
百度同樣也被ban了
快照里同樣也是空的
那么這是不是意味著我們即使想采集一些簡單的信息(網(wǎng)頁標(biāo)題颜曾、微博正文等等)也要使用模擬登錄或者新浪開放平臺API這樣復(fù)雜的方法纠拔?
完全沒必要!只要你仔細(xì)觀察觀察泛豪,方法其實非常簡單~
0x01 從子域名入手
觀察第一張圖稠诲,可以發(fā)現(xiàn)下面幾個結(jié)果里面是有內(nèi)容的侦鹏,而其中一個域名為tw.weibo.com
,這說明新浪微博的其他子域名是沒有什么限制策略的臀叙,那么這一來就很簡單了略水,我們只要把weibo.com
域名下的鏈接做一下轉(zhuǎn)換,去訪問對應(yīng)tw.weibo.com
下的頁面即可拿到想要的數(shù)據(jù)劝萤。
這里我把新浪的一些子域名列出來供大家參考:
http://tw.weibo.com/(微博臺灣站)
http://hk.weibo.com/(微博香港站)
http://us.weibo.com/gb(北美微博廣場)
那么如何把weibo.com
域名下的鏈接轉(zhuǎn)換成tw.weibo.com
下的對應(yīng)頁面鏈接呢渊涝?簡單在前面加一個tw
是不行的,還需要對后面的一些參數(shù)進行轉(zhuǎn)換床嫌。
0x02 參數(shù)轉(zhuǎn)換
我們以tw.weibo.com
為例進行說明跨释。簡單起見,這里只介紹新浪微博上的兩種鏈接形式
用戶主頁鏈接
常見的用戶主頁鏈接就下面兩種形式厌处,后面一堆亂七八糟的參數(shù)可以省略……
對應(yīng)的tw.weibo.com
的鏈接為
用戶主頁的鏈接處理起來很簡單鳖谈,直接加上tw
即可
某條微博鏈接
某條微博的鏈接如下,同樣省略了后面的無關(guān)參數(shù)
對應(yīng)的tw.weibo.com
的鏈接為
如果對新浪開放平臺的API不陌生的話阔涉,可知2803301701
為用戶的uid
缆娃,uid
是一個用戶的唯一標(biāo)識。
CeaOU15IT
為這條微博的mid
瑰排,與之相對應(yīng)的還有一個id
贯要,id
是一條微博的唯一標(biāo)識,由于id
比較長椭住,為了縮短url對id
進行了轉(zhuǎn)換變成了mid
崇渗。CeaOU15IT
對應(yīng)的id
為3833781880260331
那么問題來了,這個id
如何計算呢函荣?如果是以前显押,可以直接調(diào)用新浪的API進行轉(zhuǎn)換,但是現(xiàn)在新浪對這個簡單的API也是強制授權(quán)傻挂,而且還有次數(shù)限制……
好在這個轉(zhuǎn)換的原理并不復(fù)雜乘碑,就是一個62進制的轉(zhuǎn)換,把下面的代碼保存為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 繁簡轉(zhuǎn)換
由于我們訪問的頁面是微博臺灣站兽肤,因此頁面上的內(nèi)容都是繁體中文的,因此需要做下轉(zhuǎn)換绪抛,比較好的就是大名鼎鼎的opencc
了资铡,可以到這里下載安裝,使用起來也非常簡單~
0x04 實戰(zhàn)
廢話不多說幢码,直接看代碼吧~
# -*- 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微博內(nèi)容:{2}".format(t_name,link,t_weibotext)
print u"簡體中文版-->\n用戶:{0}\t用戶主頁:{1}\n微博內(nèi)容:{2}".format(s_name,link,s_weibotext)
# 輸出
# 微博臺灣站鏈接:http://tw.weibo.com/2803301701/3833781880260331
# 繁體中文版-->
# 用戶:人民日報 用戶主頁:http://tw.weibo.com/rmrb
# 微博內(nèi)容:【「最有情懷辭職信」當(dāng)事人:辭職非衝動 會對未來負(fù)責(zé)】「世界那麼大笤休,我想去看看≈⒏保」10字辭職信當(dāng)事人店雅、河南省實驗中學(xué)女教師顧少強19日表示政基,辭職並非衝動之舉,而是經(jīng)過理性考慮闹啦【诿鳎「我會對未來的人生負(fù)責(zé)∏戏埽」採訪中荐健,顧少強不時強調(diào)「每個人都有選擇自己生活方式的權(quán)利」。http://t.cn/RAOeU6q
# 簡體中文版-->
# 用戶:人民日報 用戶主頁:http://tw.weibo.com/rmrb
# 微博內(nèi)容:【「最有情懷辭職信」當(dāng)事人:辭職非沖動 會對未來負(fù)責(zé)】「世界那么大琳袄,我想去看看江场。」10字辭職信當(dāng)事人窖逗、河南省實驗中學(xué)女教師顧少強19日表示扛稽,辭職并非沖動之舉,而是經(jīng)過理性考慮滑负。「我會對未來的人生負(fù)責(zé)用含“剑」采訪中,顧少強不時強調(diào)「每個人都有選擇自己生活方式的權(quán)利」啄骇。http://t.cn/RAOeU6q
0x05 總結(jié)
又是子域名痴鳄,在很多漏洞和入侵的過程中,子域名和旁站都扮演著非常重要的角色缸夹,這是不是也給我們敲響了警鐘呢痪寻?在升級一些安全策略的時候,有沒有覆蓋到子域名上呢虽惭?
從另一角度來說橡类,只要你善于挖掘,沒有什么系統(tǒng)是堅不可摧的~
我的人個博客地址:http://bindog.github.io/blog/2015/04/20/other-way-to-collect-sina-data芽唇,排版更佳哦~