Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >「docker实战篇」python的docker- 多设备端并发抓取抖音粉丝数据(23)

「docker实战篇」python的docker- 多设备端并发抓取抖音粉丝数据(23)

作者头像
IT架构圈
发布于 2019-04-26 09:55:38
发布于 2019-04-26 09:55:38
1.3K00
代码可运行
举报
文章被收录于专栏:IT架构圈IT架构圈
运行总次数:0
代码可运行

之前的文章搞过,抖音web端用户信息的抓取和抖音app端粉丝的抓取。一台设备抓取抖音粉丝数据实在是太慢了,这次咱们来演示下多模拟器同时爬取信息。源码:https://github.com/limingios/dockerpython.git (源码/「docker实战篇」python的docker- 多设备端并发抓取抖音粉丝数据(22))

拷贝之前的带xponsed的模拟器
  • 1.桌面有夜神模拟器多开
  • 2.选择中,点击复制,可能一下复制出来3个,咱们不需要那么多删除2个就可以了,你如果电脑足够强大也可以复制多个,下面代码的思路是一样的。
  • 3.复制完成后,改下别名,方便区别
    1. 启动2个模拟器。
多任务抓取

按照常理一般的互联网操作,如果要实现多任务抓取基本都是使用容器化的来完成的,但是目前直接说docker有点尚早,不过这个系列肯定是要实现docker的多设备抓取的,这里先说说使用python多进程的方式来完成。

  • 1.查看夜神模拟器的端口,启动cmd,输入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb devices
  • 2.如果输入adb devices没有列表

在启动夜神模拟器的时候adb还没启动。也就是夜神模拟器比adb先启动,解决方案。 1.打开任务管理器,查看夜神模拟器的PID,可以通过点击状态-选中PID

2.刚查看到的PID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
netstat -ano | findstr "452"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
netstat -ano | findstr "16712"

3.夜神模拟器端口是有规律的,第一个模拟器端口是62001,第二个是62025,第三个62025+1,第4个62025+2

  1. 手动的命令方式连接设备
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb connect 127.0.0.1:62025

5.appium【客户端】需要设置udid,在appium里面识别就是udid,因为之前是一台设备所以不需要指定udid,光指定deviceName就可以了。

  1. appium【服务端】需要设置bootstrapPort,服务端进行设置,设备和appium通信的端口。

7.appium的2台的属性设置 1.douyin1 port=4723 bootstrapPort=4724 2.douyin1 port=4725 bootstrapPort=4726

    1. 报错解决方案

selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Failed to Dump Window Hierarchy

解决方案 在含有Emoji特殊符号的页面中,爆出Failed to Dump Window Hierarchy https://github.com/appium/appium/issues/4151 http://blog.csdn.net/soslinken/article/details/50126477 won’t be solved until the new android driver is completed. This is a known bug in uiautomator v1 此问题是uiautomator自身bug,换用Android5.1以上的系统

源码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python

import time
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import multiprocessing

def get_size(driver):
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    return (x, y)

def handle_douyin(driver):
    while True:
        #定位搜索框
        if WebDriverWait(driver,60).until(lambda x:x.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]")):
            #获取douyin_id进行搜索
            driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").send_keys('1860719705')
            while driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").text != '1860719705':
                driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").send_keys('1860719705')
                time.sleep(0.1)
        #点击搜索
        driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView[1]").click()


        #点击用户标签
        if WebDriverWait(driver,30).until(lambda x:x.find_element_by_xpath("//android.widget.TextView[@text='用户']")):
            driver.find_element_by_xpath("//android.widget.TextView[@text='用户']").click()
        #点击头像
        if WebDriverWait(driver,30).until(lambda x:x.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]")):
            driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[2]/android.view.View[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageView[1]").click()
        #点击粉丝按钮
        if WebDriverWait(driver,30).until(lambda x:x.find_element_by_xpath("//android.widget.TextView[@text='粉丝']")):
            driver.find_element_by_xpath("//android.widget.TextView[@text='粉丝']").click()

            x1 = int(driver.get_window_size()['width']*0.5)
            y1 = int(driver.get_window_size()['height']*0.75)
            y2 = int(driver.get_window_size()['height']*0.25)
            while True:
                time.sleep(3)
                if '没有更多了' in driver.page_source:
                    break
                elif 'TA还没有粉丝' in  driver.page_source:
                    break
                else:
                    driver.swipe(x1,y1,x1,y2)
                    time.sleep(0.5)

            #返回
            driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.ImageView[1]").click()
            #返回
            driver.find_element_by_id("com.ss.android.ugc.aweme:id/jk").click()
            #重新清空用户id
            driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[2]/android.widget.EditText[1]").clear()



def handle_appium(device,port):
    cap = {
        "platformName": "Android",
        "platformVersion": "4.4.2",
        "deviceName": device,
        "udid":device,
        # 真机的
        # "platformName": "Android",
        # "platformVersion": "7.1.2",
        # "deviceName": "10d4e4387d74",
        "appPackage": "com.ss.android.ugc.aweme",
        "appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
        "noReset": True,
        "unicodeKeyboard": True,
        "resetkeyboard": True
    }

    driver = webdriver.Remote("http://localhost:"+str(port)+"/wd/hub", cap)



    try:
        # 点击搜索
        print('点击搜索')
        if WebDriverWait(driver, 60).until(lambda x: x.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]")):
            driver.find_element_by_xpath(
                "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.FrameLayout[1]/android.support.v4.view.ViewPager[1]/android.widget.TabHost[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.ImageView[1]").click()
    except:
        # [26,76][115,165]
        driver.tap([(26, 76), (115, 165)], 500)

    handle_douyin(driver)

if __name__ == '__main__':
    m_list = []
    #定义了2台虚拟设备,夜神模拟器
    devices_list = ["127.0.0.1:62001","127.0.0.1:62025"]
    for device in range(len(devices_list)):
        port = 4723 + 2 * device
        m_list.append(multiprocessing.Process(target=handle_appium,args=(devices_list[device],port,)))

    for m1 in m_list:
        m1.start()

    for m2 in m_list:
        m2.join()
启动步骤
  • 1.启动2个appium

之前上边已经提到过的端口(4723 4724 )(4725 4726)

  • 2.启动python代码,查看效果

调试测试代码次数太多了,douyin要求我登录,哈哈

伪装爬虫

刚出现的因为访问册数太多,douyin那边识别了,这样需要解决。通过代理的方式。

  • 1.购买代理的ip,还是用咱们的老朋友【阿布云】https://www.abuyun.com/
  • 2.登录【阿布云】后,使用mitmdump的方式,设置阿布云的代理

启动cmd,输入 mitmdump -s test.py -p 8889 --mode upstream:HTTP隧道服务器:端口 --upstream-auth 通行证书:通行秘钥

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mitmdump -s test.py -p 8889 --mode upstream:http://http-pro.abuyun.com:9010 --upstream-auth HS821YO6BA7D6M8P:75021E5CF3AB82EE
  • 3.模拟器的wifi也要设置对应的代理,之前说过在重复说下。
  • 4.这样就使用了代理的方式了。 所有请求就是代理的阿布云了。

感谢老铁的建议,以后的所有的系列的源码都是按照对应文章进行整理,原来的源码都是按照我的开发历程的,这样不适合中间参与进来的老铁。

PS:调试过程中,夜神模拟器,appium,python代码插件没有问题的话,程序在运行过程中出现的最多的问题还是xpath定位的问题,对于python的代码其实也是很好理解的。另外注意的文章中提到的要使用安卓5.1以上否则会因为页面中含有Emoji特殊符号,爆出Failed to Dump Window Hierarchy。udid对于启动多个模拟器的时候一定要进行设置。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据可视化|用Python实现手机抓包,获取当当图书差评数据!
本次学习了手机抓包的相关知识,了解了Charles-mitmproxy-Appium的基本使用,通过对当当图书评论的爬取,得以实践。
龙哥
2019/07/30
1.1K0
数据可视化|用Python实现手机抓包,获取当当图书差评数据!
Appium Desktop 使用
Appium Desktop 元素定位 与Android的uiautomatorviewer一样,可进行元素定位,某些app 在 uiautomatorviewer中获取不到元素,小编这里就遇到获取某个页面元素时,一直报错,使用AppiumDesktop完美解决,AppiumDesktop也可以定位iOS的APP,以下示例都在Android中演示。 录制脚本 支持多种语言,语言可自己选择,目前这个功能只做学习的工具,不能够作为代码生成器(In sum, it is a learning tool, not
企鹅号小编
2018/01/16
1.6K0
Appium Desktop 使用
Appium+Python实现自动化登录
#Appium+Python实现自动化测试 Appium简介 官方的概述为: Appium is an open source test automation framework for use with native, hybrid and mobile web apps. It drives iOS, Android, and Windows apps using the WebDriver protocol. Appium是一个开源的测试自动化框架,用于本地、混合和移动Web应用程序。 它使
py3study
2020/01/07
1.9K0
用Python全自动下载抖音视频!
「用Python在抖音扒了这些高颜值女神后,突然成了人生赢家」,文中简述了一名工程师利用Python+ADB+鹅厂的AI,一晚上关注了一千多个漂亮小姐姐。
小F
2020/10/09
1.4K0
用Python全自动下载抖音视频!
XPath定位如何在App自动化测试中大显神威
和selenium类似,作为App自动化测试的主流框架,appium也是以webdriver为基础来自动化操作App的,所以对于元素定位,其实appium与selenium也是类似的,只是appium还有自己的安卓原生定位方式等方法,但是关于ID定位,name定位,xpath定位等,appium也是支持的,本篇文章就来给大家介绍一下xpath定位是如何在appium中大显神威的。
霍格沃兹测试开发Muller老师
2024/03/26
2630
「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(上)(34)
1.抓取抖音当前视频的作者数据 2.抓取快手当前视频的作者数据 3.抓取今日头条推荐板块新闻
IT架构圈
2019/05/07
1.1K0
「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(上)(34)
Python实现全自动下载抖音视频
这篇文章主要介绍了基于Python实现全自动下载抖音视频,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
python学习教程
2020/11/10
1.2K0
Python实现全自动下载抖音视频
appium+python自动化58-xpath定位
3.class属性唯一的话,可以通过class属性定位到,定位class属性有两种方法
上海-悠悠
2018/07/25
1.5K0
appium+python自动化58-xpath定位
【Appium 自动化测试】搭建 Appium 环境踩坑记录
Python 在自动化测试方面也是非常好用的语言,平时我的工作中也会使用 Python 进行自动化测试的工作,包括接口测试,直接使用 requests 库调用接口就行,跟写爬虫一样;还有云服务的 UI 测试,也就是页面的测试,可以使用 selenium 进行,我经常使用 selenium 写爬虫,所以使用起来也是非常顺手;而进行手机 app 的测试,也有相关工具,现在最流行的就是 appium 了,结合 Python 的连接库,就可以进行手机 app 的自动化测试了。
Hopetree
2022/09/26
1.1K0
【Appium 自动化测试】搭建 Appium 环境踩坑记录
史上最全 Appium 自动化测试从入门到框架实战精华学习笔记(三)
本系列文章汇总了从 Appium 自动化测试从基础到框架高级实战中,所涉及到的方方面面的知识点精华内容(如下所示),希望对大家快速总结和复习有所帮助。
霍格沃兹测试开发
2022/05/30
1.2K0
只会用Selenium爬网页?Appium爬App了解一下
Appium是一个跨平台移动端自动化测试工具,可以非常便捷地为iOS和Android平台创建自动化测试用例。它可以模拟App内部的各种操作,如点击、滑动、文本输入等,只要我们手工操作的动作Appium都可以完成。在前面我们了解过Selenium,它是一个网页端的自动化测试工具。Appium实际上继承了Selenium,Appium也是利用WebDriver来实现App的自动化测试。对iOS设备来说,Appium使用UIAutomation来实现驱动。对于Android来说,它使用UiAutomator和S
崔庆才
2018/06/25
9.6K1
「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(下)(35)
PS:电脑配置比较高i7的cpu,16g的内存,固态的硬盘,尽量还是用真机,如果是真机8g跑的也很666,企业里面还是用真实的手机来跑的。这里综合实战了,从appium的使用,移动端的使用,mitmdump的使用,都综合到了一起。遇到问题其实百度和谷歌都有类似的问题,文章很多部分都是参考:https://github.com/appium/appium-docker-android ,哈哈国内最大的男性交友网站很给力的。
IT架构圈
2019/05/10
1.1K0
「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(下)(35)
基于python的appium例子
版权声明:如需转载本文章,请保留出处! https://blog.csdn.net/xc_zhou/article/details/89643551
周小董
2019/05/10
2.2K0
基于python的appium例子
Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解)
  你有道灵光从天灵盖喷出来你知道吗,年纪轻轻就有一身横练的筋骨,简直百年一见的练武奇才啊,如果有一天让你打通任督二脉,那还不飞龙上天啊。正所谓我不入地狱谁入地狱,警恶惩奸维护世界和平这个任务就交个你了,好吗。这本如来神掌秘籍是无价之宝,我看与你有缘,收你十块钱传授给你吧。想必这段经典台词给为都可以的耳熟能详吧,宏哥,没这么牛叉呼啦带闪电,就是希望对你有帮助就可以了。
北京-宏哥
2019/07/08
1.8K0
终极利器!利用appium和mitmproxy登录获取cookies
本文章作者陈哥是高级爬虫师哦~他的微信群活跃都很高,光是看看就能学习到很多新的有用的知识。如果你想往爬虫这个方向前进,可以加陈哥的微信号:italocxa
佛系编程人
2019/08/14
2.4K0
Appium之获取app信息及界面定位方法
在使用android自动化测试工具monkeyrunner和appium中启动应用时,需要填写被测程序的包名和启动的Activity,以下有几种查看应用包名package和入口activity名称的方法:
用户6367961
2019/09/30
3.5K0
python appium笔记(二):元素定位
#这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境
free赖权华
2018/08/02
1.6K0
python appium笔记(二):元素定位
appium+python自动化59-多台设备并行
做android自动化的时候,启动一个appium服务,只能匹配一个手机去自动化执行。有时候想同一套代码,可以在不同的手机上执行,测下app在不同手机上兼容性。 这就需要启动多个appium服务了,并且android设备和appium要一一对应才行。
上海-悠悠
2018/07/25
6K1
appium+python自动化59-多台设备并行
App自动化测试|原生app元素定位方法
通过appium inspector工具,可以获取元素的相关信息;在appium中提供了一系列的元素定位API,通过在这些API中输入指定的元素信息,就能完成元素定位,定位元素后就进行对元素进行自动操作。
霍格沃兹测试开发Muller老师
2023/01/31
9760
APP爬虫--appium提取数据
在window的虚拟环境下执行pip install appium-python-client
北山啦
2022/11/27
1.4K0
APP爬虫--appium提取数据
推荐阅读
相关推荐
数据可视化|用Python实现手机抓包,获取当当图书差评数据!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验