原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
原文連接地址:「docker實戰篇」python的docker- 多設備端併發抓取抖音粉絲數據(23)python
以前的文章搞過,抖音web端用戶信息的抓取和抖音app端粉絲的抓取。一臺設備抓取抖音粉絲數據實在是太慢了,此次我們來演示下多模擬器同時爬取信息。源碼:github.com/limingios/d… (源碼/「docker實戰篇」python的docker- 多設備端併發抓取抖音粉絲數據(22))android
按照常理通常的互聯網操做,若是要實現多任務抓取基本都是使用容器化的來完成的,可是目前直接說docker有點尚早,不過這個系列確定是要實現docker的多設備抓取的,這裏先說說使用python多進程的方式來完成。ios
adb devices
複製代碼
在啓動夜神模擬器的時候adb還沒啓動。也就是夜神模擬器比adb先啓動,解決方案。
1.打開任務管理器,查看夜神模擬器的PID,能夠經過點擊狀態-選中PIDgit
2.剛查看到的PIDgithub
netstat -ano | findstr "452"
複製代碼
netstat -ano | findstr "16712"
複製代碼
3.夜神模擬器端口是有規律的,第一個模擬器端口是62001,第二個是62025,第三個62025+1,第4個62025+2web
- 手動的命令方式鏈接設備
adb connect 127.0.0.1:62025
複製代碼
5.appium【客戶端】須要設置udid,在appium裏面識別就是udid,由於以前是一臺設備因此不須要指定udid,光指定deviceName就能夠了。docker
- appium【服務端】須要設置bootstrapPort,服務端進行設置,設備和appium通訊的端口。
7.appium的2臺的屬性設置
1.douyin1 port=4723 bootstrapPort=4724
2.douyin1 port=4725 bootstrapPort=4726bootstrap
selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Failed to Dump Window Hierarchybash
解決方案
在含有Emoji特殊符號的頁面中,爆出Failed to Dump Window Hierarchy
github.com/appium/appi…
blog.csdn.net/soslinken/a…
won’t be solved until the new android driver is completed. This is a known bug in uiautomator v1
此問題是uiautomator自身bug,換用Android5.1以上的系統服務器
#!/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()
複製代碼
以前上邊已經提到過的端口(4723 4724 )(4725 4726)
調試測試代碼次數太多了,douyin要求我登陸,哈哈
剛出現的由於訪問冊數太多,douyin那邊識別了,這樣須要解決。經過代理的方式。
啓動cmd,輸入
mitmdump -s test.py -p 8889 --mode upstream:HTTP隧道服務器:端口 --upstream-auth 通行證書:通行祕鑰
mitmdump -s test.py -p 8889 --mode upstream:http://http-pro.abuyun.com:9010 --upstream-auth HS821YO6BA7D6M8P:75021E5CF3AB82EE
複製代碼
感謝老鐵的建議,之後的全部的系列的源碼都是按照對應文章進行整理,原來的源碼都是按照個人開發歷程的,這樣不適合中間參與進來的老鐵。
PS:調試過程當中,夜神模擬器,appium,python代碼插件沒有問題的話,程序在運行過程當中出現的最多的問題仍是xpath定位的問題,對於python的代碼其實也是很好理解的。另外注意的文章中提到的要使用安卓5.1以上不然會由於頁面中含有Emoji特殊符號,爆出Failed to Dump Window Hierarchy。udid對於啓動多個模擬器的時候必定要進行設置。