罗俊辉 1 год назад
Сommit
8cf8015350
10 измененных файлов с 1336 добавлено и 0 удалено
  1. 2 0
      applications/__init__.py
  2. 608 0
      applications/config.py
  3. 218 0
      applications/functions.py
  4. 33 0
      applications/get_info.py
  5. 64 0
      applications/mysql.py
  6. 164 0
      main.py
  7. 124 0
      main_single_server.py
  8. 116 0
      main_v2.py
  9. 3 0
      run_all.py
  10. 4 0
      run_single.py

+ 2 - 0
applications/__init__.py

@@ -0,0 +1,2 @@
+from .mysql import Mysql
+from .functions import check_account, navigate

+ 608 - 0
applications/config.py

@@ -0,0 +1,608 @@
+"""
+小程序:
+    -1 票圈内容精选
+    -2 票圈 l 3亿人喜欢的视频平台
+    -3 票圈 l 视频精选
+    -4 票圈 l 祝福
+    -5 票圈 l 福年
+    -6 票圈 l 信仰之路
+    -7 票圈视频
+    -8 票圈短视频
+    -9 老好看视频
+    -10 票圈最惊奇
+    -11 票圈视频+
+"""
+
+platform_list = [
+    "票圈内容精选",
+    "票圈 l 3亿人喜欢的视频平台",
+    "票圈 l 视频精选",
+    "票圈 l 祝福",
+    "票圈 l 福年",
+    "票圈 l 信仰之路",
+    "票圈视频",
+    "票圈短视频",
+    "老好看视频",
+    "票圈最惊奇",
+    "票圈视频+",
+]
+
+platform_map = {
+    "票圈内容精选": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈 l 3亿人喜欢的视频平台": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验层": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈 l 视频精选": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈 l 祝福": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ]
+    },
+    "票圈 I 福年": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈 l 信仰之路": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈视频": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈短视频": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        " 产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "老好看视频": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈最惊奇": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+    "票圈视频+": {
+        "产品功能实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "广告实验": [
+            "小程序访问人数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        " 算法实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+        "产品/广告实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+        ],
+        "广告类型策略实验": [
+            "小程序访问人数",
+            "小程序分享人数",
+            "小程序分享次数",
+            "广告曝光次数",
+            "广告曝光人数",
+            "广告 eCPM",
+            "广告收入",
+        ],
+    },
+}

+ 218 - 0
applications/functions.py

@@ -0,0 +1,218 @@
+"""
+We-analysis-functions
+"""
+
+import asyncio
+from .config import platform_map
+
+
+async def check_account(page, account_name):
+    """
+    切换账号
+    :param page: playwright instance page class
+    :param account_name: 小程序名称
+    """
+    await page.get_by_text("账号", exact=True).click()
+    await page.get_by_text("切换账号切换账号").click()
+    await page.locator(f'text=/^{account_name}$/').click()
+    await asyncio.sleep(5)
+
+
+async def navigate(page, account_name):
+    name_ = """
+    :param page: playwright instance page class
+    :param account_name:
+    """
+    await page.get_by_text("经营工具").click()
+    for experiment_name in platform_map[account_name].keys():
+        await page.get_by_text("实验工具", exact=True).click()
+        await page.get_by_text("实验数据", exact=True).click()
+        print(experiment_name)
+        await asyncio.sleep(10)
+        await page.locator(f'text=/^{experiment_name}$/').click()
+        index_list = platform_map[account_name][experiment_name]
+        await download_file_list(page, index_list)
+
+
+async def download_file_list(page, index_list):
+    """
+    :param page: playwright instance page class
+    :param index_list: 需要导出的实验list
+    :return:
+    """
+    for i, index in enumerate(index_list):
+        if i == 0:
+            pre_index = index_list[0]
+        else:
+            pre_index = index_list[i - 1]
+        await download_file(page, pre_index, index)
+        await asyncio.sleep(10)
+
+
+async def download_file(page, pre_index, target_path):
+    """
+    :param page: playwright instance page class
+    :param pre_index:   前置索引
+    :param target_path:  目标地址
+    :return:
+    """
+    await page.locator("dt").filter(has_text=pre_index).first.click()
+    await page.get_by_role("list").get_by_text(target_path, exact=True).click()
+    await asyncio.sleep(8)
+    await page.get_by_role("img", name="下载").click()
+
+
+async def navigate_and_download(page, experiment_name, platform):
+    """
+    导航到指定的页面并触发下载。
+    :param page: playwright的页面对象。
+    :param experiment_name: 要导航到的实验名称。
+    :param platform: 小程序名称。
+    """
+    if platform == "票圈视频+" and experiment_name in ['广告实验', '产品/广告实验']:
+        if experiment_name == "产品/广告实验":
+            await page.get_by_text("实验工具").click()
+            await page.get_by_text("实验数据").click()
+            await page.locator(f'text=/^{experiment_name}$/').click()
+
+            # 小程序访问人数
+            await asyncio.sleep(10)
+            # await page.get_by_text("小程序访问人数").nth(1).click()
+            await page.locator("dt").filter(has_text="小程序访问人数").first.click()
+            await page.get_by_role("list").get_by_text("小程序访问人数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            # 小程序分享人数
+            # await page.get_by_text("小程序访问人数").nth(1).click()
+            await page.locator("dt").filter(has_text="小程序访问人数").first.click()
+            await page.get_by_role("list").get_by_text("小程序分享人数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            # 小程序分享次数
+            await page.locator("dt").filter(has_text="小程序分享人数").click()
+            await page.get_by_role("list").get_by_text("小程序分享次数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            # 广告曝光次数
+            await page.locator("dt").filter(has_text="小程序分享次数").click()
+            await page.get_by_role("list").get_by_text("广告曝光次数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            await page.locator("dt").filter(has_text="广告曝光次数").click()
+            await page.get_by_role("list").get_by_text("广告曝光人数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            # 广告 eCPM
+            await page.locator("dt").filter(has_text="广告曝光人数").click()
+            await page.get_by_role("list").get_by_text("广告 eCPM", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+        elif experiment_name == "广告实验":
+            await page.get_by_text("实验工具").click()
+            await page.get_by_text("实验数据").click()
+            await page.locator(f'text=/^{experiment_name}$/').click()
+
+            # 小程序访问人数
+            await asyncio.sleep(10)
+            # await page.get_by_text("小程序访问人数").nth(1).click()
+            await page.locator("dt").filter(has_text="小程序访问人数").first.click()
+            await page.get_by_role("list").get_by_text("小程序访问人数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            # 广告曝光次数
+            await page.locator("dt").filter(has_text="小程序访问人数").first.click()
+            await page.get_by_role("list").get_by_text("广告曝光次数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            await page.locator("dt").filter(has_text="广告曝光次数").click()
+            await page.get_by_role("list").get_by_text("广告曝光人数", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            # 广告 eCPM
+            await page.locator("dt").filter(has_text="广告曝光人数").click()
+            await page.get_by_role("list").get_by_text("广告 eCPM", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+            # 广告收入
+            await page.locator("dt").filter(has_text="广告 eCPM").click()
+            await page.get_by_role("list").get_by_text("广告收入", exact=True).click()
+            await asyncio.sleep(10)
+            await page.get_by_role("img", name="下载").click()
+            await asyncio.sleep(10)
+
+    else:
+        await page.get_by_text("实验工具").click()
+        await page.get_by_text("实验数据").click()
+        await page.locator(f'text=/^{experiment_name}$/').click()
+
+        # 小程序访问人数
+        await asyncio.sleep(10)
+        # await page.get_by_text("小程序访问人数").nth(1).click()
+        await page.locator("dt").filter(has_text="小程序访问人数").first.click()
+        await page.get_by_role("list").get_by_text("小程序访问人数", exact=True).click()
+        await asyncio.sleep(10)
+        await page.get_by_role("img", name="下载").click()
+        await asyncio.sleep(10)
+
+        # 小程序分享人数
+        # await page.get_by_text("小程序访问人数").nth(1).click()
+        await page.locator("dt").filter(has_text="小程序访问人数").first.click()
+        await page.get_by_role("list").get_by_text("小程序分享人数", exact=True).click()
+        await asyncio.sleep(10)
+        await page.get_by_role("img", name="下载").click()
+        await asyncio.sleep(10)
+
+        # 小程序分享次数
+        await page.locator("dt").filter(has_text="小程序分享人数").click()
+        await page.get_by_role("list").get_by_text("小程序分享次数", exact=True).click()
+        await asyncio.sleep(10)
+        await page.get_by_role("img", name="下载").click()
+        await asyncio.sleep(10)
+
+        # 广告曝光次数
+        await page.locator("dt").filter(has_text="小程序分享次数").click()
+        await page.get_by_role("list").get_by_text("广告曝光次数", exact=True).click()
+        await asyncio.sleep(10)
+        await page.get_by_role("img", name="下载").click()
+        await asyncio.sleep(10)
+
+        # 广告曝光人数
+        await page.locator("dt").filter(has_text="广告曝光次数").click()
+        await page.get_by_role("list").get_by_text("广告曝光人数", exact=True).click()
+        await asyncio.sleep(10)
+        await page.get_by_role("img", name="下载").click()
+        await asyncio.sleep(10)
+
+        # 广告 eCPM
+        await page.locator("dt").filter(has_text="广告曝光人数").click()
+        await page.get_by_role("list").get_by_text("广告 eCPM", exact=True).click()
+        await asyncio.sleep(10)
+        await page.get_by_role("img", name="下载").click()
+        await asyncio.sleep(10)
+
+        # 广告收入
+        await page.locator("dt").filter(has_text="广告 eCPM").click()
+        await page.get_by_role("list").get_by_text("广告收入", exact=True).click()
+        await asyncio.sleep(10)
+        await page.get_by_role("img", name="下载").click()
+        await asyncio.sleep(10)

+ 33 - 0
applications/get_info.py

@@ -0,0 +1,33 @@
+import asyncio
+
+from .navigate_and_download import navigate_and_download
+
+
+async def get_info(page, platform):
+    await page.get_by_text("经营工具").click()
+    await asyncio.sleep(5)
+    if platform == "票圈 l 祝福":
+        await navigate_and_download(page, "产品功能实验", platform)
+
+        await navigate_and_download(page, "广告实验", platform)
+    else:
+        await navigate_and_download(page, "产品功能实验", platform)
+
+        await navigate_and_download(page, "产品实验", platform)
+
+        await navigate_and_download(page, "广告实验", platform)
+
+        if platform == "票圈视频+":
+            await navigate_and_download(page, " 算法实验", platform)
+        else:
+            await navigate_and_download(page, "算法实验", platform)
+
+        if platform == "票圈短视频":
+            await navigate_and_download(page, " 产品/广告实验", platform)
+        else:
+            await navigate_and_download(page, "产品/广告实验", platform)
+
+        if platform == "票圈 l 3亿人喜欢的视频平台":
+            await navigate_and_download(page, "广告类型策略实验层", platform)
+        else:
+            await navigate_and_download(page, "广告类型策略实验", platform)

+ 64 - 0
applications/mysql.py

@@ -0,0 +1,64 @@
+import pymysql
+
+
+class Mysql(object):
+    """
+    封装后的mysql方法
+    """
+    def __init__(self):
+        self.connection = pymysql.connect(
+            host="rm-bp1159bu17li9hi94.mysql.rds.aliyuncs.com",  # 数据库IP地址,内网地址
+            port=3306,  # 端口号
+            user="crawler",  # mysql用户名
+            passwd="crawler123456@",  # mysql用户登录密码
+            db="piaoquan-crawler",  # 数据库名
+            charset="utf8mb4"  # 如果数据库里面的文本是utf8编码的,charset指定是utf8
+        )
+
+    def insert_line(self, data):
+        """
+        :param data: 插入Mysql的代码
+        :return:
+        """
+        if self.index(data):
+            try:
+                with self.connection.cursor() as cursor:
+                    sql = "INSERT INTO we_analysis_results (mini_program, task_name, subject, date, control_group, test_group1, test_group2, test_group3, test_group4, test_group5, test_group6, test_group7, test_group8, test_group9, test_group10, test_group11, test_group12, test_group13, test_group14, test_group15, test_group16, test_group17, test_group18, test_group19, test_group20, test_group21, test_group22, test_group23, test_group24) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"
+                    cursor.execute(sql, data)
+                self.connection.commit()
+            finally:
+                self.connection.close()
+        else:
+            print("数据已经存在")
+
+    def index(self, data):
+        """
+        :param data: 判断数据是否去重
+        :return:
+        """
+        mini_program = data[0]
+        task_name = data[1]
+        subject = data[2]
+        date = data[3]
+        sql = (
+            f'SELECT 1 FROM we_analysis_results where mini_program = "{mini_program}" and task_name = "{task_name}" and subject = "{subject}" and date = "{date}"')
+        print(sql)
+        cursor = self.connection.cursor()
+        cursor.execute(sql)
+        data = cursor.fetchall()
+        if data:
+            return False
+        else:
+            return True
+
+
+
+
+
+
+
+
+
+
+
+

+ 164 - 0
main.py

@@ -0,0 +1,164 @@
+import os
+import json
+import asyncio
+import datetime
+import pandas as pd
+from playwright.async_api import async_playwright
+
+from applications import check_account, get_info, Mysql
+
+platform_name = None
+data_frame = []
+lock = asyncio.Lock()
+
+
+async def handle_download(download):
+    global platform_name
+    global data_frame
+
+    async with lock:
+        today = datetime.datetime.today().__str__().split(" ")[0].replace("-", "")
+        temp = [platform_name]
+
+        download_path = await download.path()
+        # 指定新文件名
+        new_file_path = r"temp_file\temp.xlsx"
+        # 重命名文件
+        if os.path.exists(new_file_path):
+            os.remove(new_file_path)
+        os.rename(download_path, new_file_path)
+        if os.path.exists(download_path):
+            os.remove(download_path)
+        df = pd.read_excel(new_file_path)
+        df = df.values.tolist()
+        # 实验名称
+        task_name = df[0][1]
+        temp.append(task_name)
+        # 数据指标
+        task_index = df[5][1]
+        temp.append(task_index)
+        title_row = df[8]
+        data_line = df[-1]
+        # if data_line[0] != today:
+        #     print("Not today")
+        # else:
+        temp += data_line
+        w = {temp: data_line[index] for index, temp in enumerate(title_row)}
+        print(platform_name, "\t", task_name, "\t", task_index)
+        print(json.dumps(w, ensure_ascii=False, indent=4))
+        while len(temp) < 29:
+            temp.append("NULL")
+        Mysql().insert_line(data=temp)
+        data_frame.append(temp)
+        os.remove(new_file_path)
+
+
+async def run(playwright):
+    """
+    小程序:
+        -1 票圈内容精选   ok
+        -2 票圈 l 3亿人喜欢的视频平台  ok
+        -3 票圈 l 视频精选
+        -4 票圈 l 祝福
+        -5 票圈 l 福年
+        -6 票圈 l 信仰之路    ok
+        -7 票圈视频  ok
+        -8 票圈短视频
+        -9 老好看视频    ok
+        -10 票圈最惊奇   ok
+        -11 票圈视频+
+    """
+    global platform_name
+    global data_frame
+
+    # 初始化浏览器
+    browser = await playwright.chromium.launch(
+        headless=False,
+        downloads_path="temp_file",
+    )
+    context = await browser.new_context(accept_downloads=True)
+    page = await context.new_page()
+    await page.set_viewport_size({"width": 1680, "height": 1080})
+
+    page.on("download", handle_download)
+
+    # 登陆,需要扫码
+    await page.goto("https://wedata.weixin.qq.com/mp2/login")
+    await page.goto("https://wedata.weixin.qq.com/mp2/?source=0")
+    await page.goto("https://wedata.weixin.qq.com/mp2/basic-data/core-data?source=0")
+
+    # # 默认先进入票圈内容精选
+    platform_name = '票圈内容精选'
+    await get_info(page, platform_name)
+
+    # 票圈 | 3亿人喜欢的视频平台
+    platform_name = "票圈 l 3亿人喜欢的视频平台"
+    await check_account(page, platform_name)
+    await asyncio.sleep(3)
+    await get_info(page, platform_name)
+
+    # 票圈 | 视频精选
+    platform_name = "票圈 l 视频精选"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 票圈 l 祝福
+    platform_name = "票圈 l 祝福"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 票圈 l 福年 1
+    platform_name = "票圈 I 福年"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 票圈 l 信仰之路 1
+    platform_name = "票圈 l 信仰之路"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 票圈视频
+    platform_name = "票圈视频"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 票圈短视频 1
+    platform_name = "票圈短视频"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 老好看视频
+    platform_name = "老好看视频"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 票圈最惊奇
+    platform_name = "票圈最惊奇"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # 票圈视频+
+    platform_name = "票圈视频+"
+    await check_account(page, platform_name)
+    await get_info(page, platform_name)
+
+    # columns = ["小程序", "实验", "指标", "日期", "对照组"] + [
+    #     "实验组{}".format(i) for i in range(1, 25)
+    # ]
+    # print(len(columns))
+    # out_df = DataFrame(data_frame, columns=columns)
+    # out_df.to_excel("{}.xlsx".format("2024-01-02-result"), index=False)
+
+    # await asyncio.sleep(100)
+
+    # 关闭浏览器上下文和浏览器
+    await context.close()
+    await browser.close()
+
+
+async def main():
+    async with async_playwright() as playwright:
+        await run(playwright)
+
+
+asyncio.run(main())

+ 124 - 0
main_single_server.py

@@ -0,0 +1,124 @@
+import os
+import json
+import asyncio
+import datetime
+import pandas as pd
+from playwright.async_api import async_playwright
+
+from applications import get_info, Mysql
+
+platform_name = None
+data_frame = []
+lock = asyncio.Lock()
+
+
+async def handle_download(download):
+    global platform_name
+    global data_frame
+
+    async with lock:
+        today = datetime.datetime.today().__str__().split(" ")[0].replace("-", "")
+        temp = [platform_name]
+
+        download_path = await download.path()
+        # 指定新文件名
+        new_file_path = r"temp_file\temp.xlsx"
+        # 重命名文件
+        if os.path.exists(new_file_path):
+            os.remove(new_file_path)
+        os.rename(download_path, new_file_path)
+        if os.path.exists(download_path):
+            os.remove(download_path)
+        df = pd.read_excel(new_file_path)
+        df = df.values.tolist()
+        # 实验名称
+        task_name = df[0][1]
+        temp.append(task_name)
+        # 数据指标
+        task_index = df[5][1]
+        temp.append(task_index)
+        title_row = df[8]
+        data_line = df[-1]
+        temp += data_line
+        w = {temp: data_line[index] for index, temp in enumerate(title_row)}
+        print(platform_name, "\t", task_name, "\t", task_index)
+        print(json.dumps(w, ensure_ascii=False, indent=4))
+        while len(temp) < 29:
+            temp.append("NULL")
+        Mysql().insert_line(data=temp)
+        data_frame.append(temp)
+        os.remove(new_file_path)
+
+
+async def run(playwright):
+    global platform_name
+    global data_frame
+
+    Id = input("请输入小程序id:\n" + json.dumps({
+        1: "票圈内容精选",
+        2: "票圈 l 3亿人喜欢的视频平台",
+        3: "票圈 l 视频精选",
+        4: "票圈 l 祝福",
+        5: "票圈 l 福年",
+        6: "票圈 l 信仰之路",
+        7: "票圈视频",
+        8: "票圈短视频",
+        9: "老好看视频",
+        10: "票圈最惊奇",
+        11: "票圈视频+"
+    }, ensure_ascii=False, indent=4) + "\n:")
+    Id = int(Id)
+
+    # 初始化浏览器
+    browser = await playwright.chromium.launch(
+        headless=False,
+        downloads_path="temp_file",
+    )
+    context = await browser.new_context(accept_downloads=True)
+    page = await context.new_page()
+    await page.set_viewport_size({"width": 1680, "height": 1080})
+
+    page.on("download", handle_download)
+
+    # 登陆,需要扫码
+    await page.goto("https://wedata.weixin.qq.com/mp2/login")
+    await page.goto("https://wedata.weixin.qq.com/mp2/?source=0")
+    await page.goto("https://wedata.weixin.qq.com/mp2/basic-data/core-data?source=0")
+
+    # # 默认先进入票圈内容精选
+    platform = {
+        1: "票圈内容精选",
+        2: "票圈 l 3亿人喜欢的视频平台",
+        3: "票圈 l 视频精选",
+        4: "票圈 l 祝福",
+        5: "票圈 l 福年",
+        6: "票圈 l 信仰之路",
+        7: "票圈视频",
+        8: "票圈短视频",
+        9: "老好看视频",
+        10: "票圈最惊奇",
+        11: "票圈视频+"
+    }
+    platform_name = platform[Id]
+    await get_info(page, platform_name)
+
+    # columns = ["小程序", "实验", "指标", "日期", "对照组"] + [
+    #     "实验组{}".format(i) for i in range(1, 25)
+    # ]
+    # print(len(columns))
+    # out_df = DataFrame(data_frame, columns=columns)
+    # out_df.to_excel("{}.xlsx".format("2024-01-02-result"), index=False)
+
+    # await asyncio.sleep(100)
+
+    # 关闭浏览器上下文和浏览器
+    await context.close()
+    await browser.close()
+
+
+async def main():
+    async with async_playwright() as playwright:
+        await run(playwright)
+
+
+asyncio.run(main())

+ 116 - 0
main_v2.py

@@ -0,0 +1,116 @@
+"""
+Created on Sun 7 Jan 2024
+@author: luojunhui
+"""
+import os
+import json
+import asyncio
+import datetime
+import pandas as pd
+from playwright.async_api import async_playwright
+
+from applications import check_account,  Mysql
+from applications.config import platform_map
+from applications.functions import navigate
+
+platform_name = None
+data_frame = []
+lock = asyncio.Lock()
+
+
+async def handle_download(download):
+    global platform_name
+    global data_frame
+
+    async with lock:
+        today = datetime.datetime.today().__str__().split(" ")[0].replace("-", "")
+        temp = [platform_name]
+
+        download_path = await download.path()
+        # 指定新文件名
+        new_file_path = r"temp_file\temp.xlsx"
+        # 重命名文件
+        if os.path.exists(new_file_path):
+            os.remove(new_file_path)
+        os.rename(download_path, new_file_path)
+        if os.path.exists(download_path):
+            os.remove(download_path)
+        df = pd.read_excel(new_file_path)
+        df = df.values.tolist()
+        # 实验名称
+        task_name = df[0][1]
+        temp.append(task_name)
+        # 数据指标
+        task_index = df[5][1]
+        temp.append(task_index)
+        title_row = df[8]
+        data_line = df[-1]
+        temp += data_line
+        w = {temp: data_line[index] for index, temp in enumerate(title_row)}
+        print(platform_name, "\t", task_name, "\t", task_index)
+        print(json.dumps(w, ensure_ascii=False, indent=4))
+        # while len(temp) < 29:
+        #     temp.append("NULL")
+        # Mysql().insert_line(data=temp)
+        # data_frame.append(temp)
+        os.remove(new_file_path)
+
+
+async def run(playwright):
+    """
+    小程序:
+        -1 票圈内容精选   ok
+        -2 票圈 l 3亿人喜欢的视频平台  ok
+        -3 票圈 l 视频精选
+        -4 票圈 l 祝福
+        -5 票圈 l 福年
+        -6 票圈 l 信仰之路    ok
+        -7 票圈视频  ok
+        -8 票圈短视频
+        -9 老好看视频    ok
+        -10 票圈最惊奇   ok
+        -11 票圈视频+
+    """
+    global platform_name
+    global data_frame
+
+    # 初始化浏览器
+    browser = await playwright.chromium.launch(
+        headless=False,
+        downloads_path="temp_file",
+    )
+    context = await browser.new_context(accept_downloads=True)
+    page = await context.new_page()
+    await page.set_viewport_size({"width": 1680, "height": 1080})
+
+    page.on("download", handle_download)
+
+    # 登陆,需要扫码
+    await page.goto("https://wedata.weixin.qq.com/mp2/login")
+    await page.goto("https://wedata.weixin.qq.com/mp2/?source=0")
+    await page.goto("https://wedata.weixin.qq.com/mp2/basic-data/core-data?source=0")
+
+    done_dict = {}
+    platform_name = '票圈内容精选'
+    await navigate(page, platform_name)
+    done_dict[platform_name] = 1
+
+    for platform_name in platform_map.keys():
+        if done_dict.get(platform_name):
+            print(f"{platform_name} has already been exported")
+        else:
+            await check_account(page, platform_name)
+            # await page.wait_until_loaded()
+            await navigate(page, platform_name)
+
+    # 关闭浏览器上下文和浏览器
+    await context.close()
+    await browser.close()
+
+
+async def main():
+    async with async_playwright() as playwright:
+        await run(playwright)
+
+
+asyncio.run(main())

+ 3 - 0
run_all.py

@@ -0,0 +1,3 @@
+import os
+
+os.system("python main.py")

+ 4 - 0
run_single.py

@@ -0,0 +1,4 @@
+import os
+
+
+os.system("python main_single_server.py")