java爬虫抓取网页数据(2.如何通过selenium-java爬取异步加载的数据方法。)

优采云 发布时间: 2021-10-27 05:07

  java爬虫抓取网页数据(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爬取异步加载的数据。通过这个方法,我写了一个小工具:持仓市值通知系统,他每天都会根据自己的持仓配置自动计算出账户总市值,并发送邮件通知到指定邮箱。

  使用的技术如下:

  相关代码已经上传到我的码云,有兴趣的可以查看。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线