java - 如何在 Java 中抓取我想要的 HTML 数据?
问题描述
我正在练习和从网站上抓取数据。我被困在一个网址为https://www.ilan.gov.tr/ilan/kategori/12/iflas-hukuku-davalari?txv=12¤tPage=1的网站中。我想获得 Kurum - İlan Numarası - Şehir ( Corporation - Notice Number - City ) 数据。我认为我无法抓取 div。当我编译包含此代码的代码时div.search-results-header row
它不起作用。我也想获得这个网站的前 20 页。我怎样才能做到这一点?有一堆复杂的代码,所以我将图像添加为附件。如果你至少告诉我我怎样才能得到库鲁姆,我想我可以应付其他人。谢谢你。
但是,这是我正在为项目工作的代码。
公共静态 void main(String[] args) 抛出异常 {
File iflasHukuku = new File("/Users/Berkan/Desktop/Iflas Hukuku.txt");
iflasHukuku.createNewFile();
FileWriter fileWriter = new FileWriter(iflasHukuku);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
final Document document = Jsoup.connect("https://www.ilan.gov.tr/ilan/kategori/12/iflas-hukuku-davalari?txv=12¤tPage=1").get();
for(Element x: document.select(".search-results-table-container container mb-4 ng-tns-c6-3 ng-star-inserted")) {
final String kurumAdi = x.select("div.search-results-header row").text();
System.out.println(kurumAdi);
}
}
解决方案
该网页似乎是 Angular App。因此,您不能简单地使用 Jsoup.connect 抓取 HTML 内容,因为浏览器需要执行 JS 来呈现页面。因此,您必须使用 WebDriver 来加载内容并获取 pageSource 并将其发送给 Jsoup。
看到这个:
import io.github.bonigarcia.wdm.WebDriverManager;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class JSoupTest {
public static void main(String[] args) {
WebDriverManager.chromedriver().setup(); //downloads the driver
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setHeadless(true);
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://www.ilan.gov.tr/ilan/kategori/12/iflas-hukuku-davalari?txv=12¤tPage=1");
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(webDriver -> driver.getPageSource().contains("İlan Açıklaması"));
final Document document = Jsoup.parse(driver.getPageSource());
Elements xx = document.select(".search-results-row");
for (Element x : document.select(".search-results-row")) {
System.out.println(x.text());
//parse it further
}
}
}
所需依赖项:
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>4.2.2</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-support</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
推荐阅读
- javascript - 在类和构造函数中访问 ES6 / ES7 静态类变量
- docker - 每次部署到 bitbucket 时,如何防止 docker 编译库?是否有任何 bitbucket 管道缓存?
- javascript - 如何使用来自多个 API 的多个返回数据来显示 API 数据?
- c# - 是否有用于连接到客户端计算机的连接字符串
- xaml - Stacklayout里面的Stackedlayout绑定IsVisible
- apache-spark - 无法正确按日期排序
- android - 使用 Futures 的 Volley 请求超时
- php - 如何让 Wordpress 后置过滤器(misha_filter_function)过滤标签关联的 CPT 类别
- mysql - 获取给定组的每种产品的最低价格
- delete-file - 如何知道文件来自android的内部或外部存储?