js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)
优采云 发布时间: 2022-04-02 03:15js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)
在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何使用jsoup分析html源文件的内容得到我们想要的数据,但是有时候这两种方法都不能使用捕获我们想要的数据。所需数据,例如,请参见以下示例。
1.需求场景:
如果要抢到股票的最新价格,F12页信息如下:
按照前面的方法,爬取的代码如下:
/**
* @description: 爬取股票的最新股价
* @author: JAVA开发老菜鸟
* @date: 2021-10-16 21:47
*/
public class StockPriceSpider {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
StockPriceSpider stockPriceSpider = new StockPriceSpider();
String html = stockPriceSpider.httpClientProcess();
stockPriceSpider.jsoupProcess(html);
}
private String httpClientProcess() {
String html = "";
String uri = "http://quote.eastmoney.com/sh600036.html";
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet(uri);
try {
request.setHeader("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
request.setHeader("accept", "application/json, text/javascript, */*; q=0.01");
// HttpHost proxy = new HttpHost("3.211.17.212", 80);
// RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
// request.setConfig(config);
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
html = EntityUtils.toString(httpEntity, "utf-8");
logger.info("访问{} 成功,返回页面数据{}", uri, html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
logger.info("访问{},返回状态不是200", uri);
logger.info(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
return html;
}
private void jsoupProcess(String html) {
Document document = Jsoup.parse(html);
Element price = document.getElementById("price9");
logger.info("股价为:>>> {}", price.text());
}
}
运行结果:
纳尼,股价是“-”?不可能的。
无法爬取正确结果的原因是因为这个值是在网站上异步加载渲染的,所以无法正常获取。
2.爬取异步加载数据的java方法
如何爬取异步加载的数据?通常有两种方法:
2.1 内置浏览器内核
内置浏览器就是在爬虫程序中启动一个浏览器内核,让js渲染出来的页面和静态页面一样。常用的内核有
这里我选择了 Selenium,它是一个模拟浏览器和自动化测试工具。它提供了一组 API 来与真正的浏览器内核交互。当然,爬虫也可以使用它。
具体方法如下:
org.seleniumhq.selenium
selenium-java
3.141.59
2.2 逆向分析
反向解析的方法是通过F12找到Ajax异步数据获取的链接,直接调用链接得到json结果,然后直接解析json结果得到想要的数据。
此方法的关键是找到 Ajax 链接。这个方法我没研究过,有兴趣可以百度下载。稍微在这里。
3.结束语
以上就是如何通过selenium-java爬取异步加载的数据。通过这个方法,我写了一个小工具:仓位市值通知系统,每天会根据自己的仓位配置自动计算账户总市值,并发送邮件通知到指定邮箱。
使用的技术如下:
相关代码已经上传到我的码云,有兴趣的可以看看。