java爬虫抓取网页数据(Java爬虫遇到需要登录的网站,该怎么办呢?)

优采云 发布时间: 2021-09-22 20:12

  java爬虫抓取网页数据(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{

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线