博客 / 詳情

返回

聽説想了解一個人要從爬取她(他)的所有微博開始呢~

原文鏈接

聽説想了解一個人要從爬取她(他)的所有微博開始呢~​mp.weixin.qq.com圖標

導語

既然你已經點進來了,那我就直説吧,標題其實是我瞎編的,但套路你點進來學習的我是真心的。

前兩天發了篇文章:

嘿嘿,之前開源的模擬登錄工具包開源文檔上線啦~

從閲讀量可以看出來了,很多小夥伴對這玩意並不感興趣。看來還是得多回歸回歸老本行,寫點有趣的腳本,才能套路各位過來學習呀。今天的小目標是寫個小爬蟲,爬取目標用户發的所有微博數據。廢話不多説,讓我們愉快地開始吧~

原理簡介

這裏簡單講講整個爬取的流程吧。首先,當然是模擬登錄新浪微博啦,這裏還是藉助我們之前開源的模擬登錄包來實現微博的模擬登錄。具體而言,代碼實現如下:

'''利用DecryptLogin模擬登錄'''
@staticmethod
def login(username, password):
  lg = login.Login()
  _, session = lg.weibo(username, password, 'mobile')
  return session

然後,讓程序使用者輸入想要爬取的目標用户id。那麼如何獲取這個微博用户id呢?以劉亦菲的微博為例,首先,進入她的主頁,然後可以看到鏈接裏有:

所以劉亦菲的微博用户id為3261134763。

根據使用者輸入的微博用户id,我們用已經實現模擬登錄的會話來訪問以下鏈接:

# 鏈接1
url = f'https://weibo.cn/{user_id}'
res = self.session.get(url, headers=self.headers)
# 鏈接2
url = f'https://weibo.cn/{user_id}/info'
res = self.session.get(url, headers=self.headers)

這個鏈接在瀏覽器裏顯示大概是這樣的:

顯然,在這,我們可以利用xpath提取到目標用户的一些基本信息:

# 鏈接1
selector = etree.HTML(res.content)
base_infos = selector.xpath("//div[@class='tip2']/*/text()")
num_wbs, num_followings, num_followers = int(base_infos[0][3: -1]), int(base_infos[1][3: -1]), int(base_infos[2][3: -1])
num_wb_pages = selector.xpath("//input[@name='mp']")
num_wb_pages = int(num_wb_pages[0].attrib['value']) if len(num_wb_pages) > 0 else 1
# 鏈接2
selector = etree.HTML(res.content)
nickname = selector.xpath('//title/text()')[0][:-3]

xpath是啥我就不多廢話了,看下網頁源碼,很容易就可以寫出來:

提取完之後打印出來讓程序使用者確認一下用自己輸入的用户id獲得的用户信息是不是和自己想要爬取的用户信息一樣,等使用者確認信息無誤再開始爬該用户的微博數據:

# 使用者確認是否要下載該用户的所有微博
tb = prettytable.PrettyTable()
tb.field_names = ['用户名', '關注數量', '被關注數量', '微博數量', '微博頁數']
tb.add_row([nickname, num_followings, num_followers, num_wbs, num_wb_pages])
print('獲取的用户信息如下:')
print(tb)
is_download = input('是否爬取該用户的所有微博?(y/n, 默認: y) ——> ')
if is_download == 'y' or is_download == 'yes' or not is_download:
  userinfos = {'user_id': user_id, 'num_wbs': num_wbs, 'num_wb_pages': num_wb_pages}
  self.__downloadWeibos(userinfos)

爬用户微博數據也基本用的xpath來提取數據,而查看用户的微博只需要訪問以下這個鏈接就可以了:

url = f'https://weibo.cn/{user_id}?page={page}'
page代表訪問用户的第page頁微博

沒啥特別的技巧,值得一提的處理只有兩點:

  • 每爬20頁微博數據,就保存一次數據,以避免爬蟲意外中斷,導致之前已經爬到的數據“人去樓空”;
  • 每爬n頁數據就暫停x秒,其中n是隨機生成的,且n一直在變化,x也是隨機生成的,且x也一直在變化。

思路就是這麼個思路,一些細節的處理就自己看源代碼吧,代碼運行的效果見:
https://zhuanlan.zhihu.com/p/...

代碼運行的命令格式為:

python weiboSpider.py --username 用户名 --password 密碼

大功告成啦,完整源代碼詳見相關文件。

數據可視化

老規矩,把爬到的數據拿來可視化一波唄,方便起見,就看看劉亦菲的微博數據可視化效果吧。

先來看看用她發的所有微博做的詞雲吧(僅原創微博):

然後看看她原創和轉發的微博數量?

以及每年發的微博數量?

果然現在發的微博數量變少了很多。看看她發的第一條微博唄,微博id是zoaIU7o2d,?:

“大家好,我是劉亦菲”

統計一下她每年發的原創微博都拿到了多少贊?

多少轉發量?

以及多少評論?

爬的數據不多,就先這樣唄,完整源代碼和數據詳見相關文件~

相關文件

https://github.com/CharlesPikac

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.