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
相关产品推荐
相关产品推荐

