java爬虫抓取网页数据(网易要闻如下:内置浏览器Selenium方式是一个模拟浏览器)
优采云 发布时间: 2021-11-07 01:09java爬虫抓取网页数据(网易要闻如下:内置浏览器Selenium方式是一个模拟浏览器)
这是 Java 爬虫系列的第三篇文章。上一篇Java爬虫遇到网站需要登录,怎么办?),我们简单讲解一下爬取时登录问题的解决方法。在这个文章中,我们来谈谈爬取时异步数据加载的问题。这也是爬行中常见的问题。.
现在很多都是前后端分离的项目,这会让数据异步加载的问题更加突出,所以在爬取的时候遇到这样的问题不要惊讶,不要慌。一般来说,这种问题有两种解决方案:
1、内置浏览器内核
内置浏览器就是在爬虫程序中启动一个浏览器内核,这样我们就可以拿到js渲染出来的页面,这样我们就和采集的静态页面一样了。此类常用工具有以下三种:
硒
单位
PhantomJs
这些工具可以帮助我们解决异步数据加载的问题,但它们都有缺陷,即效率低下且不稳定。
2、逆向分析法
什么是逆向分析?我们js渲染页面的数据是通过ajax从后端获取的,我们只需要找到对应的ajax请求连接就可以了,这样我们就得到了我们需要的数据,逆向分析方法的优点是这种方式得到的数据都是json格式的,解析起来也比较方便。另一个优点是界面变化的概率相对于页面来说更小。它也有两个缺点。一是在使用Ajax的时候需要耐心和熟练,因为需要在大的推送请求中找到自己想要的东西,二是对JavaScript渲染的页面无能为力。
以上是异步数据加载的两种解决方案。为了加深大家的理解以及如何在项目中使用,我以采集网易新闻为例。网易新闻地址:. 使用两种申诉方式获取网易新闻的新闻列表。网易新闻如下:
内置浏览器Selenium方式
Selenium 是一种模拟浏览器进行自动化测试的工具。它提供了一组 API 来与真正的浏览器内核进行交互。常用于自动化测试,常用于解决爬虫时的异步加载。如果我们想在我们的项目中使用Selenium,我们需要做两件事:
1、引入Selenium的依赖包并在pom.xml中添加
org.seleniumhq.selenium
硒-java
3.141.59
2、下载对应的驱动,比如我下载的chromedriver。下载地址为:下载后需要将驱动所在的位置写入Java的环境变量中。比如我直接放在项目下,所以我的代码是:
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
完成以上两步后,我们就可以编写和使用Selenium采集网易新闻了。具体代码如下:
/**
* Selenium 解决异步数据加载问题
*
*
* @param url
*/
公共无效硒(字符串网址){
// 设置chromedirver的存储位置
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
// 设置无头浏览器,不弹出浏览器窗口
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver webDriver = new ChromeDriver(chromeOptions);
webDriver.get(url);
// 获取重要新闻列表
List webElements = webDriver.findElements(By.xpath("//div[@class='news_title']/h3/a"));
for (WebElement webElement: webElements) {
// 提取新闻链接
String article_url = webElement.getAttribute("href");
// 提取新闻标题
字符串标题 = webElement.getText();
如果 (article_url.contains("")) {
System.out.println("文章标题:" + title + ",文章链接:" + article_url);
}
}
webDriver.close();
}
运行此方法并得到以下结果:
我们已经使用Selenium正确提取了网易新闻列表。
逆向分析
逆向分析的方法是通过ajax异步获取链接获取数据,直接获取新闻数据。如果没有技巧,找Ajax的过程会很痛苦,因为一个页面加载的链接太多,看看网易新闻的网络:
有数百个请求,我如何找到哪个请求获取新闻数据?不嫌麻烦的话,可以一一上点。你绝对可以找到它们。另一种快速的方法是使用网络的搜索功能。如果你不知道搜索按钮,我在上图中圈出了它。只需在新闻中复制一个新闻标题,然后搜索,即可得到结果,如下图所示:
这样我们就快速获取到了重要新闻数据的请求链接,链接为:访问链接,查看链接返回的数据,如下图:
从数据上可以看出,我们需要的数据都在这里了,所以我们只需要解析这一段数据。从这块数据中解析新闻标题和新闻链接有两种方式,一种是正则表达式,另一种是将数据转换成json或者list。这里我选择第二种方法,使用fastjson将返回的数据转换成JSONArray。所以我们要引入fastjson,并在pom.xml中引入fastjson依赖:
阿里巴巴
fastjson
1.2.59
除了引入fastjson依赖之外,我们还需要对转换前的数据进行简单的处理,因为当前数据不符合list的格式,需要去掉data_callback(也是最后一个)。获取网易新闻的具体逆向分析代码如下:
/**
* 使用逆向分析解决异步数据加载问题
*
* @param url
*/
public void httpclientMethod(String url) 抛出 IOException {