基于python的Appium進行b站直播消費記錄爬取
前情提要
因作業需要,需要爬取相關資料,之前是爬取網頁資料,可以用python的requests和Selenium進行爬取,但b站的直播消費資料網頁版不能顯示,只能在手機上看到,所以就有了這篇文章,
之前看文章說fiddler也可以進行爬取,但嘗試了一下沒成功,這次選擇appium進行爬取,類似的,可以運用爬取微信朋友圈和抖音等手機app相關資料
正文
#環境配置參考
前期作業準備,需要安裝python、jdk、PyCharm、Appium-windows-x.x、Appium_Python_Client、Android SDK,pycharm可以用anaconda的jupyter來替代
具體可以參考這篇博客,講的算是很清楚啦
https://blog.csdn.net/weixin_42617600/article/details/114111785
前期準備作業配置需要不停的安裝和配置環境變數,也是個相對枯燥的程序
完成以后就可以真正爬取啦
匯入模塊
from appium import webdriver
import numpy as np
import pandas as pd
import time
通程序式打開手機b站app
desired_caps = {
'platformName': 'Android', # 被測手機是安卓
'platformVersion': '10', # 手機安卓版本
'deviceName': 'xxx', # 設備名,安卓手機可以隨意填寫
'appPackage': 'tv.danmaku.bili', # 啟動APP Package名稱
'appActivity': '.ui.splash.SplashActivity', # 啟動Activity名稱
'unicodeKeyboard': True, # 使用自帶輸入法,輸入中文時填True
'resetKeyboard': True, # 執行完程式恢復原來輸入法
'noReset': True, # 不要重置App,如果為False的話,執行完腳本后,app的資料會清空,比如你原本登錄了,執行完腳本后就退出登錄了
'newCommandTimeout': 6000,
'automationName': 'UiAutomator2'
}
打開b站
# 連接Appium Server,初始化自動化環境
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 設定等待時間,如果不給時間的話可能會找不到元素
driver.implicitly_wait(4)
打開之后呈現如下頁面

在手機上點擊我的——我的直播——消費記錄,查看個人消費記錄,
當然也可以寫兩行代碼來實作這個程序(這里選擇跳過),如下圖所示

因為這個消費記錄很多,一個頁面只能顯示10條,要想爬取所有的可以設定滑動,邊向上滑動邊爬取就能獲取所有的資料,
具體引數設定的flick_distance=1050可以不重不漏的爬取,如下所示:
設定滑動
flick_start_x=540
flick_start_y=192
flick_distance=1050
while True:
driver.swipe(flick_start_x,flick_start_y+flick_distance,flick_start_x,flick_start_y)
爬取
pay_name_list=[]
present_price_list=[]
pay_room_list=[]
pay_ru_name_list=[]
pay_time_list=[]
flick_start_x=540
flick_start_y=192
flick_distance=1050
while True:
pay_name=driver.find_elements_by_id('pay_name')
for i in range(len(pay_name)):
pay_name_list.append(pay_name[i].text)
present_price=driver.find_elements_by_id('present_price')
for i in range(len(present_price)):
present_price_list.append(present_price[i].text)
pay_room=driver.find_elements_by_id('pay_room')
for i in range(len(pay_room)):
pay_room_list.append(pay_room[i].text)
pay_ru_name=driver.find_elements_by_id('pay_ru_name')
for i in range(len(pay_ru_name)):
pay_ru_name_list.append(pay_ru_name[i].text)
pay_time=driver.find_elements_by_id('pay_time')
for i in range(len(pay_time)):
pay_time_list.append(pay_time[i].text)
driver.swipe(flick_start_x,flick_start_y+flick_distance,flick_start_x,flick_start_y)
time.sleep(2)

轉換成dataframe
a=pd.DataFrame([pay_name_list,present_price_list,pay_room_list,pay_ru_name_list,pay_time_list],index=['pay_name_list','present_price_list','pay_room_list','pay_ru_name_list','pay_time_list'])
pd.DataFrame(a.T).head(50)

ok,這樣作業就都完成啦,繼續快樂的搬磚…
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/276327.html
標籤:python
