我正在尝试抓取这个网站https://www.dailystrength.org/search?query=aspirin&type=discussion为我拥有的项目获取数据集(使用阿司匹林作为占位符搜索项)。我决定用 Jsoup 做一个爬虫。但问题是帖子是通过 Ajax 请求动态带来的。该请求是使用“显示更多”按钮发出的此按钮会导致问题当显示整个内容时,它应该看起来像这样,带有文本“所有消息已加载”最终结果import java.io.IOException;import java.util.ArrayList;import java.util.logging.Level;import java.util.logging.Logger;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import org.openqa.selenium.*;import org.openqa.selenium.chrome.*;/** * * @author Ahmed */public class Crawler { public static void main(String args[]) { Document search_result; String requested[] = new String[]{"aspirin"/*, "Fentanyl"*/}; ArrayList<Newsfeed_item> threads = new ArrayList(); String query = "https://www.dailystrength.org/search?query="; try { for (int i = 0; i < requested.length; i++) { search_result = Jsoup.connect(query+requested[i]+"&type=discussion").get(); Elements posts = search_result.getElementsByClass("newsfeed__item"); for (Element item : posts) { Elements link=item.getElementsByClass("newsfeed__btn-container posts__discuss-btn"); Newsfeed_item currentItem=new Newsfeed_item(); currentItem.replysLink=link.attr("abs:href"); Document reply_result=Jsoup.connect(currentItem.replysLink).get(); Elements description = reply_result.getElementsByClass("posts__content"); currentItem.description=description.text(); currentItem.subject=requested[i]; System.out.println(currentItem); } } } catch (IOException ex) { Logger.getLogger(Crawler.class.getName()).log(Level.SEVERE, null, ex); } }}这段代码只给了我几个显示的帖子,而不是隐藏的帖子。我知道 JSoup 不能用于此问题,因此我尝试查找 selenium 的来源以显示完整内容并下载它以进行爬网。
1 回答

慕桂英546537
TA贡献1848条经验 获得超10个赞
我将尝试在没有硒的情况下继续这种方法。使用 Web 浏览器的调试器及其网络选项卡,您可以查看浏览器发送的所有请求。
查看单击“显示更多”时发生的情况很有用。您可以看到从该网址加载了下一页: https://www.dailystrength.org/search/ajax?query=aspirin&type=discussion&page=2&_=1549130275261 您可以通过更改参数来获取更多页面page=2
。不幸的是,结果是包含转义 HTML 的 JSON,因此您必须使用一些 JSON 库来解析它,获取 HTML,然后使用 Jsoup 解析它。这会很好,因为这个 JSON 还包含一个变量"has_more":true
,所以你会知道是否有更多内容。
添加回答
举报
0/150
提交
取消