You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
4.1 KiB

package strategy;
import model.Paper;
import com.fasterxml.jackson.databind.ObjectMapper;
import utils.Utils;
import java.util.ArrayList;
import java.util.List;
public class SemanticScholarStrategy extends AbstractCrawlerStrategy {
@Override
public String getPlatformName() {
return "Semantic Scholar";
}
@Override
public boolean supportsUrl(String url) {
return url != null && url.contains("semanticscholar.org");
}
@Override
protected List<Paper> fetchPapers(String url, int count) throws Exception {
List<Paper> papers = new ArrayList<>();
System.out.println("=== 开始使用Semantic Scholar获取论文 ===");
addDelay(1000, 1500);
try {
String response = Utils.sendGetRequest(url);
if (response.isEmpty()) return papers;
ObjectMapper objectMapper = new ObjectMapper();
SemanticScholarResponse apiResponse = objectMapper.readValue(response, SemanticScholarResponse.class);
if (apiResponse != null && apiResponse.getItems() != null) {
int collected = 0;
for (SemanticScholarPaper apiPaper : apiResponse.getItems()) {
if (collected >= count) break;
String title = apiPaper.getTitle();
String paperUrl = apiPaper.getUrl();
String abstractText = apiPaper.getAbstractText();
StringBuilder authorsBuilder = new StringBuilder();
if (apiPaper.getAuthors() != null) {
for (SemanticScholarAuthor author : apiPaper.getAuthors()) {
if (author != null && author.getName() != null) {
if (authorsBuilder.length() > 0) {
authorsBuilder.append(", ");
}
authorsBuilder.append(author.getName());
}
}
}
String authors = authorsBuilder.toString();
if (title == null || title.length() < 5 || paperUrl == null || paperUrl.isEmpty()) continue;
papers.add(new Paper(title, authors, abstractText != null ? abstractText : "", paperUrl, getPlatformName()));
collected++;
}
}
} catch (Exception e) {
System.out.println("Semantic Scholar解析失败: " + e.getMessage());
}
return papers;
}
private static class SemanticScholarResponse {
private List<SemanticScholarPaper> items;
public List<SemanticScholarPaper> getItems() { return items; }
@SuppressWarnings("unused")
public void setItems(List<SemanticScholarPaper> items) { this.items = items; }
}
private static class SemanticScholarPaper {
private String title;
private String url;
private List<SemanticScholarAuthor> authors;
private String abstractText;
public String getTitle() { return title; }
@SuppressWarnings("unused")
public void setTitle(String title) { this.title = title; }
public String getUrl() { return url; }
@SuppressWarnings("unused")
public void setUrl(String url) { this.url = url; }
public List<SemanticScholarAuthor> getAuthors() { return authors; }
@SuppressWarnings("unused")
public void setAuthors(List<SemanticScholarAuthor> authors) { this.authors = authors; }
public String getAbstractText() { return abstractText; }
@SuppressWarnings("unused")
public void setAbstractText(String abstractText) { this.abstractText = abstractText; }
}
private static class SemanticScholarAuthor {
private String name;
public String getName() { return name; }
@SuppressWarnings("unused")
public void setName(String name) { this.name = name; }
}
}