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

Python自定义循环执行网页爬取仅输出最后结果的问题求助

排查网页抓取仅返回最后一页结果的问题

让我来帮你搞定这个问题!你的代码逻辑看起来是对的,但只拿到最后一页的结果,大概率是这几个原因导致的,咱们一步步排查:

1. 服务器返回缓存内容,或者请求头太简单被识别为重复请求

很多网站会对没有请求头的简单请求返回缓存内容,或者把多次请求判定为同一请求,导致每次拿到的都是最后一页的内容。你可以给请求加上浏览器风格的请求头,模拟真实用户访问:

import requests
from bs4 import BeautifulSoup
import csv
from datetime import datetime

results = []
# 添加模拟浏览器的请求头
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',
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma': 'no-cache'
}

for x in (3, 1, 6, 7, 5, 4, 8, 2, 9, 10, 11, 12):
    response = requests.get(f"https://www.example.com/index.aspx?sign={x}", headers=headers)
    # 先检查请求是否成功,避免失败请求影响结果
    response.raise_for_status()
    soup = BeautifulSoup(response.content, 'html.parser')
    
    box = soup.find('h1').text
    heading = box.split()[0]
    reading = soup.find_all('p')[0].text
    # 打印每一页的抓取结果,方便确认是否都拿到了
    print(f"已抓取页面{x}:{heading}")
    results.append((heading, reading, datetime.now()))

# 最后可以打印整个结果列表确认
print("所有抓取结果:", results)

2. 前面的请求失败了,但你没察觉

如果前面的页面请求返回了404、500这类错误,requests默认不会抛出异常,会继续执行,导致只有最后一个请求成功时,结果列表里只有最后一项。上面的代码里加了response.raise_for_status(),如果请求失败会直接抛出异常,帮你快速定位哪个页面出了问题。

3. 页面是JavaScript动态渲染的

如果目标页面的内容是通过JavaScript加载的,requests只能拿到静态的HTML源码,可能前面的页面静态内容是空的,只有最后一页刚好有静态内容。这种情况需要用浏览器自动化工具(比如Selenium)来模拟真实浏览器加载页面:

from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import datetime
import time

results = []
# 初始化浏览器驱动(需要提前下载对应浏览器的驱动,比如ChromeDriver)
driver = webdriver.Chrome()

for x in (3, 1, 6, 7, 5, 4, 8, 2, 9, 10, 11, 12):
    driver.get(f"https://www.example.com/index.aspx?sign={x}")
    # 等待页面加载完成(根据实际情况调整等待时间)
    time.sleep(1.5)
    # 定位元素并提取内容
    heading = driver.find_element(By.TAG_NAME, 'h1').text.split()[0]
    reading = driver.find_element(By.TAG_NAME, 'p').text
    print(f"已抓取页面{x}:{heading}")
    results.append((heading, reading, datetime.now()))

driver.quit()
print("所有抓取结果:", results)

4. 检查结果输出的方式

最后再确认一下:你是不是在输出结果的时候只取了results的最后一项?比如如果用了print(results[-1])就只会显示最后一页的内容。一定要确保是输出整个列表,比如print(results)或者写入CSV的时候遍历整个列表。

先从添加请求头和检查请求状态这两步开始试,这是最常见的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:52:36