API返回HTML而非JSON的数据处理及网页内容爬取问题
从HTML响应中提取数据的实用方案
Python 环境下的解决方案
- 用
BeautifulSoup库解析HTML(最常用的方案)- 先安装依赖:
pip install beautifulsoup4 requests - 示例代码(以提取并下载图片为例):
import requests from bs4 import BeautifulSoup # 目标网站URL target_url = "你要访问的网站地址" # 发送请求获取HTML内容 resp = requests.get(target_url) # 初始化解析器 soup = BeautifulSoup(resp.text, 'html.parser') # 提取所有图片标签 all_imgs = soup.find_all('img') for img in all_imgs: img_src = img.get('src') # 处理相对路径,转成完整URL if img_src.startswith('/'): # 拼接网站域名和相对路径 domain = '/'.join(target_url.split('/')[:3]) img_src = f"{domain}{img_src}" # 下载图片 img_resp = requests.get(img_src) # 用图片文件名保存 with open(img_src.split('/')[-1], 'wb') as f: f.write(img_resp.content) - 灵活定位元素:可以通过类名、ID、标签属性精准找内容,比如
soup.find('div', class_='article-content')就能定位到指定类的div容器。
- 先安装依赖:
JavaScript/Node.js 环境下的解决方案
- 用
cheerio库(语法和jQuery几乎一致,上手快)- 安装依赖:
npm install axios cheerio - 示例代码:
const axios = require('axios'); const cheerio = require('cheerio'); const fs = require('fs'); const path = require('path'); async function extractImages() { const targetUrl = "你要访问的网站地址"; const resp = await axios.get(targetUrl); // 加载HTML到解析器 const $ = cheerio.load(resp.data); // 遍历所有img标签 $('img').each(async (_, elem) => { let imgUrl = $(elem).attr('src'); // 处理相对路径 if (imgUrl.startsWith('/')) { const urlObj = new URL(targetUrl); imgUrl = `${urlObj.protocol}//${urlObj.host}${imgUrl}`; } // 下载并保存图片 const imgResp = await axios.get(imgUrl, { responseType: 'stream' }); const fileName = path.basename(imgUrl); imgResp.data.pipe(fs.createWriteStream(fileName)); }); } extractImages();
- 安装依赖:
避坑提示
- 别用正则解析HTML:HTML结构嵌套复杂,正则很容易漏匹配或误匹配,维护起来头疼,优先用专业解析库。
- 遵守网站规则:别高频次请求,避免IP被封;先看网站的
robots.txt,确认允许爬取的内容。 - 动态内容处理:如果用上面的方法找不到数据,大概率是内容是JavaScript动态渲染的,这时候需要用
Selenium(Python)或Puppeteer(Node.js)模拟浏览器加载页面。
内容的提问来源于stack exchange,提问作者Aashish
相关产品推荐
相关产品推荐

