如何使用 HTMLUnit 从网站源代码中提取 <div data-module-*> 中的 HTML 元素?



我正试图通过搜索通用URL字符串(如下所示),从教育网站Udemy中删除内容(例如课程缩略图、价格等)。该站点的源代码具有类名为"的分区;ud应用程序加载程序ud组件——搜索——搜索";。下面提供了它的片段。

废弃数据的网站(搜索查询为Selenium):Udemy搜索可用的硒课程

<div class="ud-main-content">
<div class="ud-app-loader ud-component--search--search" data-module-id="search" data-module-args="{&quot;subsCollectionIds&quot;:null,&quot;showSRPRefundNotice&quot;:false,&quot;showUserEnrollmentProgress&quot;:false,&quot;showCodingExerciseCount&quot;:false,&quot;enableLabsInPersonalPlan&quot;:false,&quot;enableLectureBottomDrawerOnSRP&quot;:false,&quot;showCodingExercisesBadge&quot;:false,&quot;enableLectureDiscoveryUnitInUb&quot;:false,&quot;disableRelatedTopicsOnSRP&quot;:false,&quot;enableActiveLearningElementIcons&quot;:false}"></div>
</div>

但是相同的<div class=";ud应用程序加载程序ud组件——搜索——搜索"*>在"检查"窗口中看起来有所不同。它下面有多个子分部(每门课程都有关联的CCD_ 1。

现在,由于我现在还不太熟悉前端技术,但我假设(在阅读了一篇关于stackoverflow的类似文章后,用BeautifulSoup抓取"数据模块组")数据是通过AJAX调用获取的。但我甚至无法在页面中找到AJAX URL。

类似的问题:从<div数据模块组=>使用BeautifulSoup

起初,我计划使用Jsoup来抓取内容,但后来发现Jsoup无法获得这样的异步调用。它只是一个HTML解析器,所以我现在使用HTMLUnit。

我的代码实现在这里不会有太大帮助,但仍然添加了它,以供参考。

public class Scraper {
public static void getData(String courseName,String sortType) throws Exception {
String URL="https://www.udemy.com/courses/search/?lang=en&price=price-paid&q="+courseName+
"&ratings=4.5&sort=relevance&sort="+sortType+"&src=ukw";

WebClient client=new WebClient(BrowserVersion.FIREFOX);
client.getOptions().setJavaScriptEnabled(true);
client.getOptions().setCssEnabled(true);
client.getOptions().setThrowExceptionOnScriptError(false);
client.setAjaxController(new NicelyResynchronizingAjaxController());

HtmlPage page=client.getPage(URL);
client.waitForBackgroundJavaScript(50000);
System.out.println(page.asXml());
}
}

我已经在上面的代码中打印了页面,并且没有使用预定义的方法过滤元素,因为我稍后可以这样做。我的首要任务是首先获得所需的HTML页面。

我的疑虑是:

  1. 如果是对AJAX源URL的AJAX调用,那么我可以在页面中的哪里/如何找到该URL。接下来应该采取什么步骤来获得<div class=";ud应用程序加载程序">
  2. 如果不是AJAX,那么它实际上是什么?我如何从这个数据模块中提取数据?如果不是HTMLUnit,而是其他一些工具,那么它也很好

如果有人能帮助我,甚至指导我如何获得解决方案,我将非常高兴。

-Abhay。

所以我听说你试图使用HTMLUnit从Udemy的Selenium课程搜索结果页面中抓取数据,但你很难找到正确的信息。这可能是因为数据是通过AJAX调用动态加载的,所以您需要找到负责进行这些调用的URL。

以下是您可以尝试的:当您在Udemy上执行搜索时,使用浏览器中的开发工具来检查网络请求。查找包含所需数据的请求,并查看URL,看看是否可以调整任何参数以提取更多数据。

一旦找到AJAX源URL,就可以使用HTMLUnit模拟AJAX请求,并从响应中提取所需的信息。

如果你仍然被卡住,可能是数据正在使用不同的机制加载。在这种情况下,您可能需要探索其他抓取工具或技术来获得所需的数据。

最新更新