# -*- coding: utf-8 -*- import platform import time import random from datetime import datetime import re import os from pymongo import MongoClient from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import httpx def browser_opt(): # 浏览器打开前, 设置浏览器 os_name = platform.system() chrome_options = Options() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-setuid-sandbox') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--headless') # 添加无头模式参数 # chrome_options.add_argument('--incognito') # 隐身模式(无痕模式) # chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" # 手动指定使用的浏览器位置 if os_name == 'Linux': chrome_options.add_argument('/usr/bin/chromium') # linux 必须指定chromium路径 else: pass # 其他系统不需要指定路径 browser = webdriver.Chrome(options=chrome_options) return browser def browser_open(browser, url): # 打开浏览器 browser.get(url) time.sleep(random.uniform(1, 2)) return browser def browser_get_page_source(browser): # 获取当前页面源代码 return browser.page_source def browser_find_by_selector(browser, selector): # 通过 css 选择器搜素 try: WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, selector))) element = browser.find_element(By.CSS_SELECTOR, selector) if not element: return None return element.text except Exception as e: print(e) return None def browser_screenshot(browser): # 获取当前网页的标题 title = browser.title # 获取当前时间的时间戳 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") # 构建文件名 filename = f"{title.replace(' ', '')}_{timestamp}.png" # 保存截图 browser.save_screenshot(filename) print(f"保存截图文件: {filename}") def browser_close(browser): browser.close() def sanitize_filename(string): # 替换Windows不允许的字符 allowed_chars = re.compile(r'[<>:"/\\|?*]') sanitized_filename = allowed_chars.sub('', string) # 替换空格为下划线 sanitized_filename = sanitized_filename.replace(' ', '_') # 确保文件名不以点开头 if sanitized_filename.startswith('.'): sanitized_filename = '_' + sanitized_filename[1:] # 确保文件名不包含两个连续的点 sanitized_filename = sanitized_filename.replace('..', '.') # 确保文件名不是空字符串 if not sanitized_filename: sanitized_filename = 'noname' + '_' + str(int(time.time())) return sanitized_filename def task1(): browser = browser_opt() print(f'正在打开浏览器') browser = browser_open(browser, url) print(f'前往 url: {url}') page_source = browser_get_page_source(browser) # 获取漫画名, 作为文件夹名 book_name = re.findall('meta property="og:novel:book_name" content="(.*?)"', page_source) if book_name: book_name = book_name[0] book_name = sanitize_filename(book_name) else: print("获取漫画名称失败") exit(0) # 获取每一集的url all_set = [] host = 'https://zcymh.com' start_tag = '