如何使用bs4完整抓取指定网页的图片、图表及超链接?
解决动态内容抓取问题的两种方案
问题原因
你用requests+BeautifulSoup抓不到图片、图表和部分链接,核心原因是目标网站的这些内容是通过JavaScript动态渲染的。requests只能获取服务器返回的初始静态HTML,不会执行页面中的JS代码,所以那些需要JS加载的动态元素根本不会出现在你拿到的page.content里。
方案一:用浏览器自动化工具渲染JS(Selenium)
这类工具会模拟真实浏览器打开页面,等待JS执行完成后再获取完整的页面源码,完美解决动态内容抓取问题。
步骤:
- 安装依赖:
pip install selenium
- 下载对应浏览器的驱动(比如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接口,跳过浏览器渲染,直接请求接口拿到结构化数据。
操作步骤:
- 打开目标网站,按F12打开开发者工具,切换到「Network」标签。
- 刷新页面,筛选「XHR」或「Fetch」类型的请求,找返回内容包含文章图片、链接的接口。
- 复制该接口的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
相关产品推荐
相关产品推荐

