使用undetected chromedriver爬取9GAG表情包时遇TypeError问题求助
问题解决方法
一、修复Chrome驱动初始化错误
报错原因是你导入了Selenium的抽象Service类,这类无法直接实例化。调整驱动初始化逻辑即可解决:
修改后的初始化代码
from urllib import request import os # 补充原代码遗漏的os模块导入 import undetected_chromedriver as uc from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service # 改用Chrome专用Service类 from webdriver_manager.chrome import ChromeDriverManager # 用官方驱动管理工具 post = "az28zPm" options = Options() options.headless = True # 添加无头模式必备参数,降低反爬检测概率 options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-gpu") url = f"https://9gag.com/gag/{post}" # 正确初始化浏览器驱动 driver = uc.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.get(url)
二、修复元素定位(适配9GAG页面结构变化)
原XPATH依赖页面绝对结构,容易失效,改用更稳定的CSS选择器:
替换后的资源定位代码
save_dir = f"Attachments/{post}" if not os.path.isdir(save_dir): os.makedirs(save_dir) try: # 用CSS选择器定位视频资源 video_source = driver.find_element(By.CSS_SELECTOR, "article div.post-container video source") video_link = video_source.get_attribute("src") request.urlretrieve(video_link, f"{save_dir}/Meme.mp4") except: # 优先获取图片的高清原图链接(9GAG用懒加载,data-src是原图) img_element = driver.find_element(By.CSS_SELECTOR, "article div.post-container picture img") image_link = img_element.get_attribute("data-src") or img_element.get_attribute("src") request.urlretrieve(image_link, f"{save_dir}/Meme.jpg") driver.quit() # 关闭驱动释放资源
三、更轻量的无浏览器实现思路
直接调用9GAG官方API,无需维护浏览器驱动,效率更高:
import requests import os post_id = "az28zPm" api_url = f"https://9gag.com/v1/post/detail/{post_id}?skipNSFW=1" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } response = requests.get(api_url, headers=headers) data = response.json() save_dir = f"Attachments/{post_id}" if not os.path.isdir(save_dir): os.makedirs(save_dir) post_data = data["data"]["post"] if post_data["type"] == "video": # 取720P高清视频链接 video_url = post_data["images"]["image720mp4"]["url"] with open(f"{save_dir}/Meme.mp4", "wb") as f: f.write(requests.get(video_url, headers=headers).content) else: # 取高清图片链接 img_url = post_data["images"]["image700"]["url"] with open(f"{save_dir}/Meme.jpg", "wb") as f: f.write(requests.get(img_url, headers=headers).content)
内容的提问来源于stack exchange,提问作者naveen malla
相关产品推荐
相关产品推荐

