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()