我正在尝试抓取该网站
https://www.dailystrength.org/search?query=aspirin&type=discussion
获取我拥有的项目的数据集(使用阿司匹林作为占位符搜索项)。
我已决定使用Jsoup制作爬虫。但是问题在于,这些帖子是随Ajax请求动态添加的。 使用“显示更多”按钮
发出请求This button causes the problems
当显示全部内容时,其内容应类似于“所有已加载的消息”
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不能用于此问题,因此我尝试查找硒源以显示完整内容并下载以进行爬网。
我找不到任何来源,并且找到了唯一可以尝试从
进行初步了解的代码https://www.youtube.com/watch?v=g1IbI_qYsDg
给我这个错误
Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.gecko.driver system property; for more information, see https://github.com/mozilla/geckodriver. The latest version can be downloaded from https://github.com/mozilla/geckodriver/releases
at com.google.common.base.Preconditions.checkState(Preconditions.java:847)
at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:134)
at org.openqa.selenium.firefox.GeckoDriverService.access$100(GeckoDriverService.java:44)
at org.openqa.selenium.firefox.GeckoDriverService$Builder.findDefaultExecutable(GeckoDriverService.java:167)
at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:355)
at org.openqa.selenium.firefox.FirefoxDriver.toExecutor(FirefoxDriver.java:190)
at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:147)
at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:125)
at SeleniumTest.main(SeleniumTest.java:14)
C:\Users\Ahmed\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
有任何帮助或示例代码或替代方法吗?我只需要获取整个页面,然后使用我拥有的搜寻器即可。或者制作一个全新的搜寻器,但我找不到代码,然后遇到错误。
答案 0 :(得分:0)
我将尝试继续使用不含硒的方法。 使用网络浏览器的调试器及其“网络”标签,可以浏览浏览器发送的所有请求。
看看单击“显示更多”时发生的情况很有用。您可以看到从该URL加载下一页:
https://www.dailystrength.org/search/ajax?query=aspirin&type=discussion&page=2&_=1549130275261
通过更改参数<prefix>:timestamp
,您可以获得更多页面。不幸的是,结果是JSON包含转义的HTML,因此您必须使用一些JSON库来解析它,获取HTML,然后使用Jsoup对其进行解析。很好,因为此JSON还包含变量page=2
,所以您会知道是否还有更多内容。