You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BS4遍历页面列表时仅提取到每个页面最后一个链接的异常问题

爬虫仅提取每个页面最后一个链接的问题排查与解决

我尝试爬取一个包含12个页面的网站,每个页面里有若干文章链接,目标是提取所有链接存储起来后续使用。但现在遇到了问题:每个页面只提取到最后一个链接,预期应该有大概80个链接,但实际结果远达不到。以下是我的实现代码:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import csv
import time

# 生成页面URL并存储到issues列表
archive = '[redacted URL]'
issues =[]

# 遍历生成第163至175期的页面URL
for i in range(163,175):
    url_of_issue = archive + '/' + str(i)
    issues.append(url_of_issue)

# 从生成的页面中提取论文链接并存储到paper_urls列表
paper_urls =[]
for url in issues:
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, "html.parser")
    for a in soup.select('.obj_article_summary .title a'):
        ahrefTags=(a['href'])
        paper_urls.append(ahrefTags)
    print(paper_urls)
    time.sleep(5)

问题分析与解决办法

我们一步步排查可能的原因,对应给出解决方向:

1. 先验证CSS选择器是否匹配所有目标链接

你当前用的选择器.obj_article_summary .title a可能没覆盖到所有文章链接。建议打开任意一个目标页面,按F12打开浏览器开发者工具,在控制台输入这段代码:

document.querySelectorAll('.obj_article_summary .title a')

查看返回的NodeList长度,如果长度是1,说明选择器只命中了单个元素,需要重新调整选择器——比如页面中文章的容器类名可能不是obj_article_summary,或者标题的层级结构有差异,得重新定位正确的元素路径。

2. 检查请求是否返回了完整的页面内容

有些网站会拦截非浏览器的请求,导致requests.get()拿到的HTML不完整。你可以在请求后加一些调试代码:

response = requests.get(url)
print(f"请求URL: {url},状态码: {response.status_code}")
# 打印前500字符,确认是否包含文章列表内容
print(response.text[:500])

如果状态码不是200,或者响应内容里找不到文章相关的结构,建议添加请求头模拟浏览器:

headers = {
    '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'
}
response = requests.get(url, headers=headers)

3. 考虑页面是否为动态加载内容

如果目标页面的文章列表是通过JavaScript异步渲染的,requests只能拿到初始的静态HTML,获取不到动态加载的内容。这种情况需要用Selenium或Playwright这类工具模拟浏览器渲染:

以Selenium为例,修改后的代码如下:

import time
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

archive = '[redacted URL]'
issues =[]
for i in range(163,175):
    url_of_issue = archive + '/' + str(i)
    issues.append(url_of_issue)

paper_urls = []
# 初始化Chrome浏览器(需提前下载对应版本的chromedriver)
driver = webdriver.Chrome()

for url in issues:
    driver.get(url)
    # 等待所有文章链接加载完成,最多等待10秒
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.obj_article_summary .title a'))
    )
    # 提取所有链接
    links = driver.find_elements(By.CSS_SELECTOR, '.obj_article_summary .title a')
    for link in links:
        href = link.get_attribute('href')
        if href:  # 确保链接不为空
            paper_urls.append(href)
    print(paper_urls)
    time.sleep(5)

driver.quit()

内容的提问来源于stack exchange,提问作者drupaljac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:52:45