溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python怎么爬取當(dāng)當(dāng)網(wǎng)APP數(shù)據(jù)

發(fā)布時(shí)間:2021-10-26 09:57:45 來(lái)源:億速云 閱讀:237 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)Python怎么爬取當(dāng)當(dāng)網(wǎng)APP數(shù)據(jù),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

目標(biāo)

場(chǎng)景:有時(shí)候通過傳統(tǒng)的方法去爬一些 Web 網(wǎng)頁(yè)或者 APP,受限于對(duì)方的反爬方案,很難爬到想要的數(shù)據(jù),這個(gè)時(shí)候可以考慮使用「Appium」結(jié)合「mitmproxy」的方式去爬取數(shù)據(jù)。

其中,Appium 負(fù)責(zé)驅(qū)動(dòng) App 端自動(dòng)化運(yùn)行,mitmproxy 負(fù)責(zé)截取請(qǐng)求數(shù)據(jù)并解析保存到數(shù)據(jù)庫(kù)。

今天的目的是爬取「當(dāng)當(dāng)網(wǎng)」的所有數(shù)據(jù),并保存到 MongoDB 數(shù)據(jù)庫(kù)當(dāng)中。 

準(zhǔn)備工作

首先,需要在 PC 上安裝好 Charles 和 Appium Desktop,并配置好 mitmproxy 環(huán)境。

# 安裝mitmproxy依賴包
pip3 install mitmproxy

# 安裝pymongodb
pip3 install pymongo

另外,需要準(zhǔn)備一臺(tái) Android 手機(jī),另外 PC 端配置好 Android 開發(fā)環(huán)境。

爬取思路

1. 在配置好手動(dòng)代理的情況下,打開 Charles 實(shí)時(shí)捕獲客戶端的發(fā)起的網(wǎng)絡(luò)請(qǐng)求。

打開當(dāng)當(dāng)網(wǎng)搜索商品的頁(yè)面,搜索關(guān)鍵字「Python」,可以在 Charles 查看到當(dāng)前請(qǐng)求的 URL 地址包含:「word=Python」

編寫 mitmproxy 的執(zhí)行腳本文件,重寫 response() 函數(shù),通過對(duì)請(qǐng)求的 URL 進(jìn)行過濾,對(duì)有用的數(shù)據(jù)進(jìn)行整理并保存到 MongoDB 數(shù)據(jù)庫(kù)當(dāng)中。

class DangDangMongo(object):
    """
    初始化MongoDB數(shù)據(jù)庫(kù)
    """
    def __init__(self):
        self.client = MongoClient('localhost')
        self.db = self.client['admin']
        self.db.authenticate("root", "xag")
        self.dangdang_book_collection = self.db['dangdang_book']

def response(flow):

    # 過濾請(qǐng)求的URL
    if 'keyword=Python' in request.url:

        data = json.loads(response.text.encode('utf-8'))

        # 書籍
        products = data.get('products') or None

        product_datas = []

        for product in products:
            # 書ID
            product_id = product.get('id')

            # 書名
            product_name = product.get('name')

            # 書價(jià)格
            product_price = product.get('price')

            # 作者
            authorname = product.get('authorname')

            # 出版社
            publisher = product.get('publisher')

            product_datas.append({
                'product_id': product_id,
                'product_name': product_name,
                'product_price': product_price,
                'authorname': authorname,
                'publisher': publisher
            })

        DangDangMongo().dangdang_book_collection.insert_many(product_datas)
        print('成功插入數(shù)據(jù)成功')

先打開客戶端的手動(dòng)代理監(jiān)聽 8080 端口,然后執(zhí)行「mitmdump」命令,然后滾動(dòng)商品界面,發(fā)現(xiàn)數(shù)據(jù)到寫入到數(shù)據(jù)庫(kù)中了。

 mitmdump -s script_dangdang.py

2. 下面我們要利用 Appium 幫我們實(shí)現(xiàn) 自動(dòng)化。

首先打開 Appium Desktop,并啟動(dòng)服務(wù)。

Python怎么爬取當(dāng)當(dāng)網(wǎng)APP數(shù)據(jù)

獲取到包名和初始 Activity 后,就可以利用 WebDriver 去模擬打開當(dāng)當(dāng)網(wǎng) APP。

self.caps = {
            'automationName': DRIVER,
            'platformName': PLATFORM,
            'deviceName': DEVICE_NAME,
            'appPackage': APP_PACKAGE,
            'appActivity': APP_ACTIVITY,
            'platformVersion': ANDROID_VERSION,
            'autoGrantPermissions': AUTO_GRANT_PERMISSIONS,
            'unicodeKeyboard': True,
            'resetKeyboard': True
        }
self.driver = webdriver.Remote(DRIVER_SERVER, self.caps)

接著使用 Android SDK 自帶的工具 uiautomatorviewer 獲取到元素信息,使用 Appium 中的 WebDriver 去操作 UI 元素。

第一次打開應(yīng)用的時(shí)候,可能會(huì)出現(xiàn)紅包雨對(duì)話框、新人專享紅包對(duì)話框、切換城市對(duì)話框,這里需要通過元素 ID 獲取到關(guān)閉按鈕,執(zhí)行點(diǎn)擊操作來(lái)關(guān)閉這些對(duì)話框。

這里創(chuàng)建一個(gè) 新的線程 來(lái)單獨(dú)處理這些對(duì)話框。

class ExtraJob(threading.Thread):
   def run(self):
        while self.__running.isSet():

            # 為True時(shí)立即返回, 為False時(shí)阻塞直到內(nèi)部的標(biāo)識(shí)位為True后返回
            self.__flag.wait()

            # 1.0 【紅包雨】對(duì)話框
            red_packet_element = is_element_exist(self.driver, 'com.dangdang.buy2:id/close')
            if red_packet_element:
                red_packet_element.click()

            # 1.1 【新人專享券】對(duì)話框
            new_welcome_page_sure_element = is_element_exist(self.driver, 'com.dangdang.buy2:id/dialog_cancel_tv')
            if new_welcome_page_sure_element:
                new_welcome_page_sure_element.click()

            # 1.2 【切換位置】對(duì)話框
            change_city_cancle_element = is_element_exist(self.driver, 'com.dangdang.buy2:id/left_bt')
            if change_city_cancle_element:
                change_city_cancle_element.click()

extra_job = ExtraJob(dangdang.driver)
extra_job.start()

接下來(lái)就是點(diǎn)擊搜索按鈕,然后輸入內(nèi)容,執(zhí)行點(diǎn)擊搜索對(duì)話框。

 # 1.搜索框
search_element_pro = self.wait.until(
            EC.presence_of_element_located((By.ID, 'com.dangdang.buy2:id/index_search')))
search_element_pro.click()

search_input_element = self.wait.until(
            EC.presence_of_element_located((By.ID, 'com.dangdang.buy2:id/search_text_layout')))
search_input_element.set_text(KEY_WORD)

# 2.搜索對(duì)話框,開始檢索
search_btn_element = self.wait.until(
            EC.element_to_be_clickable((By.ID, 'com.dangdang.buy2:id/search_btn_search')))
search_btn_element.click()

# 3.休眠3秒,保證第一頁(yè)的內(nèi)容加載完全
time.sleep(3)

待第一頁(yè)的數(shù)據(jù)加載完全之后,可以一直向上滾動(dòng)頁(yè)面,直到數(shù)據(jù)全部被加載完全,數(shù)據(jù)會(huì)由 mitmproxy 自動(dòng)保存到 MongoDB 數(shù)據(jù)庫(kù)當(dāng)中。

while True:
      str1 = self.driver.page_source
      self.driver.swipe(FLICK_START_X, FLICK_START_Y + FLICK_DISTANCE, FLICK_START_X, FLICK_START_X)
      time.sleep(1)
      str2 = self.driver.page_source
      if str1 == str2:
            print('停止滑動(dòng)')
            # 停止線程
            extra_job.stop()
            break
      print('繼續(xù)滑動(dòng)'

結(jié)果

首先使用 mitmdump 開啟請(qǐng)求監(jiān)聽的服務(wù),然后執(zhí)行爬取腳本。

App 會(huì)自動(dòng)打開,執(zhí)行一系列操作后,到達(dá)商品界面,然后自動(dòng)滑動(dòng)界面,通過 mitmproxy 自動(dòng)把有用的數(shù)據(jù)保存到 MongoDB 數(shù)據(jù)庫(kù)中。

Python怎么爬取當(dāng)當(dāng)網(wǎng)APP數(shù)據(jù)

以上就是Python怎么爬取當(dāng)當(dāng)網(wǎng)APP數(shù)據(jù),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI