使用Selenium爬取Letterboxd时无内容输出的技术问询
解决Letterboxd Selenium爬取无输出问题
你的代码存在几个关键问题导致无法获取内容:
- 选择器完全错误:你写的
driver.find_elements(By.CSS_SELECTOR, "frame")是在找frame元素,但Letterboxd的电影海报是放在class为film-poster的<a>标签里,页面根本不存在frame标签,所以永远找不到目标元素。 - Headless模式易被反爬检测:单纯启用headless模式会被网站识别为爬虫,导致页面加载异常或内容不渲染。
- 等待逻辑不够精准:隐式等待5秒无法确保所有海报元素加载完成,建议用显式等待针对目标元素做精准等待。
修正后的代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def search_letterboxd_by_genre(genre): url = f"https://letterboxd.com/films/genre/{genre}/" # 设置Chrome选项,规避headless检测 options = webdriver.ChromeOptions() options.add_argument("--headless=new") # 新版headless模式更接近正常浏览器 options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=options) driver.get(url) # 显式等待海报元素加载完成,最多等10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a.film-poster")) ) except: print("页面加载超时,未找到电影元素") driver.quit() return # 获取所有电影海报元素 movie_elements = driver.find_elements(By.CSS_SELECTOR, "a.film-poster") if movie_elements: for movie_element in movie_elements: try: # 海报的img标签alt属性就是电影标题 movie_title = movie_element.find_element(By.TAG_NAME, "img").get_attribute("alt") print(movie_title) except Exception as e: print(f"提取标题出错: {str(e)}") else: print("未找到该分类下的电影") driver.quit() # 调用示例(比如爬取"drama"分类) # search_letterboxd_by_genre("drama")
补充说明:
- 替换为正确的CSS选择器
a.film-poster定位电影海报容器 - 添加反爬规避参数,让headless模式更接近正常浏览器行为
- 用显式等待确保元素加载完成,避免因页面未加载完全导致的空结果
- 优化异常捕获逻辑,输出具体错误信息方便排查
内容的提问来源于stack exchange,提问作者Professional Idiot
相关产品推荐
相关产品推荐

