使用requests库获取带加载页面网站内容时无限循环问题求解
解决方法
你的问题根源在于requests库不会执行页面中的JavaScript。这类先显示加载页再展示内容的网站,通常是靠前端JS动态拉取数据并渲染页面的,用requests直接请求只能拿到最开始的静态加载页面,不管循环多少次,返回的内容都不会变,自然找不到目标input标签,陷入无限循环。
下面给你两种可行的解决思路:
1. 抓包获取真实数据接口(推荐)
打开浏览器开发者工具(按F12),切换到「Network」面板,刷新页面后观察XHR/fetch类型的请求,找到返回目标内容的API接口。直接用requests请求这个接口,就能拿到结构化的数据,不用处理页面渲染问题。
举个简单例子,假设抓包找到的接口是https://example.com/api/data,代码可以这么写:
import requests api_url = "https://example.com/api/data" headers = { # 复制浏览器请求头里的User-Agent、Cookie等必要参数 "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(api_url, headers=headers) data = response.json() # 如果返回的是JSON格式数据 print(data)
2. 使用浏览器自动化工具渲染页面
如果找不到真实接口,就用能模拟浏览器执行JS的工具,比如Selenium或Playwright,它们会像真实浏览器一样加载页面、执行JS,等待内容渲染完成后再获取页面源码。
Selenium示例:
首先需要安装Selenium和对应浏览器的驱动(比如ChromeDriver):
pip install selenium
然后编写代码:
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 from bs4 import BeautifulSoup url = "你的目标URL" # 初始化浏览器驱动(这里以Chrome为例) driver = webdriver.Chrome() driver.get(url) # 等待目标input标签出现,最多等10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "input")) ) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 处理你的数据 inputs = soup.find_all("input") print(inputs) finally: driver.quit() # 关闭浏览器
Playwright示例(更简洁,自动管理驱动):
先安装Playwright:
pip install playwright playwright install # 安装浏览器
代码示例:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup url = "你的目标URL" with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto(url) # 等待input标签出现 page.wait_for_selector("input") # 获取页面源码 page_source = page.content() soup = BeautifulSoup(page_source, "html.parser") inputs = soup.find_all("input") print(inputs) browser.close()
内容的提问来源于stack exchange,提问作者Luís Garcia
相关产品推荐
相关产品推荐

