如何用Python获取网站Inspect中的动态内容?两类报错求解决
动态页面内容爬取问题解决方案
一、关于urllib无法获取JS渲染内容的原因
urllib.request.urlopen只能获取服务器返回的原始静态HTML,不会执行页面中的JavaScript代码,所以动态生成的表格这类内容不会出现在返回的源码里,和浏览器Inspect看到的内容自然不一致。
二、修复json.load报错的问题
你直接用json.load(urllib.request.urlopen(url))报错,核心原因是目标URL返回的不是纯JSON数据,而是HTML页面。要解决这个问题,需要找到网站加载表格数据的真实API接口:
- 打开浏览器开发者工具(F12),切换到「网络」标签页,刷新页面
- 筛选「XHR/Fetch」类型的请求,找到返回JSON格式且包含表格数据的请求
- 复制该请求的URL,再用
json.load加载这个API地址
如果仍报错,补充两点检查:
- 确认该API请求的响应头中
Content-Type为application/json - 添加请求头模拟浏览器访问,避免被拦截,示例代码:
import urllib.request import json headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } req = urllib.request.Request(url='真实API接口地址', headers=headers) response = urllib.request.urlopen(req) table_data = json.load(response)
三、修复Selenium ChromeDriver报错(状态码127)
Replit环境默认没有安装Chrome浏览器和对应驱动,导致webdriver.Chrome()启动失败,按以下步骤修复:
- 在Replit的Shell执行命令,安装依赖:
sudo apt-get update && sudo apt-get install -y chromium-browser chromium-chromedriver
- 修改代码,指定浏览器和驱动路径,并配置无头模式(适合服务器环境):
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.binary_location = '/usr/bin/chromium-browser' driver = webdriver.Chrome( options=options, executable_path='/usr/bin/chromedriver' ) driver.get('目标页面URL') # 显式等待表格加载完成,最多等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, 'table')) ) full_page_source = driver.page_source # 这就是浏览器Inspect中的完整内容 driver.quit()
四、更轻量的替代方案:使用requests-html
如果觉得Selenium配置麻烦,可以用requests-html库,它内置JS渲染引擎,用法更简洁:
- 在Replit的Shell安装库:
pip install requests-html
- 示例代码:
from requests_html import HTMLSession session = HTMLSession() resp = session.get('目标页面URL') resp.html.render() # 执行页面JS渲染 # 获取所有表格元素 tables = resp.html.find('table') for table in tables: print(table.html) # 输出表格的HTML内容 session.close()
内容的提问来源于stack exchange,提问作者CELLSecret
相关产品推荐
相关产品推荐

