使用Selenium爬取tandfonline遇元素找不到错误及循环点击期刊求助
解决Tandfonline期刊爬取的元素定位及循环翻页问题
一、为什么会触发NoSuchElementException?
你用的vnvpp20-18是动态生成的ID,这类ID通常和具体期数绑定,换一期就会变更,所以Selenium找不到元素。得改用页面上稳定不变的属性来定位期数按钮,比如类名、通用属性或者标签组合。
二、怎么找到正确的定位符?
打开浏览器F12开发者工具,定位目标期数按钮的HTML结构:
- 优先看按钮的类名,比如Tandfonline常见的
issue-link、issue-item这类通用类; - 也可以看父容器的标识,比如所有期数都在
class="issues-container"的标签下; - 若类名不明确,也能用包含期数特征的XPATH,比如
//a[contains(@href, "issue")](优先用类,XPATH易受页面结构变动影响)。
给你一个通用的定位示例:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("你的期刊列表页URL") # 用显式等待替代隐式等待,适配页面加载延迟 wait = WebDriverWait(driver, 10) # 定位第一期按钮(假设类名为issue-link) first_issue = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.issue-link"))) first_issue.click()
三、实现爬完单期后循环点击下一期的逻辑
核心思路是:爬完当前期数据后,要么回到期刊列表页点击下一个按钮,要么在当期页直接点击「下一期」按钮,直到无下期可爬为止。
方案1:从期刊列表页依次遍历每一期
# 先获取所有期数按钮的列表 wait = WebDriverWait(driver, 10) issue_buttons = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a.issue-link"))) # 循环处理每一期 for button in issue_buttons: button.click() # -------------------------- # 这里写爬取当期文章数据的代码 # 比如提取标题、摘要、作者等内容 # -------------------------- # 爬完后回到列表页,重新等待页面加载 driver.back() wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a.issue-link")))
方案2:在当期页点击「下一期」按钮(如果页面有该按钮)
如果当期页面底部有「Next Issue」类的按钮,直接定位循环点击:
while True: # -------------------------- # 爬取当前期文章数据的代码 # -------------------------- try: # 定位下一期按钮(按文本特征匹配) next_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Next Issue')]"))) next_button.click() # 等待当期页面加载完成(替换成文章列表的标识类) wait.until(EC.presence_of_element_located((By.CLASS_NAME, "article-list"))) except: # 找不到下一期按钮,结束循环 break
四、额外注意事项
- 机构权限:确保浏览器会话已通过机构认证(比如校园网登录、Cookie有效),避免跳转到登录页;
- 反爬规避:每次操作后加
time.sleep(2)(需导入time模块),降低请求频率; - 定位适配:如果上述类名/XPATH不匹配你的目标页面,直接用F12重新抓取实际页面的元素属性。
内容的提问来源于stack exchange,提问作者Ido Kobi
相关产品推荐
相关产品推荐

