前言
今天的目標是寫個爬蟲,爬取目標用戶發的所有微博數據。廢話不多說,讓我們愉快地開始吧~
開發工具
** Python版本:**3.6.4
** 相關模塊:*8
argparse模塊;
DecryptLogin模塊;
lxml模塊;
tqdm模塊;
prettytable模塊;
pyecharts模塊;
jieba模塊;
wordcloud模塊;
以及一些python自帶的模塊。
環境搭建
安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。
注意,DecryptLogin模塊經常更新,所以為了保證能正常用於公眾號內的所有相關例子,請及時升級版本,命令格式如下:
pip install DecryptLogin --upgrade
原理簡介
這里簡單講講整個爬取的流程吧。首先,當然是模擬登錄新浪微博啦,這里還是借助我們之前開源的模擬登錄包來實現微博的模擬登錄。具體而言,代碼實現如下:
'''利用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也一直在變化。
思路就是這么個思路,一些細節的處理就自己看源代碼吧
數據可視化
還是老樣子,把爬到的數據拿來可視化一波唄,方便起見,就看看劉亦菲的微博數據可視化效果吧。
先來看看用她發的所有微博做的詞雲吧(僅原創微博):
然后看看她原創和轉發的微博數量?
以及每年發的微博數量?
果然現在發的微博數量變少了很多。看看她發的第一條微博唄,微博id是zoaIU7o2d,😀:
“大家好,我是劉亦菲”
統計一下她每年發的原創微博都拿到了多少贊?
多少轉發量?
以及多少評論?
文章到這里就結束了,感謝你的觀看,關注我每天分享Python模擬登錄系列,下篇文章分享模擬登錄網易雲音樂自動簽到