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

如何使用bs4完整抓取指定网页的图片、图表及超链接?

解决动态内容抓取问题的两种方案

问题原因

你用requests+BeautifulSoup抓不到图片、图表和部分链接,核心原因是目标网站的这些内容是通过JavaScript动态渲染的。requests只能获取服务器返回的初始静态HTML,不会执行页面中的JS代码,所以那些需要JS加载的动态元素根本不会出现在你拿到的page.content里。


方案一:用浏览器自动化工具渲染JS(Selenium)

这类工具会模拟真实浏览器打开页面,等待JS执行完成后再获取完整的页面源码,完美解决动态内容抓取问题。

步骤:

  1. 安装依赖:
pip install selenium
  1. 下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和你的浏览器版本匹配,把驱动放到系统PATH里或者指定路径。

示例代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

url = 'https://www.gold.org/goldhub/research/investment-update-case-gold-uk-defined-benefit-schemes'

# 配置Chrome选项,可选无头模式(不显示浏览器窗口)
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--disable-gpu')

# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)
driver.get(url)

# 等待页面加载完成(可以根据具体元素等待,更精准)
time.sleep(3)  # 简单等待,也可以用WebDriverWait等待特定元素出现

# 获取渲染后的页面源码
page_source = driver.page_source
driver.quit()  # 关闭浏览器

# 用BeautifulSoup解析
soup = BeautifulSoup(page_source, 'html.parser')
lay_content = soup.find("div", {"class": "layout-content"})

# 提取所有图片
images = lay_content.find_all('img')
for img in images:
    print(f"图片URL: {img.get('src')}")

# 提取所有超链接
links = lay_content.find_all('a')
for link in links:
    print(f"链接文本: {link.text.strip()}, URL: {link.get('href')}")

方案二:直接抓取后台API接口(更高效)

很多动态网站会通过AJAX请求后台API获取数据,然后渲染到页面上。你可以直接找这些API接口,跳过浏览器渲染,直接请求接口拿到结构化数据。

操作步骤:

  1. 打开目标网站,按F12打开开发者工具,切换到「Network」标签。
  2. 刷新页面,筛选「XHR」或「Fetch」类型的请求,找返回内容包含文章图片、链接的接口。
  3. 复制该接口的URL,用requests直接请求,解析返回的JSON数据即可。

示例(假设找到的API接口):

import requests

api_url = "这里替换成你找到的真实API接口URL"
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(api_url, headers=headers)
data = response.json()

# 从JSON数据中提取图片、链接等内容(具体字段根据API返回结构调整)
for item in data.get('content', []):
    if 'image' in item:
        print(f"图片URL: {item['image']['url']}")
    if 'link' in item:
        print(f"链接URL: {item['link']['url']}")

注意事项

  • 部分网站有反爬机制,请求时记得加User-Agent等请求头,模拟真实浏览器。
  • 用Selenium时,避免频繁请求,必要时可以添加随机延迟,降低被检测的概率。
  • 如果API接口有签名或token验证,优先选择Selenium方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:11:05