java爬虫抓取网页数据(Java爬虫遇到需要登录的网站,该怎么办呢?)
优采云 发布时间: 2021-09-22 20:12java爬虫抓取网页数据(Java爬虫遇到需要登录的网站,该怎么办呢?)
这是Java爬虫系列的第三篇文章。当Java爬虫遇到网站时,我应该怎么做?在中,我们简要说明了爬虫遇到的登录问题的解决方案。在这篇文章文章中,让我们讨论爬虫遇到的异步数据加载问题,这也是爬虫中的一个常见问题
目前,许多项目是前端和后端分离的项目,这将使异步数据加载问题更加突出,因此当您在爬虫程序中遇到此类问题时,您不必感到惊讶或恐慌。一般来说,解决这些问题有两种方法:
1、有一个内置的浏览器内核
内置的浏览器是在捕获的程序中启动一个浏览器内核,使我们能够获得JS呈现的页面,因此我们与采集静态页面相同。此工具通常以以下三种方式使用:selenium
HtmlUnit
幻影
这些工具可以帮助我们解决异步数据加载的问题,但它们都有缺陷,即效率低且不稳定
2、反分析法
什么是反向分析?我们的JS呈现页面的数据是通过Ajax从后端获得的。我们只需要找到相应的Ajax请求连接,就可以获得所需的数据。反向解析方法的优点是,通过这种方式获得的数据是JSON格式的数据,更便于解析。另一个优点是,与页面相比,界面的变化概率更小。同样,它也有两个缺点。首先,您需要耐心并熟练使用Ajax,因为您需要在大量推送请求中找到所需内容。另一个问题是,您无法对JavaScript呈现的页面执行任何操作
以上是异步数据加载的两种解决方案。为了加深大家的理解以及如何在项目中使用它,我以采集网易新闻为例。网易新闻地址:。使用两种上诉方式获取网易亮点新闻列表。网易的亮点如下:
内置浏览器模式
Selenium是模拟浏览器和进行自动化测试的工具。它提供了一组可以与真正的浏览器内核交互的API。它广泛应用于自动化测试中,通常用于解决爬行时的异步加载问题。要在项目中使用selenium,我们需要做两件事:1、引入selenium的依赖项包并将其添加到pom.xml中
org.seleniumhq.selenium
硒爪哇
3.14 1.59
2、下载相应的驱动程序,如我下载的chromedriver。下载地址为:,下载后,需要将驱动程序的位置写入Java环境变量。例如,我把它直接放在项目下,所以我的代码是:system。Getproperties()。Setproperty(“webdriver.Chrome.Driver”、“chromedriver.Exe”)
完成以上两个步骤后,我们可以编写selenium采集Netease的使用要点。具体代码如下:/**
*Selenium解决了异步数据加载的问题
*
*
*@param-url
*/
public void selenium(字符串url){
//设置chrome服务器的存储位置
System.getProperties().setProperty(“webdriver.chrome.driver”、“chromedriver.exe”)
//设置无头浏览器,使浏览器窗口不会弹出
ChromeOptions ChromeOptions=新的ChromeOptions()
chromeOptions.addArguments(“--headless”)
WebDriver WebDriver=新的ChromeDriver(chromeOptions)
webDriver.get(url)
//获取新闻列表
List webElements=webDriver.findElements(By.xpath(“//div[@class='news\u title']]/h3/a”)
for(WebElement WebElement:webElements){
//提取新闻连接
String article_url=webElement.getAttribute(“href”)
//摘录新闻标题
String title=webElement.getText()
如果(文章url.contains(“”){
System.Out.Println(文章Title:“+Title+”,文章link:“+article\u url”)
}
}
webDriver.close()
}
运行该方法,结果如下:
我们已经使用selenium正确地提取了网易新闻亮点列表
反分析法
反向解析方法是获取到Ajax异步数据的链接,并直接获取新闻数据。如果没有技能,查找Ajax的过程将非常痛苦,因为页面上加载的链接太多。看看网易的网络:
有数百个请求。如何找出哪个请求获得重要的新闻数据?如果你不介意麻烦的话,你可以一个接一个地去,你一定能找到。另一个快速的方法是使用网络的搜索功能。如果您不知道搜索按钮,我在上图中圈出了它。我们可以在新闻中复制一个新闻标题进行搜索,得到结果,如下图所示:
这样,我们可以快速获得重要新闻数据的请求链接。链接为:,访问链接,查看链接返回的数据,如下图所示:
从数据中,我们可以看到我们需要的所有数据都在这里,所以我们只需要解析这些数据。有两种方法可以从这些数据中解析新闻标题和新闻链接,一种是正则表达式,另一种是将数据转换为JSON或list。这里我选择第二种方法,它使用fastjson将返回的数据转换为jsonarray。因此,我们想在pom.xml中引入fastjson和fastjson依赖关系:
阿里巴巴
fastjson
1.2.59
除了引入fastjson依赖项之外,我们还需要在转换之前简单地处理数据。因为当前数据不符合列表的格式,我们需要删除数据回调(以及最后一个)。通过反向分析获取网易亮点的代码如下:/**
*使用反向解析方法解决异步数据加载问题
*
*@param-url
*/
public void httpclientMethod(字符串url)引发IOException{