本文最后更新于 328 天前,其中的信息可能已经有所发展或是发生改变。
数据抓取的几种方式
- 直接请求数据接口(最方便),可使用 HttpClient、OKHttp、RestTemplate、Hutool(https://hutool.cn/)等客户端发送请求
- 等网页渲染出明文内容后,从前端完整页面中解析出需要的内容
- 有一些网站可能是动态请求的,他不会一次性加载所有的数据,而是要点击某个按钮、输入某个验证码才会显示出数据。可使用无头浏览器 => 相关技术:selenium、node.js puppeteer
例子(鱼皮-聚合搜索平台项目)
// 1.获取数据
String json = "category\n" +": \n" +"\"文章\"\n" +"current\n" +": \n" +"1\n" +"pageSize\n" +": \n" +"8\n" +"reviewStatus\n" +": \n" +"1\n" +"sortField\n" +": \n" +"\"createTime\"\n" +"sortOrder\n" +": \n" +"\"descend\"\n" +"tags\n" +": \n" +"[]";
String url = "https://www.code-nav.cn/learn/passage";
String result = HttpRequest
.post(url)
.body(json)
.execute()
.body();
System.out.println(result);
// 2.数据转换
jsoup 解析库(https://jsoup.org/):支持发送请求获取到 HTML 文档,然后从中解析出需要的字段
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.Map;
// 爬取的网站地址
String url = "https://cn.bing.com/images/search?q=二次元&form=HDRSC2&first=1";
Document doc = Jsoup.connect(url).get();
Elements select = doc.select(".iuscp.varh");
for (Element element : select) {
// 去图片地址(murl)
String m = element.select(".iusc").get(0).attr("m");
Map<String, Object> map = JSONUtil.toBean(m, Map.class);
String murl = (String) map.get("murl");
System.out.println(murl);
// 取标题
String title = element.select(".inflnk").get(0).attr("aria-label");
System.out.println(title);
}