js 爬虫抓取网页数据(如何使用httpclient抓取页面以及如何用jsoup分析html内容)

优采云 发布时间: 2022-02-15 15:22

  js 爬虫抓取网页数据(如何使用httpclient抓取页面以及如何用jsoup分析html内容)

  在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何使用jsoup分析html源文件的内容得到我们想要的数据,但是有时候这两种方法都不能使用捕获我们想要的数据。所需数据,例如,请参见以下示例。

  1.需求场景:

  如果要抢到股票的最新价格,F12页信息如下:

  按照前面的方法,爬取的代码如下:

  1/**

2 * @description: 爬取股票的最新股价

3 * @author: JAVA开发老菜鸟

4 * @date: 2021-10-16 21:47

5 */

6public class StockPriceSpider {

7

8 Logger logger = LoggerFactory.getLogger(this.getClass());

9

10 public static void main(String[] args) {

11

12 StockPriceSpider stockPriceSpider = new StockPriceSpider();

13 String html = stockPriceSpider.httpClientProcess();

14 stockPriceSpider.jsoupProcess(html);

15 }

16

17 private String httpClientProcess() {

18 String html = "";

19 String uri = "http://quote.eastmoney.com/sh600036.html";

20 //1.生成httpclient,相当于该打开一个浏览器

21 CloseableHttpClient httpClient = HttpClients.createDefault();

22 CloseableHttpResponse response = null;

23 //2.创建get请求,相当于在浏览器地址栏输入 网址

24 HttpGet request = new HttpGet(uri);

25 try {

26 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");

27 request.setHeader("accept", "application/json, text/javascript, */*; q=0.01");

28

29// HttpHost proxy = new HttpHost("3.211.17.212", 80);

30// RequestConfig config = RequestConfig.custom().setProxy(proxy).build();

31// request.setConfig(config);

32

33 //3.执行get请求,相当于在输入地址栏后敲回车键

34 response = httpClient.execute(request);

35

36 //4.判断响应状态为200,进行处理

37 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

38 //5.获取响应内容

39 HttpEntity httpEntity = response.getEntity();

40 html = EntityUtils.toString(httpEntity, "utf-8");

41 logger.info("访问{} 成功,返回页面数据{}", uri, html);

42 } else {

43 //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略

44 logger.info("访问{},返回状态不是200", uri);

45 logger.info(EntityUtils.toString(response.getEntity(), "utf-8"));

46 }

47 } catch (ClientProtocolException e) {

48 e.printStackTrace();

49 } catch (IOException e) {

50 e.printStackTrace();

51 } finally {

52 //6.关闭

53 HttpClientUtils.closeQuietly(response);

54 HttpClientUtils.closeQuietly(httpClient);

55 }

56 return html;

57 }

58

59 private void jsoupProcess(String html) {

60 Document document = Jsoup.parse(html);

61 Element price = document.getElementById("price9");

62 logger.info("股价为:>>> {}", price.text());

63 }

64

65}

66

  运行结果:

  纳尼,股价是“-”?不可能的。

  无法爬取正确结果的原因是因为这个值是在网站上异步加载渲染的,所以无法正常获取。

  2.爬取异步加载数据的java方法

  如何爬取异步加载的数据?通常有两种方法:

  2.1 内置浏览器内核

  内置浏览器就是在爬虫程序中启动一个浏览器内核,让js渲染出来的页面和静态页面一样。常用的内核有

  这里我选择了 Selenium,它是一个模拟浏览器和自动化测试工具。它提供了一组 API 来与真正的浏览器内核交互。当然,爬虫也可以使用它。

  具体方法如下:

  1

2 org.seleniumhq.selenium

3 selenium-java

4 3.141.59

5

6

  要使用 selenium,您需要下载浏览器的驱动程序。根据浏览器的不同,需要下载的驱动也不同。下载地址为:ChromeDriver Mirror

  我用的是谷歌浏览器,所以我下载了对应版本的windows和linux驱动。

  

  

  下载后需要配置到java环境变量中,并指定驱动目录:

  System.getProperties().setProperty("webdriver.chrome.driver", "F:/download/chromedriver_win32_1/chromedriver.exe");

  1Logger logger = LoggerFactory.getLogger(this.getClass());

2

3 public static void main(String[] args) {

4

5 StockPriceSpider stockPriceSpider = new StockPriceSpider();

6 stockPriceSpider.seleniumProcess();

7 }

8

9 private void seleniumProcess() {

10

11 String uri = "http://quote.eastmoney.com/sh600036.html";

12

13 // 设置 chromedirver 的存放位置

14 System.getProperties().setProperty("webdriver.chrome.driver", "F:/download/chromedriver_win32_1/chromedriver.exe");

15

16 // 设置浏览器参数

17 ChromeOptions chromeOptions = new ChromeOptions();

18 chromeOptions.addArguments("--no-sandbox");//禁用沙箱

19 chromeOptions.addArguments("--disable-dev-shm-usage");//禁用开发者shm

20 chromeOptions.addArguments("--headless"); //无头浏览器,这样不会打开浏览器窗口

21 WebDriver webDriver = new ChromeDriver(chromeOptions);

22

23 webDriver.get(uri);

24 WebElement webElements = webDriver.findElement(By.id("price9"));

25 String stockPrice = webElements.getText();

26 logger.info("最新股价为 >>> {}", stockPrice);

27 webDriver.close();

28 }

29

  结果:

  爬取成功!

  2.2 逆向分析法

  反向解析的方法是通过F12找到Ajax异步数据获取的链接,直接调用链接得到json结果,然后直接解析json结果得到想要的数据。

  此方法的关键是找到 Ajax 链接。这个方法我没研究过,有兴趣可以百度下载。稍微在这里。

  3.结束语

  以上就是如何通过selenium-java爬取异步加载的数据。通过这个方法,我写了一个小工具:仓位市值通知系统,每天会根据自己的仓位配置自动计算账户总市值,并发送邮件通知到指定邮箱。

  使用的技术如下:

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线