「docker實戰篇」python的docker-打造多任務端app應用數據抓取系統(上)(34)

原創文章,歡迎轉載。轉載請注明:轉載自IT人故事會,謝謝!
原文鏈接地址:「docker實戰篇」python的docker-打造多任務端app應用數據抓取系統(上)(34)

上次說了如果通過dockerfile創建docker的鏡像,接下來老鐵們咱們通過創建好的鏡像,創建容器,并且將代碼映射到容器當中去,最終完成多任務端app抓取系統。源碼:https://github.com/limingios/dockerpython.git (源碼/「docker實戰篇」python的docker-docker系統管理-基礎概念(27))

任務需求詳解

需要抓取三款應用的抖音,快手,今日頭條,具體需要抓取的內容

1.抓取抖音當前視頻的作者數據
2.抓取快手當前視頻的作者數據
3.抓取今日頭條推薦板塊新聞

  • 代碼部分--python-appium-docker源碼里面有

python執行python部分的代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/3/18 20:31
# @Author  : Aries
# @Site    : 
# @File    : handle_appium_docker.py
# @Software: PyCharm

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

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

def handle_appium(info):
    cap = {
        "platformName": "Android",
        "platformVersion": "4.4.2",
        "deviceName":info['device'],
        "udid": info['device'],
        "appPackage": info['appPackage'],
        "appActivity": info['appActivity'],
        "noReset": True,
        "unicodeKeyboard": True,
        "resetkeyboard": True
    }
    driver = webdriver.Remote("http://192.168.199.140:" + str(info["port"]) + "/wd/hub", cap)

    l = get_size(driver)
    x1 = int(l[0] * 0.5)
    y1 = int(l[1] * 0.15)
    y2 = int(l[1] * 0.9)

    #抖音
    if info["appPackage"] == "com.ss.andrpid.ugc.aweme":
        #根據實際的我這里直接寫//android,通過
        if WebDriverWait(driver,60).until(lambda x:x.find_element_by_xpath("http://android")):
            while True:
                # 初始鼠標位置,從哪里開始,結束時鼠標位置,到哪里結束
                driver.swipe(x1,y1,x1,y2)
                time.sleep(3)

    #快手
    if info["appPackage"] == "com.smile.gifmaker":
        # 根據實際的我這里直接寫//android
        if WebDriverWait(driver, 60).until(lambda x: x.find_element_by_xpath("http://android")):
            while True:
                # 初始鼠標位置,從哪里開始,結束時鼠標位置,到哪里結束
                driver.swipe(x1, y1, x1, y2)
                time.sleep(3)

    #快手
    if info["appPackage"] == "com.ss.android.article.news":
        # 根據實際的我這里直接寫//android
        if WebDriverWait(driver, 60).until(lambda x: x.find_element_by_xpath("http://android")):
            while True:
                #初始鼠標位置,從哪里開始,結束時鼠標位置,到哪里結束
                driver.swipe(x1, y1, x1, y2)
                time.sleep(3)

if __name__ =='__main__':
    m_list = []
    devices_list = [
        {
                "device": "192.168.199.133:5555",
                "appPackage": "com.ss.android.ugc.aweme",
                "appActivity": "com.ss.android.ugc.aweme.main.MainActivity",
                "port": 4723,
                "key": '抖音'
        },
        {
                "device": "192.168.199.133:5555",
                "appPackage": "com.smile.gifmaker",
                "appActivity": "com.yxcorp.gifshow.HomeActivity",
                "port": 4725,
                "key": '快手'
        },
        {
                "device": "192.168.199.133:5555",
                "appPackage": "com.ss.android.article.news",
                "appActivity": "com.ss.android.article.news.activity.SplashBadgeActivity",
                "port": 4727,
                "key": '今日頭條'
        }
    ]

for device in (devices_list):
    m_list.append(multiprocessing.Process(target=handle_appium,args=(device,)))

for m1 in m_list:
    m1.start()
  • 代碼部分--decode_data源碼里面有

python執行python部分的代碼 通過mitmdump 獲取數據保存在mongodb中。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/3/18 19:57
# @Author  : Aries
# @Site    : 
# @File    : decode_data.py
# @Software: PyCharm

import json
from handle_mongo import mongo_info


def response(flow):
    #抖音
    if 'aweme.snssdk.com/aweme/v1/feed' in flow.request.url:
        douyin_data_dict = json.loads(flow.response.text)
        for douyin_item in douyin_data_dict['aweme_list']:
            mongo_info.insert_item(douyin_item)

    #快手
    elif 'api.gifshow.com/rest/n/feed/hot' in  flow.request.url:
        kuaishou_data_dict = json.loads(flow.response.text)
        for kuaishou_item in kuaishou_data_dict['feeds']:
            mongo_info.insert_item(kuaishou_item)

    #今日頭條
    elif 'is.snssdk.com/api/news/feed' in flow.request.url:
        jrtt_data_dict = json.loads(flow.response.text)
        for kuaishou_item in jrtt_data_dict['feeds']:
            mongo_info.insert_item(kuaishou_item)

部署工作

python 爬蟲獲取信息其實不難,最難的是部署環境上。

  • 虛擬機直接用vagrant的方式

源碼里面包括vagrant文件,想了解如何使用可以查看我的中級文章講解很詳細

  • 鏡像下載

下載mongodb的鏡像,Appium的鏡像,zhugeaming/python3-appium的鏡像

1.mongodb的鏡像

mkdir bitnami
cd bitnami
mkdir mongodb
docker run -d -v /path/to/mongodb-persistence:/root/bitnami -p 27017:27017 bitnami/mongodb:latest

2.Appium的鏡像

docker search appium
#比較大1個多g,因為之前已經設置了加速器,根據自身的網速來進行下載。
docker pull appium/appium

3.zhugeaming/python3-appium的鏡像

docker pull zhugeaming/python3-appium
  • 網絡連接

之前在【「docker實戰篇」python的docker-創建appium容器以及設置appium容器連接安卓模擬器(30)】里面說過一種比較變態的方法,讓安卓模擬器連接虛擬機內部的dockerapium,但是這種適合vagrant的。建議還用這種吧已經驗證了。

1.vagrant創建的虛擬機都是通過virtual box


2.設置共享文件夾


這是windows的環境下

3.在虛擬機掛載,將共享的文件夾掛載到虛擬機里面來

記住這個共享文件夾的名稱叫handle_docker

mkdir docker
cd docker
sudo yum update && sudo yum -y install kernel-headers kernel-devel
sudo mount -t vboxsf handle_docker /root/docker/

PS:基本文件都掛載好了,已經很晚了,下次咱們繼續把環境跑起來。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一杯敬過往, 唇齒品迷茫。 行為言辭間, 彌漫透悲涼。 ——記于深秋的夜晚
    瑠騮畱鏐六六閱讀 137評論 0 0
  • 周星馳的電影說實話,原來沒覺得好看,或者覺得好看也沒覺得到膜拜的地步,不過確實帶來了很多的歡樂,《濟公》《蘇乞兒》...
    IT阿土閱讀 361評論 0 4
  • 我們每個人每天都必須要做一件事情,那就是解決問題。那為什么同一件事,不同的人去處理結果會不同呢?因為思維模式不同,...
    海豚王閱讀 1,816評論 0 11