1.获取现在的时间

def current_date_str():
    now = datetime.now()
    return f"{now.month}.{now.day}"

2.数据的清洗

(1) 将带“K”、“M”、“B”后缀的数字字符串统一转换为以“K”为单位的简写字符串。
def num2k(num_str):
    if not num_str:
        return ""
    num_str = num_str.replace(',', '').strip().upper()
    try:
        if num_str.endswith('B'):
            value = float(num_str[:-1]) * 1000000
        elif num_str.endswith('M'):
            value = float(num_str[:-1]) * 1000
        elif num_str.endswith('K'):
            value = float(num_str[:-1])
        elif re.match(r'^\d+(\.\d+)?$', num_str):
            value = float(num_str) / 1000
        else:
            return num_str
        value_str = f"{value:.1f}".rstrip('0').rstrip('.')
        return f"{value_str}K"
    except Exception:
        return num_str

结果如下:
print(num2k("1.2M"))     # 输出: 1200K
print(num2k("3B"))       # 输出: 3000000K
print(num2k("2500"))     # 输出: 2.5K
print(num2k("2,300K"))   # 输出: 2300K
print(num2k("abc"))      # 输出: abc
(2) 将带“K”、“M”、“B”后缀的数字字符串转换为实际数值(如int或float),方便后续计算。
def parse_num(num_str):
    if pd.isnull(num_str):
        return 0
    num_str = str(num_str).replace(",", "").strip().upper()
    try:
        if num_str.endswith('B'):
            return float(num_str[:-1]) * 1_000_000_000
        elif num_str.endswith('M'):
            return float(num_str[:-1]) * 1_000_000
        elif num_str.endswith('K'):
            return float(num_str[:-1]) * 1_000
        elif re.match(r'^\d+(\.\d+)?$', num_str):
            return float(num_str)
        else:
            return 0
    except Exception:
        return 0

结果如下:

print(parse_num("1.2M"))   # 输出: 1200000.0
print(parse_num("3B"))     # 输出: 3000000000.0
print(parse_num("2500"))   # 输出: 2500.0
print(parse_num("2,300K")) # 输出: 2300000.0
print(parse_num(None))     # 输出: 0
print(parse_num("abc"))    # 输出: 0

3.获取视频链接

  • 利用 find_elements 查找网页元素

  • set 集合去重

  • while 循环控制采集数量与次数

  • 网页下拉与等待

  • 代码简化与结构清晰

def get_video_links(driver, max_links=30, max_scroll=20):
    """
    自动采集网页中所有包含'/video/'的链接,返回不重复的前 max_links 个链接。
    """
    video_links = set()  # 用集合去重
    scroll_times = 0
​
    while len(video_links) < max_links and scroll_times < max_scroll:
        # 1. 查找所有包含 /video/ 的链接
        a_tags = driver.find_elements(By.XPATH, '//a[contains(@href, "/video/")]')
        for a in a_tags:
            href = a.get_attribute('href')
            if href and '/video/' in href:
                # 只保留主链接部分,去掉参数
                video_links.add(href.split('?')[0])
​
        # 2. 模拟用户向下滚动页面加载新内容
        driver.execute_script("window.scrollBy(0, 500);")
        time.sleep(1.5)  # 等待页面加载
​
        scroll_times += 1
​
        # 3. 如果这次没有新链接,提前结束
        if len(video_links) >= max_links or scroll_times >= max_scroll:
            break
​
    print(f"共采集到 {len(video_links)} 个视频链接")
    return list(video_links)[:max_links]

4.启动chrome,并跳转到需要爬取的网站

chrome_options = uc.ChromeOptions()
chrome_options.add_argument('--start-maximized')
chrome_options.add_argument('--lang=en-US')
chrome_options.add_argument(f'--user-data-dir={chrome_user_data_dir}')
chrome_options.add_argument(f'--profile-directory={chrome_profile_dir}')
driver = uc.Chrome(options=chrome_options, use_subprocess=True)
​
print('当前工作目录:', os.getcwd())
driver.get("https://www.tiktok.com/")
wait_for_captcha(driver)  # 首次页面先等通过验证码
input("请在弹出的浏览器窗口手动登录并完成所有图片/滑块验证,确认主页可正常浏览后,回到命令行按回车继续...")

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐