如何筛选论坛含viewthread的href链接并批量打开以实现网页爬虫?
论坛爬虫点击链接无响应问题解决
你的需求是筛选论坛中含viewthread的链接并点击,但点击无反应,代码里有几个关键问题:
问题点分析
- 拼写错误:第二个循环里把
viewthread写成了veiwthread,导致根本筛选不到目标链接,自然不会执行点击逻辑 - 无意义的frame切换:目标页面不存在iframe,
EC.frame_to_be_available_and_switch_to_it这步完全错误,会让后续操作处于错误的上下文 - 重复查找元素:循环里已经拿到了
link元素,又重新执行driver.find_element,不仅多余还会因为上下文问题找不到元素 - 未处理页面跳转:点击链接后页面会跳转,原页面的元素会失效,若要继续处理其他链接,需要返回原页面或用新标签页打开
修正后的代码方案
方案1:点击后返回原页面继续处理
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = Options() options.add_argument("start-maximized") webdriver_service = Service(r'C:\webdrivers\chromedriver.exe') # 加r转义路径里的反斜杠 driver = webdriver.Chrome(service=webdriver_service, options=options) url = "https://navalcommand.enjin.com/forum/viewforum/2989694/m/11178354/page/1" driver.get(url) wait = WebDriverWait(driver, 10) # 先收集所有目标链接的URL,避免页面跳转后元素失效 target_links = [] elems = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='structure small-cells']//a[@href]"))) for elem in elems: href = elem.get_attribute('href') if "viewthread" in href: target_links.append(href) print(href) # 逐个打开链接处理 for link in target_links: driver.get(link) # 这里添加帖子页面的处理逻辑,比如提取内容 print("当前帖子标题:", driver.title) driver.back() # 返回论坛列表页 wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='structure small-cells']//a[@href]"))) # 等待列表页加载完成 driver.quit()
方案2:新标签页打开链接(避免页面跳转)
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys options = Options() options.add_argument("start-maximized") webdriver_service = Service(r'C:\webdrivers\chromedriver.exe') driver = webdriver.Chrome(service=webdriver_service, options=options) url = "https://navalcommand.enjin.com/forum/viewforum/2989694/m/11178354/page/1" driver.get(url) wait = WebDriverWait(driver, 10) # 筛选目标链接元素 elems = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='structure small-cells']//a[@href]"))) target_elems = [elem for elem in elems if "viewthread" in elem.get_attribute('href')] for elem in target_elems: # Ctrl+点击在新标签页打开链接 elem.send_keys(Keys.CONTROL + Keys.ENTER) # 切换到新标签页 driver.switch_to.window(driver.window_handles[-1]) # 处理帖子页面逻辑 print("当前帖子标题:", driver.title) # 关闭新标签页并切回原页面 driver.close() driver.switch_to.window(driver.window_handles[0]) driver.quit()
额外注意事项
- 路径里的反斜杠要加
r转义,避免被识别为转义字符 - 尽量用显式等待代替固定时长等待,提升代码稳定性
- 频繁操作可能触发反爬机制,建议适当添加
time.sleep()控制操作节奏
内容的提问来源于stack exchange,提问作者Jherky
相关产品推荐
相关产品推荐

