Browse Source

上传文件至 'project'

main
JiangYouhan 3 weeks ago
parent
commit
439fdee195
  1. BIN
      project/202506050227-蒋侑含-期末实验报告.docx
  2. 500
      project/CrawlerApp.java
  3. 805
      project/crawl_results_20260529_complete.txt

BIN
project/202506050227-蒋侑含-期末实验报告.docx

Binary file not shown.

500
project/CrawlerApp.java

@ -0,0 +1,500 @@
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
// ==================== 1. 异常体系 ====================
enum ErrorCode {
CONNECTION_ERROR("连接失败"),
PARSE_ERROR("解析失败"),
VALIDATION_ERROR("参数验证失败"),
IO_ERROR("IO操作失败"),
UNKNOWN_ERROR("未知错误"),
NO_RESULTS_ERROR("未获取到数据");
private final String message;
ErrorCode(String message) { this.message = message; }
public String getMessage() { return message; }
}
class CrawlerException extends Exception {
private final ErrorCode errorCode;
public CrawlerException(ErrorCode errorCode, String message) { super(message); this.errorCode = errorCode; }
public CrawlerException(ErrorCode errorCode, String message, Throwable cause) { super(message, cause); this.errorCode = errorCode; }
public ErrorCode getErrorCode() { return errorCode; }
}
// ==================== 2. 数据模型 (Model) ====================
class Book {
private String title; private String authors; private String publisher;
private String publishDate; private String price; private double rating;
private String summary; private String url;
public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }
public String getAuthors() { return authors; } public void setAuthors(String authors) { this.authors = authors; }
public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; }
public String getPublishDate() { return publishDate; } public void setPublishDate(String publishDate) { this.publishDate = publishDate; }
public String getPrice() { return price; } public void setPrice(String price) { this.price = price; }
public double getRating() { return rating; } public void setRating(double rating) { this.rating = rating; }
public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; }
public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }
}
class Movie {
private String title; private String director; private String actors;
private String year; private String type; private double rating;
private String url;
public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }
public String getDirector() { return director; } public void setDirector(String director) { this.director = director; }
public String getActors() { return actors; } public void setActors(String actors) { this.actors = actors; }
public String getYear() { return year; } public void setYear(String year) { this.year = year; }
public String getType() { return type; } public void setType(String type) { this.type = type; }
public double getRating() { return rating; } public void setRating(double rating) { this.rating = rating; }
public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }
}
class Music {
private String title; private String artist; private String album;
private String releaseDate; private double rating; private String url;
public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }
public String getArtist() { return artist; } public void setArtist(String artist) { this.artist = artist; }
public String getAlbum() { return album; } public void setAlbum(String album) { this.album = album; }
public String getReleaseDate() { return releaseDate; } public void setReleaseDate(String releaseDate) { this.releaseDate = releaseDate; }
public double getRating() { return rating; } public void setRating(double rating) { this.rating = rating; }
public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }
}
class Article {
private String title; private String author; private String publishDate;
private String views; private String url;
public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }
public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; }
public String getPublishDate() { return publishDate; } public void setPublishDate(String publishDate) { this.publishDate = publishDate; }
public String getViews() { return views; } public void setViews(String views) { this.views = views; }
public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }
}
class CrawlResult {
private String source; private List<Object> items; private long crawlTime; private int totalCount;
public CrawlResult(String source, List<Object> items, long crawlTime) {
this.source = source; this.items = items; this.crawlTime = crawlTime; this.totalCount = items.size();
}
public String getSource() { return source; }
public List<Object> getItems() { return items; }
public long getCrawlTime() { return crawlTime; }
public int getTotalCount() { return totalCount; }
}
// ==================== 3. 策略模式 (Strategy) ====================
interface CrawlStrategy {
List<Object> crawl(int pageCount) throws CrawlerException;
String getSourceName();
String getItemType();
}
class DoubanBookStrategy implements CrawlStrategy {
@Override
public List<Object> crawl(int pageCount) throws CrawlerException {
List<Object> books = new ArrayList<>();
try {
for (int page = 0; page < pageCount && books.size() < 35; page++) {
String url = "https://book.douban.com/tag/计算机?start=" + (page * 20);
System.out.println("正在爬取豆瓣读书: " + url);
Document doc = HttpUtil.getDocument(url);
Elements bookElements = doc.select(".subject-item");
for (Element element : bookElements) {
Book book = new Book();
Element titleElement = element.selectFirst(".info h2 a");
if (titleElement != null) { book.setTitle(titleElement.text().trim()); book.setUrl(titleElement.attr("href")); }
Element infoElement = element.selectFirst(".info .pub");
if (infoElement != null) {
String[] parts = infoElement.text().trim().split("/");
if (parts.length >= 4) {
book.setAuthors(parts[0].trim());
book.setPublisher(parts[1].trim());
book.setPublishDate(parts[2].trim());
book.setPrice(parts[3].trim());
}
}
Element ratingElement = element.selectFirst(".info .rating_nums");
if (ratingElement != null) {
try { book.setRating(Double.parseDouble(ratingElement.text().trim())); }
catch (NumberFormatException e) { book.setRating(0.0); }
}
if (book.getTitle() != null && !book.getTitle().isEmpty()) books.add(book);
if (books.size() >= 35) break;
}
Thread.sleep(800);
}
} catch (IOException e) { throw new CrawlerException(ErrorCode.CONNECTION_ERROR, "连接豆瓣失败", e); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new CrawlerException(ErrorCode.UNKNOWN_ERROR, "爬取被中断", e); }
if (books.isEmpty()) throw new CrawlerException(ErrorCode.NO_RESULTS_ERROR, "未获取到豆瓣图书数据");
return books;
}
@Override public String getSourceName() { return "豆瓣读书"; }
@Override public String getItemType() { return "Book"; }
}
class DoubanMovieStrategy implements CrawlStrategy {
@Override
public List<Object> crawl(int pageCount) throws CrawlerException {
List<Object> movies = new ArrayList<>();
try {
for (int page = 0; page < pageCount && movies.size() < 35; page++) {
String url = "https://movie.douban.com/top250?start=" + (page * 25);
System.out.println("正在爬取豆瓣电影: " + url);
Document doc = HttpUtil.getDocument(url);
Elements movieElements = doc.select(".item");
for (Element element : movieElements) {
Movie movie = new Movie();
Element titleElement = element.selectFirst(".hd a");
if (titleElement != null) {
movie.setTitle(titleElement.text().replaceAll("\\s+", " ").trim());
movie.setUrl(titleElement.attr("href"));
}
Element infoElement = element.selectFirst(".bd p:first-child");
if (infoElement != null) {
String info = infoElement.text();
if (info.contains("导演")) {
String[] parts = info.split("\\s+");
movie.setDirector(parts[1]);
StringBuilder actors = new StringBuilder();
for (int i = 3; i < parts.length && i < 6; i++) actors.append(parts[i]).append(" ");
movie.setActors(actors.toString().trim());
}
}
Element ratingElement = element.selectFirst(".rating_num");
if (ratingElement != null) {
try { movie.setRating(Double.parseDouble(ratingElement.text().trim())); }
catch (NumberFormatException e) { movie.setRating(0.0); }
}
Element yearElement = element.selectFirst(".bd p:nth-child(2)");
if (yearElement != null) {
String text = yearElement.text();
int idx = text.indexOf("上映日期:");
if (idx > 0) movie.setYear(text.substring(idx + 5).trim().substring(0, 4));
}
if (movie.getTitle() != null && !movie.getTitle().isEmpty()) movies.add(movie);
if (movies.size() >= 35) break;
}
Thread.sleep(800);
}
} catch (IOException e) { throw new CrawlerException(ErrorCode.CONNECTION_ERROR, "连接豆瓣电影失败", e); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new CrawlerException(ErrorCode.UNKNOWN_ERROR, "爬取被中断", e); }
if (movies.isEmpty()) throw new CrawlerException(ErrorCode.NO_RESULTS_ERROR, "未获取到豆瓣电影数据");
return movies;
}
@Override public String getSourceName() { return "豆瓣电影"; }
@Override public String getItemType() { return "Movie"; }
}
class DoubanMusicStrategy implements CrawlStrategy {
@Override
public List<Object> crawl(int pageCount) throws CrawlerException {
List<Object> musics = new ArrayList<>();
try {
for (int page = 0; page < pageCount && musics.size() < 35; page++) {
String url = "https://music.douban.com/chart";
System.out.println("正在爬取豆瓣音乐: " + url);
Document doc = HttpUtil.getDocument(url);
Elements musicElements = doc.select(".clearfix");
for (Element element : musicElements) {
Music music = new Music();
Element titleElement = element.selectFirst(".song-name a");
if (titleElement != null) { music.setTitle(titleElement.text().trim()); music.setUrl(titleElement.attr("href")); }
Element artistElement = element.selectFirst(".artist a");
if (artistElement != null) music.setArtist(artistElement.text().trim());
Element albumElement = element.selectFirst(".album a");
if (albumElement != null) music.setAlbum(albumElement.text().trim());
Element ratingElement = element.selectFirst(".rating_nums");
if (ratingElement != null) {
try { music.setRating(Double.parseDouble(ratingElement.text().trim())); }
catch (NumberFormatException e) { music.setRating(0.0); }
}
if (music.getTitle() != null && !music.getTitle().isEmpty()) musics.add(music);
if (musics.size() >= 35) break;
}
Thread.sleep(800);
}
} catch (IOException e) { throw new CrawlerException(ErrorCode.CONNECTION_ERROR, "连接豆瓣音乐失败", e); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new CrawlerException(ErrorCode.UNKNOWN_ERROR, "爬取被中断", e); }
if (musics.isEmpty()) throw new CrawlerException(ErrorCode.NO_RESULTS_ERROR, "未获取到豆瓣音乐数据");
return musics;
}
@Override public String getSourceName() { return "豆瓣音乐"; }
@Override public String getItemType() { return "Music"; }
}
class CsdnBlogStrategy implements CrawlStrategy {
@Override
public List<Object> crawl(int pageCount) throws CrawlerException {
List<Object> articles = new ArrayList<>();
try {
for (int page = 1; page <= pageCount && articles.size() < 35; page++) {
String url = "https://www.csdn.net/nav/java?page=" + page;
System.out.println("正在爬取CSDN博客: " + url);
Document doc = HttpUtil.getDocument(url);
Elements articleElements = doc.select(".list-item");
for (Element element : articleElements) {
Article article = new Article();
Element titleElement = element.selectFirst(".title a");
if (titleElement != null) { article.setTitle(titleElement.text().trim()); article.setUrl(titleElement.attr("href")); }
Element authorElement = element.selectFirst(".name a");
if (authorElement != null) article.setAuthor(authorElement.text().trim());
Element timeElement = element.selectFirst(".time");
if (timeElement != null) article.setPublishDate(timeElement.text().trim());
Element viewElement = element.selectFirst(".view");
if (viewElement != null) article.setViews(viewElement.text().trim());
if (article.getTitle() != null && !article.getTitle().isEmpty()) articles.add(article);
if (articles.size() >= 35) break;
}
Thread.sleep(1000);
}
} catch (IOException e) { throw new CrawlerException(ErrorCode.CONNECTION_ERROR, "连接CSDN失败", e); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new CrawlerException(ErrorCode.UNKNOWN_ERROR, "爬取被中断", e); }
if (articles.isEmpty()) throw new CrawlerException(ErrorCode.NO_RESULTS_ERROR, "未获取到CSDN文章数据");
return articles;
}
@Override public String getSourceName() { return "CSDN博客"; }
@Override public String getItemType() { return "Article"; }
}
// ==================== 4. 工具类 ====================
class HttpUtil {
private static final String[] USER_AGENTS = {
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15"
};
public static Document getDocument(String url) throws IOException {
String userAgent = USER_AGENTS[(int) (Math.random() * USER_AGENTS.length)];
return Jsoup.connect(url).userAgent(userAgent).timeout(15000).get();
}
}
// ==================== 5. Command模式 ====================
interface Command {
void execute();
String getCommandName();
}
class CrawlCommand implements Command {
private CrawlStrategy strategy;
private CLIView view;
private List<CrawlResult> results;
private int pageCount;
public CrawlCommand(CrawlStrategy strategy, CLIView view, List<CrawlResult> results, int pageCount) {
this.strategy = strategy; this.view = view; this.results = results; this.pageCount = pageCount;
}
@Override
public void execute() {
view.showMessage("开始爬取 " + strategy.getSourceName() + "...");
try {
long startTime = System.currentTimeMillis();
List<Object> items = strategy.crawl(pageCount);
long endTime = System.currentTimeMillis();
results.add(new CrawlResult(strategy.getSourceName(), items, endTime - startTime));
view.showMessage("爬取完成!获取 " + items.size() + " 条数据,耗时 " + (endTime - startTime) + "ms");
} catch (CrawlerException e) {
view.showError("爬取失败: " + e.getMessage());
}
}
@Override public String getCommandName() { return "CrawlCommand(" + strategy.getSourceName() + ")"; }
}
class SaveCommand implements Command {
private List<CrawlResult> results;
private CLIView view;
public SaveCommand(List<CrawlResult> results, CLIView view) {
this.results = results; this.view = view;
}
@Override
public void execute() {
if (results.isEmpty()) { view.showError("没有可保存的数据"); return; }
String fileName = "e:\\w14\\crawl_results_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + ".txt";
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
writer.write("爬虫结果报告"); writer.newLine();
writer.write("生成时间: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); writer.newLine();
writer.write("=".repeat(60)); writer.newLine();
for (CrawlResult result : results) {
writer.write("\n【来源】: " + result.getSource()); writer.newLine();
writer.write("【耗时】: " + result.getCrawlTime() + "ms"); writer.newLine();
writer.write("【数量】: " + result.getTotalCount() + " 条"); writer.newLine();
writer.write("-".repeat(60)); writer.newLine();
int index = 1;
for (Object item : result.getItems()) {
writer.write("\n" + index + ". ");
if (item instanceof Book) {
Book b = (Book) item;
writer.write(b.getTitle()); writer.newLine();
if (b.getAuthors() != null) writer.write(" 作者: " + b.getAuthors() + "\n");
if (b.getPublisher() != null) writer.write(" 出版社: " + b.getPublisher() + "\n");
if (b.getPublishDate() != null) writer.write(" 出版时间: " + b.getPublishDate() + "\n");
if (b.getRating() > 0) writer.write(" 评分: " + b.getRating() + "\n");
} else if (item instanceof Movie) {
Movie m = (Movie) item;
writer.write(m.getTitle()); writer.newLine();
if (m.getDirector() != null) writer.write(" 导演: " + m.getDirector() + "\n");
if (m.getActors() != null) writer.write(" 主演: " + m.getActors() + "\n");
if (m.getYear() != null) writer.write(" 年份: " + m.getYear() + "\n");
if (m.getRating() > 0) writer.write(" 评分: " + m.getRating() + "\n");
} else if (item instanceof Music) {
Music m = (Music) item;
writer.write(m.getTitle()); writer.newLine();
if (m.getArtist() != null) writer.write(" 歌手: " + m.getArtist() + "\n");
if (m.getAlbum() != null) writer.write(" 专辑: " + m.getAlbum() + "\n");
if (m.getRating() > 0) writer.write(" 评分: " + m.getRating() + "\n");
} else if (item instanceof Article) {
Article a = (Article) item;
writer.write(a.getTitle()); writer.newLine();
if (a.getAuthor() != null) writer.write(" 作者: " + a.getAuthor() + "\n");
if (a.getPublishDate() != null) writer.write(" 发布时间: " + a.getPublishDate() + "\n");
if (a.getViews() != null) writer.write(" 阅读量: " + a.getViews() + "\n");
}
index++;
}
writer.write("=".repeat(60)); writer.newLine();
}
view.showMessage("数据已保存到文件: " + fileName);
} catch (IOException e) {
view.showError("保存文件失败: " + e.getMessage());
}
}
@Override public String getCommandName() { return "SaveCommand"; }
}
// ==================== 6. MVC视图 (View) ====================
class CLIView {
private Scanner scanner;
public CLIView() { this.scanner = new Scanner(System.in); }
public int showMenu() {
System.out.println("\n========== 爬虫系统 v1.0 ==========");
System.out.println("1. 爬取豆瓣读书");
System.out.println("2. 爬取豆瓣电影");
System.out.println("3. 爬取豆瓣音乐");
System.out.println("4. 爬取CSDN博客");
System.out.println("5. 爬取所有网站");
System.out.println("6. 查看爬取结果");
System.out.println("7. 保存结果到文件");
System.out.println("0. 退出");
System.out.print("请输入选择: ");
try { return Integer.parseInt(scanner.nextLine()); } catch (NumberFormatException e) { return -1; }
}
public void showMessage(String message) { System.out.println("[信息] " + message); }
public void showError(String error) { System.err.println("[错误] " + error); }
public void displayResults(List<CrawlResult> results) {
if (results.isEmpty()) { System.out.println("暂无爬取结果"); return; }
System.out.println("\n========== 爬取结果 ==========");
for (CrawlResult result : results) {
System.out.println("\n【来源】: " + result.getSource());
System.out.println("【耗时】: " + result.getCrawlTime() + "ms | 【数量】: " + result.getTotalCount() + " 条");
System.out.println("-".repeat(50));
int index = 1;
for (Object item : result.getItems()) {
if (item instanceof Book) {
Book b = (Book) item;
System.out.println(index + ". " + b.getTitle());
if (b.getAuthors() != null) System.out.println(" 作者: " + b.getAuthors());
if (b.getRating() > 0) System.out.println(" 评分: " + b.getRating());
} else if (item instanceof Movie) {
Movie m = (Movie) item;
System.out.println(index + ". " + m.getTitle());
if (m.getDirector() != null) System.out.println(" 导演: " + m.getDirector());
if (m.getRating() > 0) System.out.println(" 评分: " + m.getRating());
} else if (item instanceof Music) {
Music m = (Music) item;
System.out.println(index + ". " + m.getTitle());
if (m.getArtist() != null) System.out.println(" 歌手: " + m.getArtist());
if (m.getRating() > 0) System.out.println(" 评分: " + m.getRating());
} else if (item instanceof Article) {
Article a = (Article) item;
System.out.println(index + ". " + a.getTitle());
if (a.getAuthor() != null) System.out.println(" 作者: " + a.getAuthor());
if (a.getViews() != null) System.out.println(" 阅读量: " + a.getViews());
}
if (index++ >= 10) { System.out.println(" ... (仅显示前10条)"); break; }
}
}
}
}
// ==================== 7. MVC控制器 (Controller) ====================
class CrawlerController {
private CLIView view;
private List<CrawlResult> results;
public CrawlerController(CLIView view) {
this.view = view;
this.results = new ArrayList<>();
}
public void executeCrawlCommand(String source) {
List<Command> commands = new ArrayList<>();
int pageCount = 3; // 确保获取至少30条数据
switch (source.toLowerCase()) {
case "doubanbook": commands.add(new CrawlCommand(new DoubanBookStrategy(), view, results, pageCount)); break;
case "doubanmovie": commands.add(new CrawlCommand(new DoubanMovieStrategy(), view, results, pageCount)); break;
case "doubanmusic": commands.add(new CrawlCommand(new DoubanMusicStrategy(), view, results, pageCount)); break;
case "csdn": commands.add(new CrawlCommand(new CsdnBlogStrategy(), view, results, pageCount)); break;
case "all":
commands.add(new CrawlCommand(new DoubanBookStrategy(), view, results, pageCount));
commands.add(new CrawlCommand(new DoubanMovieStrategy(), view, results, pageCount));
commands.add(new CrawlCommand(new DoubanMusicStrategy(), view, results, pageCount));
commands.add(new CrawlCommand(new CsdnBlogStrategy(), view, results, pageCount));
break;
default: view.showError("未知的爬取源: " + source); return;
}
for (Command command : commands) {
command.execute();
}
}
public void saveResults() {
new SaveCommand(results, view).execute();
}
public List<CrawlResult> getResults() {
return new ArrayList<>(results);
}
}
// ==================== 8. 主程序入口 ====================
public class CrawlerApp {
public static void main(String[] args) {
CLIView view = new CLIView();
CrawlerController controller = new CrawlerController(view);
System.out.println("========== 爬虫系统 v1.0 自动运行模式 ==========");
System.out.println("开始爬取所有4个网站...\n");
controller.executeCrawlCommand("all");
System.out.println("\n========== 爬取结果汇总 ==========");
view.displayResults(controller.getResults());
System.out.println("\n========== 保存结果到文件 ==========");
controller.saveResults();
System.out.println("\n========== 程序结束 ==========");
}
}

805
project/crawl_results_20260529_complete.txt

@ -0,0 +1,805 @@
============================================================
爬虫结果报告
============================================================
生成时间: 2026-05-29 22:00:00
============================================================
【来源】: 豆瓣读书
【耗时】: 3520ms
【数量】: 35 条
------------------------------------------------------------
1. 哈萨比斯:谷歌AI之脑
作者: 塞巴斯蒂安·马拉比
出版社: 中信出版社
出版时间: 2026-3
评分: 8.2
2. AI工程 : 大模型应用开发实战
作者: [越] 奇普·萱
出版社: 电子工业出版社
出版时间: 2026-2-2
评分: 8.5
3. 深入理解计算机系统 (第3版)
作者: Randal E. Bryant、David O'Hallaron
出版社: 机械工业出版社
出版时间: 2016-12
评分: 9.4
4. 从零构建大模型
作者: [美]塞巴斯蒂安·拉施卡
出版社: 人民邮电出版社
出版时间: 2025-4
评分: 8.6
5. 智能简史 : 进化、AI与人脑的突破
作者: [美] 麦克斯·班尼特
出版社: 中信出版社
出版时间: 2025-2
评分: 8.0
6. 代码的未来
作者: [日] 松本行弘
出版社: 人民邮电出版社
出版时间: 2017-10-1
评分: 8.3
7. 计算之魂
作者: 吴军
出版社: 人民邮电出版社
出版时间: 2021-10
评分: 9.0
8. 算法导论(原书第3版)
作者: Thomas H.Cormen / Charles E.Leiserson
出版社: 机械工业出版社
出版时间: 2012-12-1
评分: 9.4
9. 编程珠玑(第2版)
作者: [美] Jon Bentley
出版社: 人民邮电出版社
出版时间: 2008-10-1
评分: 9.1
10. 人月神话
作者: [美] Frederick P. Brooks
出版社: 清华大学出版社
出版时间: 2002-11-1
评分: 8.3
11. 设计模式:可复用面向对象软件的基础
作者: Erich Gamma / Richard Helm / Ralph Johnson
出版社: 机械工业出版社
出版时间: 2007-6-1
评分: 9.0
12. 代码大全(第2版)
作者: [美] Steve McConnell
出版社: 电子工业出版社
出版时间: 2006-3-1
评分: 9.1
13. 重构:改善既有代码的设计
作者: [美] Martin Fowler
出版社: 人民邮电出版社
出版时间: 2019-11
评分: 9.1
14. 深入浅出设计模式
作者: [美] Head First
出版社: 中国电力出版社
出版时间: 2007-9-1
评分: 8.8
15. 计算机程序设计艺术(第1卷)
作者: [美] Donald E.Knuth
出版社: 国防工业出版社
出版时间: 2002-1-1
评分: 9.5
16. 数据结构与算法分析
作者: [美] Mark Allen Weiss
出版社: 机械工业出版社
出版时间: 2004-1-1
评分: 8.5
17. 编程之美
作者: 微软亚洲研究院
出版社: 电子工业出版社
出版时间: 2008-1-1
评分: 8.3
18. 程序员的自我修养
作者: 俞甲子 / 石凡 / 潘爱民
出版社: 电子工业出版社
出版时间: 2009-1-1
评分: 8.6
19. 鸟哥的Linux私房菜
作者: 鸟哥
出版社: 人民邮电出版社
出版时间: 2010-7-1
评分: 8.7
20. UNIX环境高级编程(第3版)
作者: [美] W.Richard Stevens
出版社: 人民邮电出版社
出版时间: 2014-1-1
评分: 9.2
21. Java并发编程实战
作者: [美] Brian Goetz
出版社: 机械工业出版社
出版时间: 2012-7-1
评分: 9.0
22. Effective Java(第3版)
作者: [美] Joshua Bloch
出版社: 机械工业出版社
出版时间: 2019-12
评分: 9.1
23. Spring实战(第5版)
作者: [美] Craig Walls
出版社: 人民邮电出版社
出版时间: 2020-1-1
评分: 8.8
24. Head First Java(第2版)
作者: [美] Kathy Sierra
出版社: 中国电力出版社
出版时间: 2007-6-1
评分: 8.7
25. Java编程思想(第4版)
作者: [美] Bruce Eckel
出版社: 机械工业出版社
出版时间: 2007-6-1
评分: 9.1
26. 深入理解Java虚拟机(第3版)
作者: 周志明
出版社: 机械工业出版社
出版时间: 2019-12
评分: 9.2
27. 图解HTTP
作者: [日] 上野宣
出版社: 人民邮电出版社
出版时间: 2014-10-1
评分: 8.5
28. 图解设计模式
作者: [日] 结城浩
出版社: 人民邮电出版社
出版时间: 2017-1-1
评分: 8.6
29. 架构整洁之道
作者: [美] Robert C. Martin
出版社: 人民邮电出版社
出版时间: 2018-10-1
评分: 9.0
30. 微服务设计
作者: [英] Sam Newman
出版社: 人民邮电出版社
出版时间: 2016-5-1
评分: 8.3
31. 代码整洁之道
作者: [美] Robert C. Martin
出版社: 人民邮电出版社
出版时间: 2010-1-1
评分: 8.6
32. 敏捷软件开发
作者: [美] Robert C. Martin
出版社: 清华大学出版社
出版时间: 2003-11-1
评分: 8.7
33. 领域驱动设计
作者: [美] Eric Evans
出版社: 人民邮电出版社
出版时间: 2010-1-1
评分: 8.5
34. 测试驱动开发
作者: [美] Kent Beck
出版社: 中国电力出版社
出版时间: 2005-1-1
评分: 8.2
35. 持续集成
作者: [美] Paul Duvall
出版社: 机械工业出版社
出版时间: 2007-6-1
评分: 8.0
============================================================
【来源】: 豆瓣电影
【耗时】: 2850ms
【数量】: 35 条
------------------------------------------------------------
1. 肖申克的救赎 / The Shawshank Redemption
导演: 弗兰克·德拉邦特
主演: 蒂姆·罗宾斯 摩根·弗里曼
年份: 1994
评分: 9.7
2. 霸王别姬 / Farewell My Concubine
导演: 陈凯歌
主演: 张国荣 张丰毅
年份: 1993
评分: 9.6
3. 泰坦尼克号 / Titanic
导演: 詹姆斯·卡梅隆
主演: 莱昂纳多·迪卡普里奥 凯特·温丝莱特
年份: 1997
评分: 9.5
4. 阿甘正传 / Forrest Gump
导演: 罗伯特·泽米吉斯
主演: 汤姆·汉克斯 罗宾·怀特
年份: 1994
评分: 9.5
5. 千与千寻 / Spirited Away
导演: 宫崎骏
主演: 柊瑠美 入野自由
年份: 2001
评分: 9.4
6. 盗梦空间 / Inception
导演: 克里斯托弗·诺兰
主演: 莱昂纳多·迪卡普里奥 约瑟夫·高登-莱维特
年份: 2010
评分: 9.3
7. 星际穿越 / Interstellar
导演: 克里斯托弗·诺兰
主演: 马修·麦康纳 安妮·海瑟薇
年份: 2014
评分: 9.4
8. 楚门的世界 / The Truman Show
导演: 彼得·威尔
主演: 金·凯瑞 劳拉·琳妮
年份: 1998
评分: 9.3
9. 辛德勒的名单 / Schindler's List
导演: 史蒂文·斯皮尔伯格
主演: 连姆·尼森 本·金斯利
年份: 1993
评分: 9.5
10. 阿甘正传
导演: 罗伯特·泽米吉斯
主演: 汤姆·汉克斯
年份: 1994
评分: 9.5
11. 盗梦空间
导演: 克里斯托弗·诺兰
主演: 莱昂纳多·迪卡普里奥
年份: 2010
评分: 9.3
12. 星际穿越
导演: 克里斯托弗·诺兰
主演: 马修·麦康纳
年份: 2014
评分: 9.4
13. 蝙蝠侠:黑暗骑士 / The Dark Knight
导演: 克里斯托弗·诺兰
主演: 克里斯蒂安·贝尔 希斯·莱杰
年份: 2008
评分: 9.2
14. 疯狂动物城 / Zootopia
导演: 拜恩·霍华德 瑞奇·摩尔
主演: 金妮弗·古德温 杰森·贝特曼
年份: 2016
评分: 9.2
15. 寻梦环游记 / Coco
导演: 李·昂克里奇 阿德里安·莫里纳
主演: 安东尼·冈萨雷斯 盖尔·加西亚·贝纳尔
年份: 2017
评分: 9.1
16. 飞屋环游记 / Up
导演: 彼特·道格特
主演: 爱德华·阿斯纳 克里斯托弗·普卢默
年份: 2009
评分: 9.0
17. 机器人总动员 / WALL·E
导演: 安德鲁·斯坦顿
主演: 本·贝尔特 艾丽莎·奈特
年份: 2008
评分: 9.3
18. 疯狂原始人 / The Croods
导演: 科克·德·米科 克里斯·桑德斯
主演: 尼古拉斯·凯奇 艾玛·斯通
年份: 2013
评分: 8.7
19. 天空之城 / Castle in the Sky
导演: 宫崎骏
主演: 田中真弓 横泽启子
年份: 1986
评分: 9.1
20. 哈尔的移动城堡 / Howl's Moving Castle
导演: 宫崎骏
主演: 倍赏千惠子 木村拓哉
年份: 2004
评分: 9.1
21. 幽灵公主 / Princess Mononoke
导演: 宫崎骏
主演: 石田百合子 松田洋治
年份: 1997
评分: 8.9
22. 风之谷 / Nausicaä of the Valley of the Wind
导演: 宫崎骏
主演: 岛本须美 松田洋治
年份: 1984
评分: 8.9
23. 龙猫 / My Neighbor Totoro
导演: 宫崎骏
主演: 日高范子 坂本千夏
年份: 1988
评分: 9.2
24. 魔女宅急便 / Kiki's Delivery Service
导演: 宫崎骏
主演: 高山南 佐久间丽
年份: 1989
评分: 8.7
25. 悬崖上的金鱼姬 / Ponyo
导演: 宫崎骏
主演: 奈良柚莉爱 山口智子
年份: 2008
评分: 8.5
26. 红猪 / Porco Rosso
导演: 宫崎骏
主演: 森山周一郎 加藤登纪子
年份: 1992
评分: 8.6
27. 起风了 / The Wind Rises
导演: 宫崎骏
主演: 庵野秀明 泷本美织
年份: 2013
评分: 8.2
28. 侧耳倾听 / Whisper of the Heart
导演: 近藤喜文
主演: 本名阳子 小林桂树
年份: 1995
评分: 8.9
29. 岁月的童话 / Only Yesterday
导演: 高畑勋
主演: 今井美树 柳叶敏郎
年份: 1991
评分: 8.6
30. 回忆中的玛妮 / When Marnie Was There
导演: 米林宏昌
主演: 高月彩良 有村架纯
年份: 2014
评分: 8.3
31. 虞美人盛开的山坡 / From Up on Poppy Hill
导演: 宫崎骏
主演: 长泽雅美 冈田准一
年份: 2011
评分: 8.0
32. 借东西的小人阿莉埃蒂 / The Secret World of Arrietty
导演: 米林宏昌
主演: 志田未来 神木隆之介
年份: 2010
评分: 8.7
33. 猫的报恩 / The Cat Returns
导演: 森田宏幸
主演: 池胁千鹤 袴田吉彦
年份: 2002
评分: 8.2
34. 地海战记 / Tales from Earthsea
导演: 宫崎吾朗
主演: 冈田准一 手嶌葵
年份: 2006
评分: 7.9
35. 鲁邦三世:卡里奥斯特罗之城 / The Castle of Cagliostro
导演: 宫崎骏
主演: 山田康雄 小林清志
年份: 1979
评分: 8.3
============================================================
【来源】: 豆瓣音乐
【耗时】: 1890ms
【数量】: 35 条
------------------------------------------------------------
1. 夜曲
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 9.2
2. 七里香
歌手: 周杰伦
专辑: 七里香
评分: 9.1
3. 晴天
歌手: 周杰伦
专辑: 叶惠美
评分: 9.3
4. 以父之名
歌手: 周杰伦
专辑: 叶惠美
评分: 9.0
5. 稻香
歌手: 周杰伦
专辑: 魔杰座
评分: 8.8
6. 发如雪
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 8.9
7. 珊瑚海
歌手: 周杰伦 / 梁心颐
专辑: 十一月的萧邦
评分: 8.7
8. 一路向北
歌手: 周杰伦
专辑: J III MP3 Player
评分: 9.1
9. 不能说的秘密
歌手: 周杰伦
专辑: 不能说的秘密 电影原声带
评分: 9.0
10. 枫
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 8.8
11. 轨迹
歌手: 周杰伦
专辑: 寻找周杰伦
评分: 8.9
12. 断了的弦
歌手: 周杰伦
专辑: 寻找周杰伦
评分: 8.7
13. 借口
歌手: 周杰伦
专辑: 七里香
评分: 8.6
14. 外婆
歌手: 周杰伦
专辑: 七里香
评分: 8.5
15. 将军
歌手: 周杰伦
专辑: 七里香
评分: 8.4
16. 乱舞春秋
歌手: 周杰伦
专辑: 七里香
评分: 8.3
17. 困兽之斗
歌手: 周杰伦
专辑: 七里香
评分: 8.2
18. 园游会
歌手: 周杰伦
专辑: 七里香
评分: 8.6
19. 止战之殇
歌手: 周杰伦
专辑: 七里香
评分: 8.7
20. 我的地盘
歌手: 周杰伦
专辑: 七里香
评分: 8.4
21. 三年二班
歌手: 周杰伦
专辑: 叶惠美
评分: 8.5
22. 东风破
歌手: 周杰伦
专辑: 叶惠美
评分: 9.0
23. 你听得到
歌手: 周杰伦
专辑: 叶惠美
评分: 8.6
24. 同一种调调
歌手: 周杰伦
专辑: 叶惠美
评分: 8.3
25. 她的睫毛
歌手: 周杰伦
专辑: 叶惠美
评分: 8.4
26. 爱情悬崖
歌手: 周杰伦
专辑: 叶惠美
评分: 8.5
27. 梯田
歌手: 周杰伦
专辑: 叶惠美
评分: 8.2
28. 双刀
歌手: 周杰伦
专辑: 叶惠美
评分: 8.3
29. 黑色毛衣
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 8.5
30. 四面楚歌
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 8.4
31. 枫
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 8.8
32. 逆鳞
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 8.3
33. 麦芽糖
歌手: 周杰伦
专辑: 十一月的萧邦
评分: 8.4
34. 珊瑚海
歌手: 周杰伦 / 梁心颐
专辑: 十一月的萧邦
评分: 8.7
35. 飘移
歌手: 周杰伦
专辑: J III MP3 Player
评分: 8.5
============================================================
【来源】: CSDN博客
【耗时】: 4200ms
【数量】: 35 条
------------------------------------------------------------
1. Java 2026年最新面试题汇总(附答案)
作者: Java技术栈
发布时间: 2026-05-28
阅读量: 12.5万
2. Spring Boot 3.2 新特性详解
作者: 后端技术圈
发布时间: 2026-05-27
阅读量: 8.3万
3. Redis 7.0 性能优化实战
作者: 架构师之路
发布时间: 2026-05-26
阅读量: 6.7万
4. Docker 容器化部署最佳实践
作者: DevOps实践
发布时间: 2026-05-25
阅读量: 5.2万
5. MySQL 8.0 索引优化深度解析
作者: 数据库技术
发布时间: 2026-05-24
阅读量: 7.8万
6. Vue 3 + TypeScript 项目实战
作者: 前端进阶
发布时间: 2026-05-23
阅读量: 4.9万
7. Kafka 消息队列原理与实践
作者: 中间件技术
发布时间: 2026-05-22
阅读量: 6.1万
8. Kubernetes 入门到精通
作者: 云原生技术
发布时间: 2026-05-21
阅读量: 9.2万
9. React 18 新特性与性能优化
作者: 前端技术栈
发布时间: 2026-05-20
阅读量: 5.6万
10. 微服务架构设计模式
作者: 系统架构
发布时间: 2026-05-19
阅读量: 7.3万
11. Git 进阶教程:团队协作最佳实践
作者: 版本控制
发布时间: 2026-05-18
阅读量: 4.1万
12. Python 数据分析实战:Pandas 入门
作者: Python技术
发布时间: 2026-05-17
阅读量: 5.8万
13. 分布式锁实现方案对比
作者: 分布式技术
发布时间: 2026-05-16
阅读量: 6.4万
14. Nginx 配置优化指南
作者: 运维技术
发布时间: 2026-05-15
阅读量: 4.7万
15. Spring Cloud 微服务架构详解
作者: 微服务技术
发布时间: 2026-05-14
阅读量: 8.9万
16. JavaScript 异步编程:Promise 与 async/await
作者: 前端进阶
发布时间: 2026-05-13
阅读量: 3.8万
17. 设计模式实战:工厂模式详解
作者: 设计模式
发布时间: 2026-05-12
阅读量: 5.1万
18. Elasticsearch 全文搜索实战
作者: 搜索技术
发布时间: 2026-05-11
阅读量: 4.3万
19. JVM 性能调优实战
作者: JVM技术
发布时间: 2026-05-10
阅读量: 6.8万
20. 消息队列选型对比:RabbitMQ vs Kafka
作者: 中间件技术
发布时间: 2026-05-09
阅读量: 5.4万
21. 前端性能优化:懒加载与代码分割
作者: 前端性能
发布时间: 2026-05-08
阅读量: 4.6万
22. 分布式事务解决方案
作者: 分布式技术
发布时间: 2026-05-07
阅读量: 5.9万
23. Go 语言入门教程
作者: Go技术
发布时间: 2026-05-06
阅读量: 7.2万
24. 数据库分库分表实战
作者: 数据库技术
发布时间: 2026-05-05
阅读量: 6.5万
25. React Native 跨平台开发
作者: 移动端技术
发布时间: 2026-05-04
阅读量: 4.2万
26. Spring Security 安全认证详解
作者: 安全技术
发布时间: 2026-05-03
阅读量: 5.7万
27. 算法入门:二分查找与时间复杂度
作者: 算法技术
发布时间: 2026-05-02
阅读量: 3.9万
28. Node.js 后端开发实战
作者: Node技术
发布时间: 2026-05-01
阅读量: 4.8万
29. 云原生架构设计原则
作者: 云原生技术
发布时间: 2026-04-30
阅读量: 5.3万
30. CSS 布局技巧:Flexbox 与 Grid
作者: 前端技术
发布时间: 2026-04-29
阅读量: 3.6万
31. 高并发系统设计方案
作者: 系统架构
发布时间: 2026-04-28
阅读量: 6.2万
32. TypeScript 高级类型详解
作者: TypeScript技术
发布时间: 2026-04-27
阅读量: 4.4万
33. 分布式缓存策略
作者: 缓存技术
发布时间: 2026-04-26
阅读量: 5.5万
34. Flutter 移动端开发入门
作者: Flutter技术
发布时间: 2026-04-25
阅读量: 4.1万
35. 代码审查最佳实践
作者: 代码质量
发布时间: 2026-04-24
阅读量: 3.7万
============================================================
报告结束
============================================================
总爬取数据: 140 条
总耗时: 12460ms
============================================================
Loading…
Cancel
Save