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.youkuaiyun.com/u012849872/article/details/82719372

2.文件中标注的需要修改的地方,
控件id:
请打开android_sdk压缩包,tools文件夹uiautomatorviewer.bat双击运行,
同时用户请自行将安卓手机调到朋友圈界面,
点击uiautomatorviewer中左上角第二个按钮捕捉屏幕按钮,此时安卓机屏幕投影在电脑上,然后点击响应的控件
在右侧树形图中找到对应的Node根据右下方的Node detail中的resources-id,复制粘贴即可

3.获取appPackage和appActivity 教程见https://blog.youkuaiyun.com/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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值