如何使用Jsoup爬取BBC搜索结果页的图片、条目标题与描述
Jsoup 提取BBC搜索结果条目的实现方案
稳定定位规则
直接基于页面固定语义属性定位搜索结果容器,避免前端类名哈希变更导致爬取失效:
- 所有搜索结果条目统一挂载在带
data-testid="search-result"属性的<article>标签下 - 条目标题:条目容器内
<h1>标签下的<a>文本节点 - 条目描述:条目容器内带
data-testid="card-description"属性的段落文本节点 - 条目图片:条目容器内
<img>标签的src属性,通过Jsoup内置方法拼接为完整可访问地址
替换后可直接运行的代码
StringBuilder newsContent = new StringBuilder(); try { // 配置浏览器标识,避免被站点反爬拦截 Document page = Jsoup.connect("https://www.bbc.co.uk/search?q=handsworth") .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") .get(); String pageTotalTitle = page.title(); newsContent.append(pageTotalTitle).append("\n\n"); // 遍历所有搜索结果条目 Elements resultItems = page.select("article[data-testid='search-result']"); int index = 1; for (Element item : resultItems) { newsContent.append("第").append(index).append("条结果\n"); // 提取标题 Element titleNode = item.selectFirst("h1 a"); String title = titleNode != null ? titleNode.text().trim() : "无匹配标题"; newsContent.append("标题:").append(title).append("\n"); // 提取描述 Element descNode = item.selectFirst("p[data-testid='card-description']"); String desc = descNode != null ? descNode.text().trim() : "无匹配描述"; newsContent.append("描述:").append(desc).append("\n"); // 提取图片 Element imgNode = item.selectFirst("img"); String imgSrc = imgNode != null ? imgNode.absUrl("src") : "无匹配配图"; newsContent.append("图片地址:").append(imgSrc).append("\n\n"); index++; } } catch (IOException e) { newsContent.append("爬取报错:").append(e.getMessage()).append("\n"); }
实操注意点
- 必须在请求中配置和主流浏览器一致的
userAgent,否则默认Jsoup的请求特征会触发站点反爬,返回403状态码 - 提取资源地址时优先使用
absUrl()方法,自动处理相对路径的域名拼接,不需要手动写前缀逻辑 - 定位元素优先选用页面上带固定语义的属性(如
data-testid)做选择器,这类属性不会随前端样式更新变动,爬取稳定性远高于带随机哈希后缀的样式类名
内容的提问来源于stack exchange,提问作者user2525009
相关产品推荐
相关产品推荐

