如何用HTMLUnit提取Udemy网站<div data-module-*>内的HTML元素?
爬取Udemy搜索课程内容的问题
问题背景
我尝试从Udemy爬取Selenium相关课程的内容(如课程缩略图、价格等),使用指定搜索URL。查看网站源码时,发现一个class为ud-app-loader ud-component--search--search的div,代码片段如下:
<div class="ud-main-content"> <div class="ud-app-loader ud-component--search--search" data-module-id="search" data-module-args="{"subsCollectionIds":null,"showSRPRefundNotice":false,"showUserEnrollmentProgress":false,"showCodingExerciseCount":false,"enableLabsInPersonalPlan":false,"enableLectureBottomDrawerOnSRP":false,"showCodingExercisesBadge":false,"enableLectureDiscoveryUnitInUb":false,"disableRelatedTopicsOnSRP":false,"enableActiveLearningElementIcons":false}"></div> </div>
但在浏览器检查窗口中,该div下存在多个对应课程的子div(每个课程对应<div class="popper-module--popper--2BpLn">)。参考类似问题后,我推测数据通过AJAX加载,但无法找到对应的请求URL。
最初计划使用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页面,尚未进行元素过滤,存在以下疑问:
疑问
- 若数据通过AJAX请求加载,如何找到对应的请求URL?后续如何获取该
ud-app-loaderdiv的子元素? - 若并非AJAX加载,实际情况是什么?如何提取该data module中的数据?换用其他工具也可接受。
内容的提问来源于stack exchange,提问作者Abhay Johri
相关产品推荐
相关产品推荐

