Python+appium+安卓真機實現微信朋友圈爬蟲

 
0.使用步驟解壓android_sdk,去官網下載appium,雙擊node-v12.14.1-x64.msi安裝nodejs
教程見https://www.jianshu.com/p/6505d11aecc3

1.windows每天自動執行logwx.py 教程見https://blog.csdn.net/u012849872/article/details/82719372

2.文件中標註的需要修改的地方,
控件id:
請打開android_sdk壓縮包,tools文件夾uiautomatorviewer.bat雙擊運行,
同時用戶請自行將安卓手機調到朋友圈界面,
點擊uiautomatorviewer中左上角第二個按鈕捕捉屏幕按鈕,此時安卓機屏幕投影在電腦上,然後點擊響應的控件
在右側樹形圖中找到對應的Node根據右下方的Node detail中的resources-id,複製粘貼即可

3.獲取appPackage和appActivity 教程見https://blog.csdn.net/MTbaby/article/details/78676477
 

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 
from appium.webdriver.common.touch_action import TouchAction
from selenium.common.exceptions import NoSuchElementException,TimeoutException
import time
 
#控件id請修改
PLATFORM = 'Android' 
deviceName = 'SM_J7008' #請修改爲您的手機
app_package = 'com.tencent.mm' 
app_activity = '.ui.LauncherUI' #請修改
driver_server = 'http://127.0.0.1:4723/wd/hub' 
 
 
class Daily(): 
    def __init__(self): 
        self.desired_caps={ 
            'platformName': PLATFORM, 
            'deviceName': deviceName,
            'appPackage': app_package, 
            'appActivity': app_activity
        } 
        self.driver = webdriver.Remote(driver_server, self.desired_caps) 
        self.wait = WebDriverWait(self.driver, 300) 
        
    def login(self): 
        print('點擊登陸按鈕——————') 
        login = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/ene'))) #控件id
        login.click() 
        # 輸入手機號 
        phone = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/m7')))#控件id
        phone_num = input('請輸入手機號')
        phone.send_keys(phone_num)
        print('點擊下一步中')
        button = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/b2f')))#控件id
        button.click()
        pass_w = input('請輸入密碼:')
        password = self.wait.until(EC.presence_of_element_located((By.XPATH, "//android.widget.EditText[@resource-id='com.tencent.mm:id/m7' and @text='']")))
        password.send_keys(pass_w)
        login = self.driver.find_element_by_id('com.tencent.mm:id/b2f')#控件id
        login.click()
 
        # 提示 看看手機通訊錄 否
        tip = self.wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/b48')))#控件id
        tip.click()

    def enter(self):
        print('點擊發現——')
        tab = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//android.widget.RelativeLayout[3]')))
        print('已經找到發現按鈕')
        time.sleep(6)
        tab.click()
        # self.wait.until(EC.text_to_be_present_in_element((By.ID,'com.tencent.mm:id/cdj'),'發現')) 
        print('點擊朋友圈')
        friends = self.wait.until(EC.presence_of_element_located(
            (By.XPATH, '//*[@resource-id="android:id/list"]/*[@class="android.widget.LinearLayout"][1]')))
        friends.click()
 
    def crawl_pic(self,id):
        print("開始抓取朋友圈動態")
        while True:
            # try:
            #     pics = WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.ID, id)))
            # finally:
            #     self.driver.swipe(300, 750, 300, 200)
            try:
                pics = WebDriverWait(self.driver, 10).until(
                    EC.presence_of_all_elements_located((By.ID, id))
                )
                #print(pics)
            except (NoSuchElementException,TimeoutException):
                print("元素不存在")
                self.driver.swipe(300, 750, 300, 200)
                continue
            else:   
                # pics = self.driver.find_elements_by_id(id)
                #pics = WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.ID, id)))
                print("當前頁面有",len(pics),"個圖片1")
                #time.sleep(7)
                
                for pic in pics:
                    try: 
                        print("----點擊圖片---")
                        pic.click()
                        time.sleep(2)
                        el = self.driver.find_element_by_id("com.tencent.mm:id/ah7")
                        TouchAction(self.driver).long_press(el).perform().release()
                        time.sleep(3)

                        save = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/mg"][3]'))) #控件id
                        print("----保存圖片---")
                        save.click()
                        time.sleep(3)
                        print("已存入手機相冊")

                        TouchAction(self.driver).tap(el).perform().release()
                        time.sleep(1)
                        # pic_ret = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/ah7'))) #c8a
                        print("----下一張---")
                        
                    except BaseException as e:
                        print(e)
                print("該頁面爬取完畢")
                self.driver.swipe(300, 750, 300, 200)
            
            
    def crawl_video(self):
        print("開始抓取朋友圈動態")
        while True:
            try:
                videos = WebDriverWait(self.driver, 10).until(
                    EC.presence_of_all_elements_located((By.ID, 'com.tencent.mm:id/atb'))#控件id
                )
                #print(videos)
            except (NoSuchElementException,TimeoutException):
                print("元素不存在")
                self.driver.swipe(300, 750, 300, 200)
                continue
            else:
                for video in videos:
                    try:
                        #判斷昨天的內容停止下載
                        time_txt = self.driver.find_element_by_id("com.tencent.mm:id/eza")#控件id
                        if(time_txt.text=='昨天'):
                            #結束
                            print("今天的內容已下載完畢。",time_txt.text)
                            doubleclick = self.driver.find_element_by_id("com.tencent.mm:id/kx")
                            TouchAction(self.driver).tap(doubleclick,count=2).perform().release()
                            return
                        
                        print("----點擊視頻---")
                        video.click()
                        time.sleep(2)
                        el = self.driver.find_element_by_id("com.tencent.mm:id/f5s")#控件id
                        TouchAction(self.driver).long_press(el).perform()
                        time.sleep(3)

                        save = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/mg"][3]'))) #控件id
                        print("----保存視頻---")
                        save.click()
                        time.sleep(3)
                        print("已存入手機相冊")

                        video_ret = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/ah5'))) #控件id
                        print("----下一張---")
                        video_ret.click()

                        time.sleep(1)               
                    except BaseException as e:
                        print(e)
                self.driver.swipe(300, 750, 300, 300)
            

    def main(self):
        self.login()#登陸
        self.enter()#進入朋友圈
        
        self.crawl_pic('com.tencent.mm:id/f0i')#單獨一張圖片#控件id
        self.crawl_pic('com.tencent.mm:id/fa_')#九宮格圖片1#控件id
        self.crawl_pic('com.tencent.mm:id/fa1')#九宮格圖片2#控件id
        self.crawl_pic('com.tencent.mm:id/fa2')#九宮格圖片3#控件id
        self.crawl_pic('com.tencent.mm:id/fa3')#九宮格圖片4#控件id
        self.crawl_pic('com.tencent.mm:id/fa4')#九宮格圖片5#控件id
        self.crawl_pic('com.tencent.mm:id/fa5')#九宮格圖片6#控件id
        self.crawl_pic('com.tencent.mm:id/fa6')#九宮格圖片7#控件id
        self.crawl_pic('com.tencent.mm:id/fa7')#九宮格圖片8#控件id
        self.crawl_pic('com.tencent.mm:id/fa8')#九宮格圖片9#控件id
        self.crawl_video()#視頻

 
 
D = Daily() 
D.main()

 

發佈了67 篇原創文章 · 獲贊 42 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章