diff --git a/Crawler/202401060101-郑佳音-期末实验报告.docx b/Crawler/202401060101-郑佳音-期末实验报告.docx new file mode 100644 index 0000000..e36af6d Binary files /dev/null and b/Crawler/202401060101-郑佳音-期末实验报告.docx differ diff --git a/Crawler/bin/command/Command.class b/Crawler/bin/command/Command.class new file mode 100644 index 0000000..0db0b1a Binary files /dev/null and b/Crawler/bin/command/Command.class differ diff --git a/Crawler/bin/command/CommandInvoker.class b/Crawler/bin/command/CommandInvoker.class new file mode 100644 index 0000000..7995b98 Binary files /dev/null and b/Crawler/bin/command/CommandInvoker.class differ diff --git a/Crawler/bin/command/CommandWrapper.class b/Crawler/bin/command/CommandWrapper.class new file mode 100644 index 0000000..6f88d7e Binary files /dev/null and b/Crawler/bin/command/CommandWrapper.class differ diff --git a/Crawler/bin/command/CrawlCommand.class b/Crawler/bin/command/CrawlCommand.class new file mode 100644 index 0000000..0e6110f Binary files /dev/null and b/Crawler/bin/command/CrawlCommand.class differ diff --git a/Crawler/bin/command/RetryCommand.class b/Crawler/bin/command/RetryCommand.class new file mode 100644 index 0000000..198d613 Binary files /dev/null and b/Crawler/bin/command/RetryCommand.class differ diff --git a/Crawler/bin/controller/CrawlerController.class b/Crawler/bin/controller/CrawlerController.class new file mode 100644 index 0000000..cbef3d9 Binary files /dev/null and b/Crawler/bin/controller/CrawlerController.class differ diff --git a/Crawler/bin/exception/CrawlerException.class b/Crawler/bin/exception/CrawlerException.class new file mode 100644 index 0000000..1121457 Binary files /dev/null and b/Crawler/bin/exception/CrawlerException.class differ diff --git a/Crawler/bin/exception/NetworkException.class b/Crawler/bin/exception/NetworkException.class new file mode 100644 index 0000000..915a3a6 Binary files /dev/null and b/Crawler/bin/exception/NetworkException.class differ diff --git a/Crawler/bin/exception/ParseException.class b/Crawler/bin/exception/ParseException.class new file mode 100644 index 0000000..241f9ea Binary files /dev/null and b/Crawler/bin/exception/ParseException.class differ diff --git a/Crawler/bin/main/CrawlerCLI.class b/Crawler/bin/main/CrawlerCLI.class new file mode 100644 index 0000000..998de0c Binary files /dev/null and b/Crawler/bin/main/CrawlerCLI.class differ diff --git a/Crawler/bin/model/CrawlResult.class b/Crawler/bin/model/CrawlResult.class new file mode 100644 index 0000000..8379a08 Binary files /dev/null and b/Crawler/bin/model/CrawlResult.class differ diff --git a/Crawler/bin/model/ResultContainer.class b/Crawler/bin/model/ResultContainer.class new file mode 100644 index 0000000..f4e5a10 Binary files /dev/null and b/Crawler/bin/model/ResultContainer.class differ diff --git a/Crawler/bin/model/Statistics.class b/Crawler/bin/model/Statistics.class new file mode 100644 index 0000000..c6c9523 Binary files /dev/null and b/Crawler/bin/model/Statistics.class differ diff --git a/Crawler/bin/repository/Repository.class b/Crawler/bin/repository/Repository.class new file mode 100644 index 0000000..db48eb8 Binary files /dev/null and b/Crawler/bin/repository/Repository.class differ diff --git a/Crawler/bin/strategy/AbstractCrawlStrategy.class b/Crawler/bin/strategy/AbstractCrawlStrategy.class new file mode 100644 index 0000000..d8cea08 Binary files /dev/null and b/Crawler/bin/strategy/AbstractCrawlStrategy.class differ diff --git a/Crawler/bin/strategy/CrawlStrategy.class b/Crawler/bin/strategy/CrawlStrategy.class new file mode 100644 index 0000000..df9cc8d Binary files /dev/null and b/Crawler/bin/strategy/CrawlStrategy.class differ diff --git a/Crawler/bin/strategy/CrawlStrategyFactory.class b/Crawler/bin/strategy/CrawlStrategyFactory.class new file mode 100644 index 0000000..160a9b8 Binary files /dev/null and b/Crawler/bin/strategy/CrawlStrategyFactory.class differ diff --git a/Crawler/bin/strategy/CsdnBlogStrategy.class b/Crawler/bin/strategy/CsdnBlogStrategy.class new file mode 100644 index 0000000..183663e Binary files /dev/null and b/Crawler/bin/strategy/CsdnBlogStrategy.class differ diff --git a/Crawler/bin/strategy/DangDangStrategy.class b/Crawler/bin/strategy/DangDangStrategy.class new file mode 100644 index 0000000..89efe74 Binary files /dev/null and b/Crawler/bin/strategy/DangDangStrategy.class differ diff --git a/Crawler/bin/strategy/MovieStrategy.class b/Crawler/bin/strategy/MovieStrategy.class new file mode 100644 index 0000000..fd8d3d9 Binary files /dev/null and b/Crawler/bin/strategy/MovieStrategy.class differ diff --git a/Crawler/bin/strategy/StatsStrategy.class b/Crawler/bin/strategy/StatsStrategy.class new file mode 100644 index 0000000..9316bc3 Binary files /dev/null and b/Crawler/bin/strategy/StatsStrategy.class differ diff --git a/Crawler/bin/strategy/Train12306Strategy.class b/Crawler/bin/strategy/Train12306Strategy.class new file mode 100644 index 0000000..660e372 Binary files /dev/null and b/Crawler/bin/strategy/Train12306Strategy.class differ diff --git a/Crawler/bin/strategy/WeatherStrategy.class b/Crawler/bin/strategy/WeatherStrategy.class new file mode 100644 index 0000000..15fbce1 Binary files /dev/null and b/Crawler/bin/strategy/WeatherStrategy.class differ diff --git a/Crawler/bin/view/CrawlerView.class b/Crawler/bin/view/CrawlerView.class new file mode 100644 index 0000000..8ebfeb9 Binary files /dev/null and b/Crawler/bin/view/CrawlerView.class differ diff --git a/Crawler/command/Command.java b/Crawler/command/Command.java new file mode 100644 index 0000000..ceba9c1 --- /dev/null +++ b/Crawler/command/Command.java @@ -0,0 +1,10 @@ +package command; + +import model.CrawlResult; +import exception.CrawlerException; +import java.util.List; + +public interface Command { + List execute() throws CrawlerException; + String getName(); +} \ No newline at end of file diff --git a/Crawler/command/CommandInvoker.java b/Crawler/command/CommandInvoker.java new file mode 100644 index 0000000..9816d78 --- /dev/null +++ b/Crawler/command/CommandInvoker.java @@ -0,0 +1,48 @@ +package command; + +import model.CrawlResult; +import exception.CrawlerException; +import view.CrawlerView; + +import java.util.ArrayList; +import java.util.List; + +public class CommandInvoker { + private final List commands; + private final CrawlerView view; + + public CommandInvoker(CrawlerView view) { + this.commands = new ArrayList<>(); + this.view = view; + } + + public void addCommand(Command command) { + commands.add(command); + } + + public List executeAll() throws CrawlerException { + List allResults = new ArrayList<>(); + + for (Command command : commands) { + view.showHeader("执行命令: " + command.getName()); + try { + List results = command.execute(); + allResults.addAll(results); + } catch (CrawlerException e) { + view.showError("命令 " + command.getName() + " 执行失败: " + e.getMessage()); + throw e; + } + view.showLine(); + } + + return allResults; + } + + public void clearCommands() { + commands.clear(); + } + + public int getCommandCount() { + return commands.size(); + } +} \ No newline at end of file diff --git a/Crawler/command/CommandWrapper.java b/Crawler/command/CommandWrapper.java new file mode 100644 index 0000000..e1f6456 --- /dev/null +++ b/Crawler/command/CommandWrapper.java @@ -0,0 +1,44 @@ +package command; + +import exception.CrawlerException; +import model.ResultContainer; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +public class CommandWrapper { + private final String name; + private final Supplier> action; + private final Function formatter; + + private CommandWrapper(String name, Supplier> action, + Function formatter) { + this.name = name; + this.action = action; + this.formatter = formatter; + } + + public static CommandWrapper create(String name, + Supplier> action) { + return new CommandWrapper<>(name, action, Object::toString); + } + + public static CommandWrapper create(String name, + Supplier> action, + Function formatter) { + return new CommandWrapper<>(name, action, formatter); + } + + public ResultContainer execute() { + return action.get(); + } + + public String getName() { + return name; + } + + public String format(T result) { + return formatter.apply(result); + } +} \ No newline at end of file diff --git a/Crawler/command/CrawlCommand.java b/Crawler/command/CrawlCommand.java new file mode 100644 index 0000000..05b27c0 --- /dev/null +++ b/Crawler/command/CrawlCommand.java @@ -0,0 +1,244 @@ +package command; + +import model.CrawlResult; +import model.Statistics; +import model.ResultContainer; +import strategy.CrawlStrategy; +import exception.CrawlerException; +import exception.NetworkException; +import exception.ParseException; +import view.CrawlerView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class CrawlCommand implements Command { + private static final Logger logger = LoggerFactory.getLogger(CrawlCommand.class); + + private final CrawlStrategy strategy; + private final int startPage; + private final int endPage; + private final String outputFile; + private final CrawlerView view; + private final int maxRetries; + private final int baseRetryDelay; + private final Statistics statistics; + private final int pageDelay; + + public CrawlCommand(CrawlStrategy strategy, int startPage, int endPage, + String outputFile, CrawlerView view) { + this(strategy, startPage, endPage, outputFile, view, 3, 1500, 1500); + } + + public CrawlCommand(CrawlStrategy strategy, int startPage, int endPage, + String outputFile, CrawlerView view, int maxRetries, int baseRetryDelay, int pageDelay) { + validateConstructorParams(strategy, startPage, endPage, view); + this.strategy = strategy; + this.startPage = startPage; + this.endPage = endPage; + this.outputFile = outputFile; + this.view = view; + this.maxRetries = maxRetries; + this.baseRetryDelay = baseRetryDelay; + this.pageDelay = pageDelay; + this.statistics = new Statistics<>("CrawlCommand_" + strategy.getSiteName()); + logger.debug("CrawlCommand 初始化: site={}, pages={}-{}, pageDelay={}ms", + strategy.getSiteName(), startPage, endPage, pageDelay); + } + + private void validateConstructorParams(CrawlStrategy strategy, int startPage, + int endPage, CrawlerView view) { + if (strategy == null) { + throw new IllegalArgumentException("Strategy cannot be null"); + } + if (startPage < 1) { + throw new IllegalArgumentException("Start page must be >= 1"); + } + if (endPage < startPage) { + throw new IllegalArgumentException("End page must be >= start page"); + } + if (view == null) { + throw new IllegalArgumentException("View cannot be null"); + } + } + + @Override + public List execute() throws CrawlerException { + List allResults = new ArrayList<>(); + int consecutiveFailures = 0; + logger.info("开始爬取: {} (页码 {} 到 {})", strategy.getSiteName(), startPage, endPage); + view.showMessage("开始爬取: " + strategy.getSiteName()); + view.showMessage("目标: " + (endPage - startPage + 1) + " 页数据,每页间隔 " + pageDelay + "ms"); + view.showLine(); + + for (int page = startPage; page <= endPage; page++) { + List pageResults = null; + boolean pageSuccess = false; + + for (int retry = 0; retry < maxRetries; retry++) { + try { + logger.info("正在爬取第 {} 页...", page); + view.showMessage("正在爬取第 " + page + " 页..."); + pageResults = strategy.crawlPage(page); + + if (pageResults != null && !pageResults.isEmpty()) { + consecutiveFailures = 0; + statistics.increment("success_pages"); + logger.debug("第 {} 页爬取成功,获取 {} 条数据", page, pageResults.size()); + pageSuccess = true; + break; + } + logger.warn("第 {} 页返回空结果", page); + view.showWarning("第 " + page + " 页返回空结果"); + + if (retry < maxRetries - 1) { + int delay = baseRetryDelay * (int) Math.pow(2, retry); + view.showMessage("等待 " + delay + "ms 后重试..."); + Thread.sleep(delay); + } + } catch (ParseException e) { + consecutiveFailures++; + statistics.increment("parse_failures"); + logger.error("第 {} 页解析失败 (尝试 {}/{}): {}", + page, retry + 1, maxRetries, e.getMessage()); + view.showError("解析失败: " + e.getMessage()); + + if (retry < maxRetries - 1) { + try { + int delay = baseRetryDelay * (int) Math.pow(2, retry); + view.showMessage("等待 " + delay + "ms 后重试..."); + Thread.sleep(delay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + logger.warn("爬取过程被中断"); + throw new CrawlerException("爬取被中断", ie); + } + } + } catch (IOException e) { + consecutiveFailures++; + statistics.increment("network_failures"); + logger.error("【网络异常】第 {} 页网络请求失败 (尝试 {}/{}): {}", + page, retry + 1, maxRetries, e.getMessage()); + view.showError("【网络异常】" + e.getMessage()); + + String exceptionType = getNetworkExceptionType(e); + if (exceptionType != null) { + logger.error("【断网检测】检测到网络中断类型: {}", exceptionType); + view.showError("【断网检测】" + exceptionType); + } + + if (consecutiveFailures >= 2) { + logger.error("【断网检测】连续失败2次,判定为网络异常,立即停止爬取"); + view.showError("【断网检测】连续失败2次,判定为网络异常,停止爬取"); + throw new NetworkException("【断网异常】网络请求连续失败,请检查网络连接状态: " + e.getMessage(), e); + } + + if (retry < maxRetries - 1) { + try { + int delay = baseRetryDelay * (int) Math.pow(2, retry); + view.showMessage("等待 " + delay + "ms 后重试..."); + Thread.sleep(delay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + logger.warn("爬取过程被中断"); + throw new NetworkException("爬取被中断", ie); + } + } else { + throw new NetworkException("【网络连接失败】网络请求失败,请检查网络连接: " + e.getMessage(), e); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.warn("爬取过程被中断"); + throw new CrawlerException("爬取被中断", e); + } + } + + if (pageSuccess && pageResults != null) { + allResults.addAll(pageResults); + view.showSuccess("Page " + page + ": " + pageResults.size() + " items"); + statistics.increment("total_items", pageResults.size()); + } + + if (page < endPage && pageSuccess) { + try { + logger.debug("翻页间隔等待 {}ms", pageDelay); + Thread.sleep(pageDelay); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.warn("翻页等待被中断"); + break; + } + } + + if (allResults.size() >= 200) { + logger.info("已达到最大数据量 200 条,停止爬取"); + view.showWarning("已达到最大数据量 200 条,停止爬取"); + break; + } + } + + view.showLine(); + view.showMessage("爬取完成,共获取 " + allResults.size() + " 条数据"); + statistics.record("total_items", allResults.size()); + logger.info("爬取完成: {} 共获取 {} 条数据", strategy.getSiteName(), allResults.size()); + + if (allResults.isEmpty()) { + view.showError("警告: 未能获取到任何数据!"); + logger.error("未能获取到任何数据"); + } + + return allResults; + } + + @Override + public String getName() { + return "CrawlCommand[" + strategy.getSiteName() + "]"; + } + + public String getOutputFile() { + return outputFile; + } + + public CrawlStrategy getStrategy() { + return strategy; + } + + public Statistics getStatistics() { + return statistics; + } + + private String getNetworkExceptionType(IOException e) { + Throwable cause = e.getCause(); + if (cause instanceof java.net.ConnectException) { + return "【网络连接失败】无法连接到服务器,请检查网络连接"; + } else if (cause instanceof java.net.UnknownHostException) { + return "【DNS解析失败】无法解析域名,请检查网络或DNS设置"; + } else if (cause instanceof java.net.NoRouteToHostException) { + return "【路由不可达】无法到达目标主机,请检查网络连接"; + } else if (cause instanceof java.net.SocketException) { + return "【Socket异常】网络连接异常,请检查网络状态"; + } else if (cause instanceof java.net.SocketTimeoutException) { + return "【连接超时】网络请求超时,请检查网络稳定性"; + } + + String message = e.getMessage(); + if (message != null) { + if (message.contains("Connection refused")) { + return "【连接被拒绝】服务器拒绝连接,请检查网络或稍后重试"; + } else if (message.contains("UnknownHost")) { + return "【域名解析失败】无法解析域名,请检查网络连接"; + } else if (message.contains("timeout")) { + return "【请求超时】网络请求超时,请检查网络稳定性"; + } else if (message.contains("Network is unreachable")) { + return "【网络不可达】网络连接不可用,请检查网络状态"; + } else if (message.contains("Connection reset")) { + return "【连接重置】连接被服务器重置,请检查网络"; + } + } + + return null; + } +} \ No newline at end of file diff --git a/Crawler/command/RetryCommand.java b/Crawler/command/RetryCommand.java new file mode 100644 index 0000000..8601fd9 --- /dev/null +++ b/Crawler/command/RetryCommand.java @@ -0,0 +1,53 @@ +package command; + +import model.CrawlResult; +import exception.CrawlerException; +import view.CrawlerView; + +import java.util.List; + +public class RetryCommand implements Command { + private final Command originalCommand; + private final int maxRetries; + private final CrawlerView view; + + public RetryCommand(Command originalCommand, int maxRetries, CrawlerView view) { + this.originalCommand = originalCommand; + this.maxRetries = maxRetries; + this.view = view; + } + + @Override + public List execute() throws CrawlerException { + CrawlerException lastException = null; + + for (int attempt = 1; attempt <= maxRetries; attempt++) { + try { + view.showMessage("执行命令: " + originalCommand.getName() + + " (尝试 " + attempt + "/" + maxRetries + ")"); + return originalCommand.execute(); + } catch (CrawlerException e) { + lastException = e; + view.showError("命令执行失败: " + e.getMessage()); + + if (attempt < maxRetries) { + view.showMessage("等待重试..."); + try { + Thread.sleep(1000 * attempt); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + break; + } + } + } + } + + view.showError("命令执行失败,已达到最大重试次数 " + maxRetries); + throw lastException; + } + + @Override + public String getName() { + return "Retry[" + originalCommand.getName() + "]"; + } +} \ No newline at end of file diff --git a/Crawler/controller/CrawlerController.java b/Crawler/controller/CrawlerController.java new file mode 100644 index 0000000..4e58630 --- /dev/null +++ b/Crawler/controller/CrawlerController.java @@ -0,0 +1,331 @@ +package controller; + +import model.CrawlResult; +import model.Statistics; +import model.ResultContainer; +import repository.Repository; +import command.Command; +import command.CommandInvoker; +import command.CrawlCommand; +import command.RetryCommand; +import strategy.CrawlStrategy; +import strategy.DangDangStrategy; +import strategy.WeatherStrategy; +import strategy.MovieStrategy; +import strategy.Train12306Strategy; +import strategy.CsdnBlogStrategy; +import exception.CrawlerException; +import exception.NetworkException; +import view.CrawlerView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.List; + +public class CrawlerController { + private static final Logger logger = LoggerFactory.getLogger(CrawlerController.class); + + private final CrawlerView view; + private final CommandInvoker invoker; + private final Repository dataRepository; + private final Statistics statistics; + + public CrawlerController(CrawlerView view) { + if (view == null) { + throw new IllegalArgumentException("View cannot be null"); + } + this.view = view; + this.invoker = new CommandInvoker(view); + this.dataRepository = new Repository<>(CrawlResult.class); + this.statistics = new Statistics<>("CrawlerController"); + logger.info("CrawlerController 初始化完成"); + } + + public ResultContainer> runDangDangCrawler() { + logger.info("开始执行当当网图书爬虫"); + statistics.record("dangdang_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new DangDangStrategy(); + Command command = new CrawlCommand(strategy, 1, 5, "dangdang_books.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("当当网爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "dangdang_books.txt", "当当网图书"); + } catch (NetworkException e) { + logger.error("【断网异常】当当网爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】当当网爬虫网络请求失败: " + e.getMessage()); + statistics.increment("dangdang_failures"); + return ResultContainer.failure("【断网异常】当当网爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("当当网爬虫执行失败: {}", e.getMessage()); + statistics.increment("dangdang_failures"); + return ResultContainer.failure("当当网爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runWeatherCrawler() { + logger.info("开始执行中国天气网爬虫"); + statistics.record("weather_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new WeatherStrategy(); + Command command = new CrawlCommand(strategy, 1, 14, "weather_cities.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("中国天气网爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "weather_cities.txt", "中国天气网"); + } catch (NetworkException e) { + logger.error("【断网异常】中国天气网爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】中国天气网爬虫网络请求失败: " + e.getMessage()); + statistics.increment("weather_failures"); + return ResultContainer.failure("【断网异常】中国天气网爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("中国天气网爬虫执行失败: {}", e.getMessage()); + statistics.increment("weather_failures"); + return ResultContainer.failure("天气网爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runMaoyanMovieCrawler() { + logger.info("开始执行猫眼电影爬虫"); + statistics.record("maoyan_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new MovieStrategy(); + Command command = new CrawlCommand(strategy, 1, 10, "maoyan_top100.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("猫眼电影爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "maoyan_top100.txt", "猫眼电影"); + } catch (NetworkException e) { + logger.error("【断网异常】猫眼电影爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】猫眼电影爬虫网络请求失败: " + e.getMessage()); + statistics.increment("maoyan_failures"); + return ResultContainer.failure("【断网异常】猫眼电影爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("猫眼电影爬虫执行失败: {}", e.getMessage()); + statistics.increment("maoyan_failures"); + return ResultContainer.failure("猫眼电影爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runTrain12306Crawler() { + logger.info("开始执行12306火车票爬虫"); + statistics.record("12306_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new Train12306Strategy(); + Command command = new CrawlCommand(strategy, 1, 10, "train_12306.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("12306爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "train_12306.txt", "12306火车票"); + } catch (NetworkException e) { + logger.error("【断网异常】12306爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】12306爬虫网络请求失败: " + e.getMessage()); + statistics.increment("12306_failures"); + return ResultContainer.failure("【断网异常】12306爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("12306爬虫执行失败: {}", e.getMessage()); + statistics.increment("12306_failures"); + return ResultContainer.failure("12306爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runCsdnBlogCrawler() { + logger.info("开始执行CSDN博客爬虫"); + statistics.record("csdn_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new CsdnBlogStrategy(); + Command command = new CrawlCommand(strategy, 1, 15, "csdn_blogs.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("CSDN博客爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "csdn_blogs.txt", "CSDN博客"); + } catch (NetworkException e) { + logger.error("【断网异常】CSDN博客爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】CSDN博客爬虫网络请求失败: " + e.getMessage()); + statistics.increment("csdn_failures"); + return ResultContainer.failure("【断网异常】CSDN博客爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("CSDN博客爬虫执行失败: {}", e.getMessage()); + statistics.increment("csdn_failures"); + return ResultContainer.failure("CSDN博客爬虫失败: " + e.getMessage(), e); + } + } + + private ResultContainer> processResults(List results, + String filename, String siteName) { + if (results == null || results.isEmpty()) { + logger.warn("{} 爬取结果为空", siteName); + return ResultContainer.failure(siteName + "爬取结果为空"); + } + + for (CrawlResult result : results) { + dataRepository.add(result); + } + + saveToFile(results, filename); + saveToJson(results, filename.replace(".txt", ".json")); + + statistics.record(siteName + "_count", results.size()); + statistics.record(siteName + "_end", System.currentTimeMillis()); + statistics.increment("total_items", results.size()); + + logger.info("{} 爬取完成,共 {} 条数据,已保存到 {}", siteName, results.size(), filename); + return ResultContainer.success(results, siteName + "爬取完成,共 " + results.size() + " 条数据"); + } + + public void runAllCrawlers() { + logger.info("开始执行所有爬虫"); + int successCount = 0; + int failCount = 0; + + ResultContainer> result; + + view.showHeader("当当网图书爬虫"); + result = runDangDangCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("中国天气网爬虫"); + result = runWeatherCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("猫眼电影爬虫"); + result = runMaoyanMovieCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("12306火车票爬虫"); + result = runTrain12306Crawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("CSDN博客爬虫"); + result = runCsdnBlogCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showLine(); + view.showMessage("所有爬虫执行完成"); + view.showMessage("成功: " + successCount + " 个"); + view.showMessage("失败: " + failCount + " 个"); + view.showMessage("总计采集数据: " + statistics.getCount("total_items") + " 条"); + + statistics.record("success_count", successCount); + statistics.record("fail_count", failCount); + logger.info("所有爬虫执行完成,成功: {},失败: {},总计数据: {}", + successCount, failCount, statistics.getCount("total_items")); + } + + public void saveToFile(List results, String filename) { + if (filename == null || filename.trim().isEmpty()) { + logger.error("文件名为空,无法保存"); + view.showError("文件名不能为空"); + return; + } + + try { + File file = new File(filename); + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); + } + + try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) { + writer.println("Title,Price,OriginalPrice,Discount,ImageUrl,Author"); + for (CrawlResult result : results) { + if (result != null) { + writer.println(result.toString()); + } + } + } + logger.info("文件保存成功: {}", filename); + view.showSuccess("文件保存成功: " + filename); + } catch (IOException e) { + logger.error("保存文件失败: {} - {}", filename, e.getMessage()); + view.showError("保存文件失败: " + filename + " (" + e.getMessage() + ")"); + } + } + + public void saveToJson(List results, String filename) { + if (filename == null || filename.trim().isEmpty()) { + logger.error("JSON文件名为空,无法保存"); + view.showError("文件名不能为空"); + return; + } + + try { + File file = new File(filename); + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); + } + + StringBuilder json = new StringBuilder(); + json.append("[\n"); + for (int i = 0; i < results.size(); i++) { + CrawlResult result = results.get(i); + if (result != null) { + json.append(" ").append(result.toJson()); + if (i < results.size() - 1) { + json.append(","); + } + json.append("\n"); + } + } + json.append("]"); + + try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) { + writer.write(json.toString()); + } + logger.info("JSON文件保存成功: {}", filename); + view.showSuccess("JSON文件保存成功: " + filename); + } catch (IOException e) { + logger.error("保存JSON文件失败: {} - {}", filename, e.getMessage()); + view.showError("保存JSON文件失败: " + filename + " (" + e.getMessage() + ")"); + } + } + + public Repository getDataRepository() { + return dataRepository; + } + + public Statistics getStatistics() { + return statistics; + } +} \ No newline at end of file diff --git a/Crawler/csdn_blogs.json b/Crawler/csdn_blogs.json new file mode 100644 index 0000000..cdbd744 --- /dev/null +++ b/Crawler/csdn_blogs.json @@ -0,0 +1,210 @@ +[ + {"title":"Python 鸭子类型:优雅的多态哲学,让代码更自由","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_92624912/article/details/160498689","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"从 for 循环到 yield:一文搞懂 Python 迭代器与生成器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161144162","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"2026年最新版Python安装和PyCharm安装教程(图文详细 附安装包)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_73467482/article/details/156511914","author":"CSDN用户 | 阅读 7.1k"}, + {"title":"【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161457480","author":"CSDN用户 | 阅读 44"}, + {"title":"python基于vue的流浪动物收养系统志愿者设计与开发django flask pycharm","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/QQ1963288475/article/details/156946558","author":"CSDN用户 | 阅读 978"}, + {"title":"Python 中的 @property:像访问属性一样调用方法","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161202644","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"【pip / conda / uv】换源大全:2026 国内镜像最新地址,一张表搞定所有 【Python】安装卡顿","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_73472828/article/details/160525215","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"Python流程控制:break与continue语句的区别与应用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161098938","author":"CSDN用户 | 阅读 6.7k"}, + {"title":"从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41187124/article/details/155500568","author":"CSDN用户 | 阅读 2.2w"}, + {"title":"Python 操作金仓数据库的完全指南(上篇):连接管理与高可用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617026","author":"CSDN用户 | 阅读 1.5w"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"Python+AI智能体(Agent)零基础入门全攻略:原理、架构、手搓代码与实战落地","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_94956987/article/details/160419420","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"一篇看懂 Python 标识符:命名规则 + 规范 + 避坑指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80026901/article/details/160413181","author":"CSDN用户 | 阅读 2.2k"}, + {"title":"【2026 最新】Python 与 PyCharm 详细下载安装教程 带图展示(Windows 版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80035882/article/details/157432536","author":"CSDN用户 | 阅读 8.7k"}, + {"title":"【Python】异常处理:从基础到进阶","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2303_79015671/article/details/144533265","author":"CSDN用户 | 阅读 6.2k"}, + {"title":"Python元编程:非科班转码者的入门指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159760302","author":"CSDN用户 | 阅读 1.2w"}, + {"title":"Web自动化之Selenium 超详细教程(python)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_73953650/article/details/145730531","author":"CSDN用户 | 阅读 2.3w"}, + {"title":"【Dify】使用 python 调用 Dify 的 API 服务,查看“知识检索”返回内容,用于前端溯源展示","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wsLJQian/article/details/157470958","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"Python数据统计完全指南:从入门到实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/sixpp/article/details/152516371","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"Python流程控制:while循环嵌套与死循环避免技巧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161001777","author":"CSDN用户 | 阅读 5.8k"}, + {"title":"Python 正则表达式入门:从匹配手机号到提取文本内容","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161200803","author":"CSDN用户 | 阅读 7.5k"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"13801黄大年茶思屋第138期(基础软件领域第三期)第1题:混部场景下高性能、低底噪的极简I/O QoS管控技术","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/coreopt/article/details/161459642","author":"CSDN用户 | 阅读 359"}, + {"title":"2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/user340/article/details/158102252","author":"CSDN用户 | 阅读 7.1k"}, + {"title":"Python 鸭子类型:优雅的多态哲学,让代码更自由","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_92624912/article/details/160498689","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44647100/article/details/160017406","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"2026年电脑网页游戏盘点_传奇网页游戏推荐","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2601_96116927/article/details/161459833","author":"CSDN用户 | 阅读 155"}, + {"title":"Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617170","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"Python 中的 @property:像访问属性一样调用方法","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161202644","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"AI入门踩坑实录:我换了3种语言才敢说,Python真的是入门唯一选择吗?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Dreamy_zsy/article/details/160308823","author":"CSDN用户 | 阅读 3.7w"}, + {"title":"AutoGPT+Python:让AI智能体自动完成复杂任务的终极指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_81152266/article/details/158353859","author":"CSDN用户 | 阅读 4.5k"}, + {"title":"Windows本地部署Hermes Agent实录!WSL+Python部署路线详细步骤","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/baidu_41773235/article/details/160404260","author":"CSDN用户 | 阅读 761"}, + {"title":"用 uv 轻松掌管你的 Python 宇宙:告别版本混乱,一键设置全局解释器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_51553749/article/details/157765585","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"Python从0到100完整学习指南(必看导航)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57545130/article/details/158382640","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"Fiddler抓包实战:5分钟搞定同花顺APP股票数据API获取(附Python解析代码)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_29211309/article/details/158247385","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"Python与容器化:Docker和Kubernetes实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159630044","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"基于Python的医院运营数据可视化平台:设计、实现与应用(上)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/kkiron/article/details/145614002","author":"CSDN用户 | 阅读 4.4k"}, + {"title":"Python AI入门:从Hello World到图像分类","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/guoyizhongxing/article/details/159324438","author":"CSDN用户 | 阅读 5.7k"}, + {"title":"python通过API调用Coze智能体学习","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/GHL284271090/article/details/160994302","author":"CSDN用户 | 阅读 752"}, + {"title":"从 for 循环到 yield:一文搞懂 Python 迭代器与生成器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161144162","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"Python 3.12(于2023年10月2日发布)是Python的最新稳定版本之一,相比此前版本(如3.11、3.10等)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/blog_programb/article/details/158616716","author":"CSDN用户 | 阅读 838"}, + {"title":"本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161452150","author":"CSDN用户 | 阅读 151"}, + {"title":"还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44647100/article/details/160017406","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Day 75:【99天精通Python】人工智能应用 - 接入 OpenAI API - 给程序装上大脑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_52694742/article/details/157074239","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"在线浏览“秀人网合集”的新思路:30 行 Python 把封面图链接秒变本地可点图库","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/cheweituya/article/details/157251686","author":"CSDN用户 | 阅读 10.4w"}, + {"title":"一文读懂IP路由:从设备架构到核心技术","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_88096536/article/details/161458018","author":"CSDN用户 | 阅读 348"}, + {"title":"Python流程控制:for循环与range函数的搭配使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161067521","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"2026最新:国内直连调用Grok-4.3与免费Gemini-2.5-flash-lite(无需翻墙/OpenClaw+PyCharm+Python全场景)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/nmdbbzcl/article/details/160992672","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"【Python 爬虫实战】抓取 BOSS 直聘","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_87126002/article/details/157483743","author":"CSDN用户 | 阅读 3.2k"}, + {"title":"Python中一切皆对象:深入理解Python的对象模型","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_92624912/article/details/155100575","author":"CSDN用户 | 阅读 4.6k"}, + {"title":"Python与云计算:非科班转码者的指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159629885","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"【Scapy】Scapy详细安装教程、功能介绍、快速上手","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Himan21/article/details/149858432","author":"CSDN用户 | 阅读 4.0k"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"Python 八股文汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Derrick__1/article/details/158806665","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2302_78391795/article/details/150619723","author":"CSDN用户 | 阅读 4.1w"}, + {"title":"【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Clay_K/article/details/148401006","author":"CSDN用户 | 阅读 4.0k"}, + {"title":"【Js逆向 python】Web JS 逆向全体系详细解释","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80637449/article/details/159132537","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"对python的再认识-基于数据结构进行-a007-集合-CURD","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/BECOMEviolet/article/details/157912640","author":"CSDN用户 | 阅读 920"}, + {"title":"2026年Python就业市场分析:非科班转码者的机会与挑战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159729470","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"Python最全面复习:从入门到精通(2026年)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_90715893/article/details/161239082","author":"CSDN用户 | 阅读 972"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"Python与边缘计算:非科班转码者的指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159675671","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_83233809/article/details/161454731","author":"CSDN用户 | 阅读 4"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617170","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"从零实现一个轻量级向量搜索引擎(Python 版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/picture_share/article/details/161332729","author":"CSDN用户 | 阅读 943"}, + {"title":"Claude-Code-python 前端改造项目工作流程详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_42878111/article/details/160550285","author":"CSDN用户 | 阅读 864"}, + {"title":"Python 爬虫实战:Selenium 批量爬取百度图片(逐行代码超详细解析)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_66822255/article/details/161024571","author":"CSDN用户 | 阅读 999"}, + {"title":"Python流程控制:while循环嵌套与死循环避免技巧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161001777","author":"CSDN用户 | 阅读 5.8k"}, + {"title":"【2026最新Python+AI入门指南】:从零基础到实操落地,避开90%新手坑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/user340/article/details/157736821","author":"CSDN用户 | 阅读 7.9k"}, + {"title":"VS code研发工具配置使用,包括python、git的配置","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/hurong0000/article/details/160075246","author":"CSDN用户 | 阅读 665"}, + {"title":"Python 3.14 安装教程:新手友好版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_69824302/article/details/153417024","author":"CSDN用户 | 阅读 5.0k"}, + {"title":"Java安全-CC链 | CC3","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_93871563/article/details/160991726","author":"CSDN用户 | 阅读 3.1k"}, + {"title":"2.python加解密实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57385165/article/details/157332452","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Python 开发中“使用 read() 读取大文件导致内存溢出” 问题详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/jjj_web/article/details/160972045","author":"CSDN用户 | 阅读 811"}, + {"title":"Python 中的 sqlite3 模块:轻量级数据库的完美搭档","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_40266856/article/details/156835297","author":"CSDN用户 | 阅读 3.3k"}, + {"title":"Blender 3.x Python 脚本编程(一)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wizardforcel/article/details/158378453","author":"CSDN用户 | 阅读 3.0k"}, + {"title":"超越Python:下一步该学什么编程语言?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_56135967/article/details/157555149","author":"CSDN用户 | 阅读 1000"}, + {"title":"一文吃透贝叶斯算法:从数学原理到 Python 代码实战(附完整可运行案例)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_74398756/article/details/158664045","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/taotao_guiwang/article/details/156749455","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"Python流程控制:while循环嵌套与死循环避免技巧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161001777","author":"CSDN用户 | 阅读 5.8k"}, + {"title":"Python AI入门:从Hello World到图像分类","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/guoyizhongxing/article/details/159324438","author":"CSDN用户 | 阅读 5.7k"}, + {"title":"Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617170","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"实测CSDN AI数字营销会员:创作者效率与曝光的双重提升体验报告","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161451272","author":"CSDN用户 | 阅读 62"}, + {"title":"2.python加解密实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57385165/article/details/157332452","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Python 测试实战指南:单元、集成、端到端测试边界对比、发版焦虑破解与电商下单链路优化","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/windowshht/article/details/159627343","author":"CSDN用户 | 阅读 853"}, + {"title":"【课程设计/毕业设计】基于Python的外卖配送分析与可视化系统的设计与实现【附源码、数据库、万字文档】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_91703026/article/details/158585314","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"【Python 爬虫实战】抓取 BOSS 直聘","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_87126002/article/details/157483743","author":"CSDN用户 | 阅读 3.2k"}, + {"title":"一文读懂IP路由:从设备架构到核心技术","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_88096536/article/details/161458018","author":"CSDN用户 | 阅读 354"}, + {"title":"还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44647100/article/details/160017406","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/chen_si_shang_/article/details/161293640","author":"CSDN用户 | 阅读 850"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"计算机毕业设计Python+AI大模型空气质量预测分析(可定制城市) 空气质量可视化 空气质量爬虫 机器学习 深度学习 大 数据毕业设计","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/spark2022/article/details/161241598","author":"CSDN用户 | 阅读 870"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/user340/article/details/158102252","author":"CSDN用户 | 阅读 7.1k"}, + {"title":"【Python】基础语法入门(一)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78257800/article/details/154902322","author":"CSDN用户 | 阅读 6.3k"}, + {"title":"Playwright Python Windows 下 headful Chromium 崩溃排查经验分享","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/zhangshaohua1603/article/details/158350679","author":"CSDN用户 | 阅读 1.0k"}, + {"title":"Python中秋月圆夜:手把手实现月相可视化,用代码赏千里共婵娟","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_55394328/article/details/152602293","author":"CSDN用户 | 阅读 3.1w"}, + {"title":"【机器学习第三期(Python)】CatBoost 方法原理详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44246618/article/details/149022812","author":"CSDN用户 | 阅读 2.2k"}, + {"title":"Python之三大基本库——Pandas(1)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_61746796/article/details/153201960","author":"CSDN用户 | 阅读 4.5k"}, + {"title":"海洋光学(Ocean Insight,原 Ocean Optics)确实提供了面向 Python 的官方封装库,主要包括 OceanDirect(底层硬件通信)和基于其封装的高层库(如pyocean/","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/womrenet/article/details/156466272","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161132354","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_62043600/article/details/160531542","author":"CSDN用户 | 阅读 5.1k"}, + {"title":"java中的进程的详细解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yu____yuan/article/details/161049661","author":"CSDN用户 | 阅读 818"}, + {"title":"懂你所需,利爪随行:MateClaw 正式开源,补齐 Java 生态的 AI Agent 拼图","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/bufegar0/article/details/159846780","author":"CSDN用户 | 阅读 2.0k"}, + {"title":"我的workflow设置居然被赞扬了","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/stereohomology/article/details/161384575","author":"CSDN用户 | 阅读 477"}, + {"title":"【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161347182","author":"CSDN用户 | 阅读 682"}, + {"title":"Harness实战指南,在Java Spring Boot项目中规范落地OpenSpec+Claude Code","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/u013970991/article/details/159902907","author":"CSDN用户 | 阅读 1.9k"}, + {"title":"用 python 和 java 分别写出10道经典题","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_94434623/article/details/160901197","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"基于Java Web的医疗诊治系统的设计与实现 --毕设附源码42197","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/VX_DZbishe/article/details/157900907","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"字节跳动官网 bytedance.com 完整工程复刻","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161459714","author":"CSDN用户 | 阅读 31"}, + {"title":"Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/chen_si_shang_/article/details/161293640","author":"CSDN用户 | 阅读 850"}, + {"title":"Java 大视界 -- Java+Spark 构建企业级用户画像平台:从数据采集到标签输出全流程(437)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/atgfg/article/details/156062867","author":"CSDN用户 | 阅读 5.3k"}, + {"title":"语义解析革命:飞算JavaAI三层架构重塑企业级代码生成链路","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_74385041/article/details/150289635","author":"CSDN用户 | 阅读 9.7k"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89723786/article/details/157733289","author":"CSDN用户 | 阅读 607"}, + {"title":"Java 大视界 -- 基于 Java+Flink 构建实时风控规则引擎:动态规则配置与热更新(446)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/atgfg/article/details/157333442","author":"CSDN用户 | 阅读 3.3k"}, + {"title":"第三篇:《手把手搭建Selenium WebDriver测试环境(Java/Python)》","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_45239623/article/details/160394399","author":"CSDN用户 | 阅读 785"}, + {"title":"基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80863610/article/details/151295847","author":"CSDN用户 | 阅读 31.8w"}, + {"title":"Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/lilinhai548/article/details/156422566","author":"CSDN用户 | 阅读 4.1k"}, + {"title":"【Linux系统】线程(上)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Miun123/article/details/161121946","author":"CSDN用户 | 阅读 652"}, + {"title":"Java 连接 Elasticsearch 8.x 安全模式实战:证书校验与 ApiKey 认证全解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/hdk5855/article/details/158583924","author":"CSDN用户 | 阅读 985"}, + {"title":"【C++】 继承与多态(中)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_95649725/article/details/161196506","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"Linux C++ 高并发编程:从原理到手撕,线程池全链路深度解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_91389547/article/details/160339478","author":"CSDN用户 | 阅读 3.6k"}, + {"title":"开发一个好用的真全屏手持弹幕微信小程序(一)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Mr_BT/article/details/161459391","author":"CSDN用户 | 阅读 94"}, + {"title":"【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161132354","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_62043600/article/details/160531542","author":"CSDN用户 | 阅读 5.1k"}, + {"title":"Java实习模拟面试之多益网络苏州二面:聚焦游戏服务端开发、Redis高可用与JVM线程池深度追问","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_84764726/article/details/157393528","author":"CSDN用户 | 阅读 1.0k"}, + {"title":"Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89723786/article/details/157733289","author":"CSDN用户 | 阅读 607"}, + {"title":"【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161457480","author":"CSDN用户 | 阅读 45"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_87298751/article/details/159087816","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2302_79751907/article/details/149275967","author":"CSDN用户 | 阅读 3.7k"}, + {"title":"Java:猜数字游戏","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_94683681/article/details/161258233","author":"CSDN用户 | 阅读 5.5k"}, + {"title":"Java 开发者如何搞定百度地图 SN 权限签名实践-以搜索2.0接口为例","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yelangkingwuzuhu/article/details/151289695","author":"CSDN用户 | 阅读 9.5k"}, + {"title":"Bun替代Nodejs,JavaScrpit运行新环境-Bun,更快、更现代的开发体验","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57874805/article/details/150647891","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"Java Stream妙用:Collectors.toMap详解,轻松实现集合转一对一Map","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41840843/article/details/158383692","author":"CSDN用户 | 阅读 3.9k"}, + {"title":"Linux:基础指令(二)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/161036706","author":"CSDN用户 | 阅读 3.4k"}, + {"title":"2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Moss_co/article/details/148425265","author":"CSDN用户 | 阅读 3.4w"}, + {"title":"C++快速上手java备战期末考——初识java","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2502_94353935/article/details/160992548","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"Java+Vue开发者必看:Open Code、Claude Code、Trae、Coze 四大AI开发工具深度测评(含免费/付费对比)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_35452726/article/details/159687764","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_22903677/article/details/160000361","author":"CSDN用户 | 阅读 878"}, + {"title":"Javascript.8——ES6【Promise的静态方法】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_63215361/article/details/157614292","author":"CSDN用户 | 阅读 877"}, + {"title":"地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_83233809/article/details/161454731","author":"CSDN用户 | 阅读 4"}, + {"title":"2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Moss_co/article/details/148425265","author":"CSDN用户 | 阅读 3.4w"}, + {"title":"Java 大视界 -- Java 大数据机器学习模型在金融风险管理体系构建与风险防范能力提升中的应用(435)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/atgfg/article/details/155947715","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"Java——标准序列化机制","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/cold___play/article/details/161107932","author":"CSDN用户 | 阅读 3.5k"}, + {"title":"Java前缀和算法题目练习","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89019969/article/details/151975418","author":"CSDN用户 | 阅读 3.1k"}, + {"title":"Python 入门教程系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_30720461/article/details/161396374","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"Java GC 面试必问三件套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2504_94294476/article/details/160668120","author":"CSDN用户 | 阅读 728"}, + {"title":"突破平台限制:iOS设备运行Minecraft Java版完全指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/gitblog_00466/article/details/157378543","author":"CSDN用户 | 阅读 2.0w"}, + {"title":"企业级 Java 登录注册系统构建指南(附核心代码与配置)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_67187271/article/details/151104099","author":"CSDN用户 | 阅读 1.9k"}, + {"title":"Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89723786/article/details/157733289","author":"CSDN用户 | 阅读 607"}, + {"title":"Adoptium Temurin JDK 下载","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_42346831/article/details/148632858","author":"CSDN用户 | 阅读 5.2k"}, + {"title":"HarmonyOS ArkWeb 系列之precompileJavaScript:提前编译 JS 脚本,告别解析等待","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_33681891/article/details/161185190","author":"CSDN用户 | 阅读 1.5w"}, + {"title":"Java+SpringAI企业级实战项目完整官方文档(生产终版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wbkang/article/details/160586573","author":"CSDN用户 | 阅读 4.0k"}, + {"title":"高级java每日一道面试题-2025年12月31日-实战篇[Docker]-Docker Swarm 的 Routing Mesh 是如何工作的?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_43071699/article/details/161195524","author":"CSDN用户 | 阅读 792"}, + {"title":"基于Java标准库读取CSV实现天地图POI分类快速导入PostGIS数据库实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yelangkingwuzuhu/article/details/149454785","author":"CSDN用户 | 阅读 9.3k"}, + {"title":"【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161347182","author":"CSDN用户 | 阅读 682"}, + {"title":"JavaScript异步编程 Async/Await 使用详解:从原理到最佳实践","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/lhmyy521125/article/details/147932219","author":"CSDN用户 | 阅读 8.0k"}, + {"title":"java中的进程的详细解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yu____yuan/article/details/161049661","author":"CSDN用户 | 阅读 818"}, + {"title":"【C++】 继承与多态(中)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_95649725/article/details/161196506","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161347182","author":"CSDN用户 | 阅读 682"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"智能写字机器人开发全解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_88863003/article/details/161457761","author":"CSDN用户 | 阅读 105"}, + {"title":"C++_string增删查改模拟实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/155094868","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"Java——标准序列化机制","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/cold___play/article/details/161107932","author":"CSDN用户 | 阅读 3.5k"}, + {"title":"【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_62043600/article/details/160531542","author":"CSDN用户 | 阅读 5.1k"}, + {"title":"Java之泛型","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wmh_1234567/article/details/141270616","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"苍穹外卖 项目最终总结","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_88612756/article/details/161456400","author":"CSDN用户 | 阅读 280"}, + {"title":"【Java 开发日记】设计一个支持万人同时抢购商品的秒杀系统?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_87298751/article/details/156869453","author":"CSDN用户 | 阅读 6.9k"}, + {"title":"【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161132354","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"模仿淘宝购物系统的Java Web前端项目(开源项目)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/rej177/article/details/125535688","author":"CSDN用户 | 阅读 1.4w"}, + {"title":"【C++】C++——类的默认成员函数(构造、析构、拷贝构造函数)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/zore__/article/details/160190541","author":"CSDN用户 | 阅读 1.9k"}, + {"title":"学生职业选择对cpp/c++以及后端java go的迷茫","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_52259848/article/details/158290665","author":"CSDN用户 | 阅读 970"}, + {"title":"大模型开发 - 零手写 AI Agent:深入理解 ReAct 模式与 Java 实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yangshangwei/article/details/157644609","author":"CSDN用户 | 阅读 2.4k"}, + {"title":"【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_51572290/article/details/154535381","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"Java GC 面试必问三件套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2504_94294476/article/details/160668120","author":"CSDN用户 | 阅读 728"}, + {"title":"初识java","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_94683681/article/details/161200453","author":"CSDN用户 | 阅读 5.5k"}, + {"title":"JDK自带监控工具:jstat、jmap、jstack的使用指南(附命令示例)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41803278/article/details/156835773","author":"CSDN用户 | 阅读 2.2k"}, + {"title":"【技术架构】从单机到微服务:Java 后端架构演进与技术选型核心方案","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2302_79806056/article/details/151361712","author":"CSDN用户 | 阅读 3.1k"}, + {"title":"Resilience4j- 非 Spring 环境集成:纯 Java 项目中的手动配置实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41187124/article/details/157544457","author":"CSDN用户 | 阅读 2.2w"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"Java GC 面试必问三件套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2504_94294476/article/details/160668120","author":"CSDN用户 | 阅读 728"}, + {"title":"2024年软件设计师中级(软考中级)详细笔记【6】(下午题)试题6 Java 23种设计模式解题技巧(分值15)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/XFanny/article/details/143078263","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"我的workflow设置居然被赞扬了","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/stereohomology/article/details/161384575","author":"CSDN用户 | 阅读 482"}, + {"title":"【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/160900873","author":"CSDN用户 | 阅读 2.0k"}, + {"title":"Spring Cloud Alibaba 2025.1.0.0 正式发布:拥抱 Spring Boot 4.0 与 Java 21+ 的新时代","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/lilinhai548/article/details/158038123","author":"CSDN用户 | 阅读 5.0k"}, + {"title":"飞算JavaAI编程助手在IDEA中的安装教程:本地安装、离线安装、在线安装方法大全","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44866828/article/details/148776780","author":"CSDN用户 | 阅读 5.4k"}, + {"title":"Java开发新变革!飞算JavaAI深度剖析与实战指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/beautifulmemory/article/details/149032692","author":"CSDN用户 | 阅读 1.5w"}, + {"title":"本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161452150","author":"CSDN用户 | 阅读 153"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"C++_string增删查改模拟实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/155094868","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"飞算JavaAI:专为Java开发者打造的智能编程革命","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/149044619","author":"CSDN用户 | 阅读 2.4w"}, + {"title":"虚拟线程(Virtual Threads)使用指南(Java 21+)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_45483057/article/details/156154988","author":"CSDN用户 | 阅读 1.7k"}, + {"title":"Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/chen_si_shang_/article/details/161293640","author":"CSDN用户 | 阅读 850"}, + {"title":"Cast Attack:Java 中 Ghost Bits(幽灵比特)引发的新型安全威胁——Java 生态里被忽视的底层风险引发一系列绕过","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_43526443/article/details/160601018","author":"CSDN用户 | 阅读 2.4k"}, + {"title":"SpringAI Agent开发秘籍:让javaer也可以用上Agent Skills","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/liuyueyi25/article/details/157466255","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"【Java 开发日记】finally 释放的是什么资源?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_87298751/article/details/154342798","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"java八股——redis","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_53631504/article/details/159161047","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"Android Studio更改项目使用的JDK","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_37945670/article/details/143814764","author":"CSDN用户 | 阅读 2.8w"}, + {"title":"Linux:基础指令(二)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/161036706","author":"CSDN用户 | 阅读 3.4k"}, + {"title":"Java飞书机器人实战:5分钟搞定消息推送(附完整代码)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_28347369/article/details/159184456","author":"CSDN用户 | 阅读 891"} +] \ No newline at end of file diff --git a/Crawler/csdn_blogs.txt b/Crawler/csdn_blogs.txt new file mode 100644 index 0000000..bcbcd44 --- /dev/null +++ b/Crawler/csdn_blogs.txt @@ -0,0 +1,209 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +Python 鸭子类型:优雅的多态哲学,让代码更自由,0.00,0.00,10.0,https://blog.csdn.net/2503_92624912/article/details/160498689,CSDN用户 | 阅读 1.8k +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +从 for 循环到 yield:一文搞懂 Python 迭代器与生成器,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161144162,CSDN用户 | 阅读 7.4k +2026年最新版Python安装和PyCharm安装教程(图文详细 附安装包),0.00,0.00,10.0,https://blog.csdn.net/m0_73467482/article/details/156511914,CSDN用户 | 阅读 7.1k +【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161457480,CSDN用户 | 阅读 44 +python基于vue的流浪动物收养系统志愿者设计与开发django flask pycharm,0.00,0.00,10.0,https://blog.csdn.net/QQ1963288475/article/details/156946558,CSDN用户 | 阅读 978 +Python 中的 @property:像访问属性一样调用方法,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161202644,CSDN用户 | 阅读 7.4k +【pip / conda / uv】换源大全:2026 国内镜像最新地址,一张表搞定所有 【Python】安装卡顿,0.00,0.00,10.0,https://blog.csdn.net/qq_73472828/article/details/160525215,CSDN用户 | 阅读 1.3k +Python流程控制:break与continue语句的区别与应用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161098938,CSDN用户 | 阅读 6.7k +从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南,0.00,0.00,10.0,https://blog.csdn.net/qq_41187124/article/details/155500568,CSDN用户 | 阅读 2.2w +Python 操作金仓数据库的完全指南(上篇):连接管理与高可用,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617026,CSDN用户 | 阅读 1.5w +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +Python+AI智能体(Agent)零基础入门全攻略:原理、架构、手搓代码与实战落地,0.00,0.00,10.0,https://blog.csdn.net/2602_94956987/article/details/160419420,CSDN用户 | 阅读 1.3k +一篇看懂 Python 标识符:命名规则 + 规范 + 避坑指南,0.00,0.00,10.0,https://blog.csdn.net/2301_80026901/article/details/160413181,CSDN用户 | 阅读 2.2k +【2026 最新】Python 与 PyCharm 详细下载安装教程 带图展示(Windows 版),0.00,0.00,10.0,https://blog.csdn.net/2301_80035882/article/details/157432536,CSDN用户 | 阅读 8.7k +【Python】异常处理:从基础到进阶,0.00,0.00,10.0,https://blog.csdn.net/2303_79015671/article/details/144533265,CSDN用户 | 阅读 6.2k +Python元编程:非科班转码者的入门指南,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159760302,CSDN用户 | 阅读 1.2w +Web自动化之Selenium 超详细教程(python),0.00,0.00,10.0,https://blog.csdn.net/weixin_73953650/article/details/145730531,CSDN用户 | 阅读 2.3w +【Dify】使用 python 调用 Dify 的 API 服务,查看“知识检索”返回内容,用于前端溯源展示,0.00,0.00,10.0,https://blog.csdn.net/wsLJQian/article/details/157470958,CSDN用户 | 阅读 1.3k +Python数据统计完全指南:从入门到实战,0.00,0.00,10.0,https://blog.csdn.net/sixpp/article/details/152516371,CSDN用户 | 阅读 7.4k +Python流程控制:while循环嵌套与死循环避免技巧,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161001777,CSDN用户 | 阅读 5.8k +Python 正则表达式入门:从匹配手机号到提取文本内容,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161200803,CSDN用户 | 阅读 7.5k +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +13801黄大年茶思屋第138期(基础软件领域第三期)第1题:混部场景下高性能、低底噪的极简I/O QoS管控技术,0.00,0.00,10.0,https://blog.csdn.net/coreopt/article/details/161459642,CSDN用户 | 阅读 359 +2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑,0.00,0.00,10.0,https://blog.csdn.net/user340/article/details/158102252,CSDN用户 | 阅读 7.1k +Python 鸭子类型:优雅的多态哲学,让代码更自由,0.00,0.00,10.0,https://blog.csdn.net/2503_92624912/article/details/160498689,CSDN用户 | 阅读 1.8k +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界,0.00,0.00,10.0,https://blog.csdn.net/qq_44647100/article/details/160017406,CSDN用户 | 阅读 1.1k +2026年电脑网页游戏盘点_传奇网页游戏推荐,0.00,0.00,10.0,https://blog.csdn.net/2601_96116927/article/details/161459833,CSDN用户 | 阅读 155 +Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617170,CSDN用户 | 阅读 1.6w +Python 中的 @property:像访问属性一样调用方法,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161202644,CSDN用户 | 阅读 7.4k +AI入门踩坑实录:我换了3种语言才敢说,Python真的是入门唯一选择吗?,0.00,0.00,10.0,https://blog.csdn.net/Dreamy_zsy/article/details/160308823,CSDN用户 | 阅读 3.7w +AutoGPT+Python:让AI智能体自动完成复杂任务的终极指南,0.00,0.00,10.0,https://blog.csdn.net/2301_81152266/article/details/158353859,CSDN用户 | 阅读 4.5k +Windows本地部署Hermes Agent实录!WSL+Python部署路线详细步骤,0.00,0.00,10.0,https://blog.csdn.net/baidu_41773235/article/details/160404260,CSDN用户 | 阅读 761 +用 uv 轻松掌管你的 Python 宇宙:告别版本混乱,一键设置全局解释器,0.00,0.00,10.0,https://blog.csdn.net/qq_51553749/article/details/157765585,CSDN用户 | 阅读 1.4k +Python从0到100完整学习指南(必看导航),0.00,0.00,10.0,https://blog.csdn.net/m0_57545130/article/details/158382640,CSDN用户 | 阅读 2.5k +Fiddler抓包实战:5分钟搞定同花顺APP股票数据API获取(附Python解析代码),0.00,0.00,10.0,https://blog.csdn.net/weixin_29211309/article/details/158247385,CSDN用户 | 阅读 1.3k +Python与容器化:Docker和Kubernetes实战,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159630044,CSDN用户 | 阅读 1.3w +基于Python的医院运营数据可视化平台:设计、实现与应用(上),0.00,0.00,10.0,https://blog.csdn.net/kkiron/article/details/145614002,CSDN用户 | 阅读 4.4k +Python AI入门:从Hello World到图像分类,0.00,0.00,10.0,https://blog.csdn.net/guoyizhongxing/article/details/159324438,CSDN用户 | 阅读 5.7k +python通过API调用Coze智能体学习,0.00,0.00,10.0,https://blog.csdn.net/GHL284271090/article/details/160994302,CSDN用户 | 阅读 752 +从 for 循环到 yield:一文搞懂 Python 迭代器与生成器,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161144162,CSDN用户 | 阅读 7.4k +Python 3.12(于2023年10月2日发布)是Python的最新稳定版本之一,相比此前版本(如3.11、3.10等),0.00,0.00,10.0,https://blog.csdn.net/blog_programb/article/details/158616716,CSDN用户 | 阅读 838 +本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161452150,CSDN用户 | 阅读 151 +还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界,0.00,0.00,10.0,https://blog.csdn.net/qq_44647100/article/details/160017406,CSDN用户 | 阅读 1.1k +Day 75:【99天精通Python】人工智能应用 - 接入 OpenAI API - 给程序装上大脑,0.00,0.00,10.0,https://blog.csdn.net/weixin_52694742/article/details/157074239,CSDN用户 | 阅读 1.1k +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +在线浏览“秀人网合集”的新思路:30 行 Python 把封面图链接秒变本地可点图库,0.00,0.00,10.0,https://blog.csdn.net/cheweituya/article/details/157251686,CSDN用户 | 阅读 10.4w +一文读懂IP路由:从设备架构到核心技术,0.00,0.00,10.0,https://blog.csdn.net/2402_88096536/article/details/161458018,CSDN用户 | 阅读 348 +Python流程控制:for循环与range函数的搭配使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161067521,CSDN用户 | 阅读 7.4k +2026最新:国内直连调用Grok-4.3与免费Gemini-2.5-flash-lite(无需翻墙/OpenClaw+PyCharm+Python全场景),0.00,0.00,10.0,https://blog.csdn.net/nmdbbzcl/article/details/160992672,CSDN用户 | 阅读 2.6k +【Python 爬虫实战】抓取 BOSS 直聘,0.00,0.00,10.0,https://blog.csdn.net/2401_87126002/article/details/157483743,CSDN用户 | 阅读 3.2k +Python中一切皆对象:深入理解Python的对象模型,0.00,0.00,10.0,https://blog.csdn.net/2503_92624912/article/details/155100575,CSDN用户 | 阅读 4.6k +Python与云计算:非科班转码者的指南,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159629885,CSDN用户 | 阅读 1.3w +【Scapy】Scapy详细安装教程、功能介绍、快速上手,0.00,0.00,10.0,https://blog.csdn.net/Himan21/article/details/149858432,CSDN用户 | 阅读 4.0k +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +Python 八股文汇总,0.00,0.00,10.0,https://blog.csdn.net/Derrick__1/article/details/158806665,CSDN用户 | 阅读 1.3k +使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成),0.00,0.00,10.0,https://blog.csdn.net/2302_78391795/article/details/150619723,CSDN用户 | 阅读 4.1w +【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器,0.00,0.00,10.0,https://blog.csdn.net/Clay_K/article/details/148401006,CSDN用户 | 阅读 4.0k +【Js逆向 python】Web JS 逆向全体系详细解释,0.00,0.00,10.0,https://blog.csdn.net/2301_80637449/article/details/159132537,CSDN用户 | 阅读 2.5k +对python的再认识-基于数据结构进行-a007-集合-CURD,0.00,0.00,10.0,https://blog.csdn.net/BECOMEviolet/article/details/157912640,CSDN用户 | 阅读 920 +2026年Python就业市场分析:非科班转码者的机会与挑战,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159729470,CSDN用户 | 阅读 1.3w +Python最全面复习:从入门到精通(2026年),0.00,0.00,10.0,https://blog.csdn.net/2501_90715893/article/details/161239082,CSDN用户 | 阅读 972 +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +Python与边缘计算:非科班转码者的指南,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159675671,CSDN用户 | 阅读 1.3w +地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂,0.00,0.00,10.0,https://blog.csdn.net/2401_83233809/article/details/161454731,CSDN用户 | 阅读 4 +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617170,CSDN用户 | 阅读 1.6w +从零实现一个轻量级向量搜索引擎(Python 版),0.00,0.00,10.0,https://blog.csdn.net/picture_share/article/details/161332729,CSDN用户 | 阅读 943 +Claude-Code-python 前端改造项目工作流程详解,0.00,0.00,10.0,https://blog.csdn.net/weixin_42878111/article/details/160550285,CSDN用户 | 阅读 864 +Python 爬虫实战:Selenium 批量爬取百度图片(逐行代码超详细解析),0.00,0.00,10.0,https://blog.csdn.net/m0_66822255/article/details/161024571,CSDN用户 | 阅读 999 +Python流程控制:while循环嵌套与死循环避免技巧,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161001777,CSDN用户 | 阅读 5.8k +【2026最新Python+AI入门指南】:从零基础到实操落地,避开90%新手坑,0.00,0.00,10.0,https://blog.csdn.net/user340/article/details/157736821,CSDN用户 | 阅读 7.9k +VS code研发工具配置使用,包括python、git的配置,0.00,0.00,10.0,https://blog.csdn.net/hurong0000/article/details/160075246,CSDN用户 | 阅读 665 +Python 3.14 安装教程:新手友好版,0.00,0.00,10.0,https://blog.csdn.net/m0_69824302/article/details/153417024,CSDN用户 | 阅读 5.0k +Java安全-CC链 | CC3,0.00,0.00,10.0,https://blog.csdn.net/2501_93871563/article/details/160991726,CSDN用户 | 阅读 3.1k +2.python加解密实战,0.00,0.00,10.0,https://blog.csdn.net/m0_57385165/article/details/157332452,CSDN用户 | 阅读 1.1k +Python 开发中“使用 read() 读取大文件导致内存溢出” 问题详解,0.00,0.00,10.0,https://blog.csdn.net/jjj_web/article/details/160972045,CSDN用户 | 阅读 811 +Python 中的 sqlite3 模块:轻量级数据库的完美搭档,0.00,0.00,10.0,https://blog.csdn.net/weixin_40266856/article/details/156835297,CSDN用户 | 阅读 3.3k +Blender 3.x Python 脚本编程(一),0.00,0.00,10.0,https://blog.csdn.net/wizardforcel/article/details/158378453,CSDN用户 | 阅读 3.0k +超越Python:下一步该学什么编程语言?,0.00,0.00,10.0,https://blog.csdn.net/m0_56135967/article/details/157555149,CSDN用户 | 阅读 1000 +一文吃透贝叶斯算法:从数学原理到 Python 代码实战(附完整可运行案例),0.00,0.00,10.0,https://blog.csdn.net/m0_74398756/article/details/158664045,CSDN用户 | 阅读 1.3k +全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表,0.00,0.00,10.0,https://blog.csdn.net/taotao_guiwang/article/details/156749455,CSDN用户 | 阅读 1.6w +Python流程控制:while循环嵌套与死循环避免技巧,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161001777,CSDN用户 | 阅读 5.8k +Python AI入门:从Hello World到图像分类,0.00,0.00,10.0,https://blog.csdn.net/guoyizhongxing/article/details/159324438,CSDN用户 | 阅读 5.7k +Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617170,CSDN用户 | 阅读 1.6w +实测CSDN AI数字营销会员:创作者效率与曝光的双重提升体验报告,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161451272,CSDN用户 | 阅读 62 +2.python加解密实战,0.00,0.00,10.0,https://blog.csdn.net/m0_57385165/article/details/157332452,CSDN用户 | 阅读 1.1k +Python 测试实战指南:单元、集成、端到端测试边界对比、发版焦虑破解与电商下单链路优化,0.00,0.00,10.0,https://blog.csdn.net/windowshht/article/details/159627343,CSDN用户 | 阅读 853 +【课程设计/毕业设计】基于Python的外卖配送分析与可视化系统的设计与实现【附源码、数据库、万字文档】,0.00,0.00,10.0,https://blog.csdn.net/2501_91703026/article/details/158585314,CSDN用户 | 阅读 1.3k +【Python 爬虫实战】抓取 BOSS 直聘,0.00,0.00,10.0,https://blog.csdn.net/2401_87126002/article/details/157483743,CSDN用户 | 阅读 3.2k +一文读懂IP路由:从设备架构到核心技术,0.00,0.00,10.0,https://blog.csdn.net/2402_88096536/article/details/161458018,CSDN用户 | 阅读 354 +还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界,0.00,0.00,10.0,https://blog.csdn.net/qq_44647100/article/details/160017406,CSDN用户 | 阅读 1.1k +Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题),0.00,0.00,10.0,https://blog.csdn.net/chen_si_shang_/article/details/161293640,CSDN用户 | 阅读 850 +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +计算机毕业设计Python+AI大模型空气质量预测分析(可定制城市) 空气质量可视化 空气质量爬虫 机器学习 深度学习 大 数据毕业设计,0.00,0.00,10.0,https://blog.csdn.net/spark2022/article/details/161241598,CSDN用户 | 阅读 870 +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑,0.00,0.00,10.0,https://blog.csdn.net/user340/article/details/158102252,CSDN用户 | 阅读 7.1k +【Python】基础语法入门(一),0.00,0.00,10.0,https://blog.csdn.net/2301_78257800/article/details/154902322,CSDN用户 | 阅读 6.3k +Playwright Python Windows 下 headful Chromium 崩溃排查经验分享,0.00,0.00,10.0,https://blog.csdn.net/zhangshaohua1603/article/details/158350679,CSDN用户 | 阅读 1.0k +Python中秋月圆夜:手把手实现月相可视化,用代码赏千里共婵娟,0.00,0.00,10.0,https://blog.csdn.net/m0_55394328/article/details/152602293,CSDN用户 | 阅读 3.1w +【机器学习第三期(Python)】CatBoost 方法原理详解,0.00,0.00,10.0,https://blog.csdn.net/qq_44246618/article/details/149022812,CSDN用户 | 阅读 2.2k +Python之三大基本库——Pandas(1),0.00,0.00,10.0,https://blog.csdn.net/m0_61746796/article/details/153201960,CSDN用户 | 阅读 4.5k +海洋光学(Ocean Insight,原 Ocean Optics)确实提供了面向 Python 的官方封装库,主要包括 OceanDirect(底层硬件通信)和基于其封装的高层库(如pyocean/,0.00,0.00,10.0,https://blog.csdn.net/womrenet/article/details/156466272,CSDN用户 | 阅读 1.2k +【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161132354,CSDN用户 | 阅读 2.8k +【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析,0.00,0.00,10.0,https://blog.csdn.net/weixin_62043600/article/details/160531542,CSDN用户 | 阅读 5.1k +java中的进程的详细解析,0.00,0.00,10.0,https://blog.csdn.net/yu____yuan/article/details/161049661,CSDN用户 | 阅读 818 +懂你所需,利爪随行:MateClaw 正式开源,补齐 Java 生态的 AI Agent 拼图,0.00,0.00,10.0,https://blog.csdn.net/bufegar0/article/details/159846780,CSDN用户 | 阅读 2.0k +我的workflow设置居然被赞扬了,0.00,0.00,10.0,https://blog.csdn.net/stereohomology/article/details/161384575,CSDN用户 | 阅读 477 +【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161347182,CSDN用户 | 阅读 682 +Harness实战指南,在Java Spring Boot项目中规范落地OpenSpec+Claude Code,0.00,0.00,10.0,https://blog.csdn.net/u013970991/article/details/159902907,CSDN用户 | 阅读 1.9k +用 python 和 java 分别写出10道经典题,0.00,0.00,10.0,https://blog.csdn.net/2501_94434623/article/details/160901197,CSDN用户 | 阅读 1.4k +基于Java Web的医疗诊治系统的设计与实现 --毕设附源码42197,0.00,0.00,10.0,https://blog.csdn.net/VX_DZbishe/article/details/157900907,CSDN用户 | 阅读 1.3k +字节跳动官网 bytedance.com 完整工程复刻,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161459714,CSDN用户 | 阅读 31 +Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题),0.00,0.00,10.0,https://blog.csdn.net/chen_si_shang_/article/details/161293640,CSDN用户 | 阅读 850 +Java 大视界 -- Java+Spark 构建企业级用户画像平台:从数据采集到标签输出全流程(437),0.00,0.00,10.0,https://blog.csdn.net/atgfg/article/details/156062867,CSDN用户 | 阅读 5.3k +语义解析革命:飞算JavaAI三层架构重塑企业级代码生成链路,0.00,0.00,10.0,https://blog.csdn.net/m0_74385041/article/details/150289635,CSDN用户 | 阅读 9.7k +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透,0.00,0.00,10.0,https://blog.csdn.net/2401_89723786/article/details/157733289,CSDN用户 | 阅读 607 +Java 大视界 -- 基于 Java+Flink 构建实时风控规则引擎:动态规则配置与热更新(446),0.00,0.00,10.0,https://blog.csdn.net/atgfg/article/details/157333442,CSDN用户 | 阅读 3.3k +第三篇:《手把手搭建Selenium WebDriver测试环境(Java/Python)》,0.00,0.00,10.0,https://blog.csdn.net/qq_45239623/article/details/160394399,CSDN用户 | 阅读 785 +基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版),0.00,0.00,10.0,https://blog.csdn.net/2301_80863610/article/details/151295847,CSDN用户 | 阅读 31.8w +Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构,0.00,0.00,10.0,https://blog.csdn.net/lilinhai548/article/details/156422566,CSDN用户 | 阅读 4.1k +【Linux系统】线程(上),0.00,0.00,10.0,https://blog.csdn.net/Miun123/article/details/161121946,CSDN用户 | 阅读 652 +Java 连接 Elasticsearch 8.x 安全模式实战:证书校验与 ApiKey 认证全解析,0.00,0.00,10.0,https://blog.csdn.net/hdk5855/article/details/158583924,CSDN用户 | 阅读 985 +【C++】 继承与多态(中),0.00,0.00,10.0,https://blog.csdn.net/2602_95649725/article/details/161196506,CSDN用户 | 阅读 1.8k +Linux C++ 高并发编程:从原理到手撕,线程池全链路深度解析,0.00,0.00,10.0,https://blog.csdn.net/2503_91389547/article/details/160339478,CSDN用户 | 阅读 3.6k +开发一个好用的真全屏手持弹幕微信小程序(一),0.00,0.00,10.0,https://blog.csdn.net/Mr_BT/article/details/161459391,CSDN用户 | 阅读 94 +【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161132354,CSDN用户 | 阅读 2.8k +【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析,0.00,0.00,10.0,https://blog.csdn.net/weixin_62043600/article/details/160531542,CSDN用户 | 阅读 5.1k +Java实习模拟面试之多益网络苏州二面:聚焦游戏服务端开发、Redis高可用与JVM线程池深度追问,0.00,0.00,10.0,https://blog.csdn.net/2402_84764726/article/details/157393528,CSDN用户 | 阅读 1.0k +Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透,0.00,0.00,10.0,https://blog.csdn.net/2401_89723786/article/details/157733289,CSDN用户 | 阅读 607 +【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161457480,CSDN用户 | 阅读 45 +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?,0.00,0.00,10.0,https://blog.csdn.net/2402_87298751/article/details/159087816,CSDN用户 | 阅读 1.8k +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态,0.00,0.00,10.0,https://blog.csdn.net/2302_79751907/article/details/149275967,CSDN用户 | 阅读 3.7k +Java:猜数字游戏,0.00,0.00,10.0,https://blog.csdn.net/2503_94683681/article/details/161258233,CSDN用户 | 阅读 5.5k +Java 开发者如何搞定百度地图 SN 权限签名实践-以搜索2.0接口为例,0.00,0.00,10.0,https://blog.csdn.net/yelangkingwuzuhu/article/details/151289695,CSDN用户 | 阅读 9.5k +Bun替代Nodejs,JavaScrpit运行新环境-Bun,更快、更现代的开发体验,0.00,0.00,10.0,https://blog.csdn.net/m0_57874805/article/details/150647891,CSDN用户 | 阅读 2.6k +Java Stream妙用:Collectors.toMap详解,轻松实现集合转一对一Map,0.00,0.00,10.0,https://blog.csdn.net/qq_41840843/article/details/158383692,CSDN用户 | 阅读 3.9k +Linux:基础指令(二),0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/161036706,CSDN用户 | 阅读 3.4k +2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle),0.00,0.00,10.0,https://blog.csdn.net/Moss_co/article/details/148425265,CSDN用户 | 阅读 3.4w +C++快速上手java备战期末考——初识java,0.00,0.00,10.0,https://blog.csdn.net/2502_94353935/article/details/160992548,CSDN用户 | 阅读 1.5k +Java+Vue开发者必看:Open Code、Claude Code、Trae、Coze 四大AI开发工具深度测评(含免费/付费对比),0.00,0.00,10.0,https://blog.csdn.net/qq_35452726/article/details/159687764,CSDN用户 | 阅读 1.4k +Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code,0.00,0.00,10.0,https://blog.csdn.net/qq_22903677/article/details/160000361,CSDN用户 | 阅读 878 +Javascript.8——ES6【Promise的静态方法】,0.00,0.00,10.0,https://blog.csdn.net/weixin_63215361/article/details/157614292,CSDN用户 | 阅读 877 +地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂,0.00,0.00,10.0,https://blog.csdn.net/2401_83233809/article/details/161454731,CSDN用户 | 阅读 4 +2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle),0.00,0.00,10.0,https://blog.csdn.net/Moss_co/article/details/148425265,CSDN用户 | 阅读 3.4w +Java 大视界 -- Java 大数据机器学习模型在金融风险管理体系构建与风险防范能力提升中的应用(435),0.00,0.00,10.0,https://blog.csdn.net/atgfg/article/details/155947715,CSDN用户 | 阅读 2.8k +Java——标准序列化机制,0.00,0.00,10.0,https://blog.csdn.net/cold___play/article/details/161107932,CSDN用户 | 阅读 3.5k +Java前缀和算法题目练习,0.00,0.00,10.0,https://blog.csdn.net/2401_89019969/article/details/151975418,CSDN用户 | 阅读 3.1k +Python 入门教程系列,0.00,0.00,10.0,https://blog.csdn.net/weixin_30720461/article/details/161396374,CSDN用户 | 阅读 1.3k +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +Java GC 面试必问三件套,0.00,0.00,10.0,https://blog.csdn.net/2504_94294476/article/details/160668120,CSDN用户 | 阅读 728 +突破平台限制:iOS设备运行Minecraft Java版完全指南,0.00,0.00,10.0,https://blog.csdn.net/gitblog_00466/article/details/157378543,CSDN用户 | 阅读 2.0w +企业级 Java 登录注册系统构建指南(附核心代码与配置),0.00,0.00,10.0,https://blog.csdn.net/m0_67187271/article/details/151104099,CSDN用户 | 阅读 1.9k +Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透,0.00,0.00,10.0,https://blog.csdn.net/2401_89723786/article/details/157733289,CSDN用户 | 阅读 607 +Adoptium Temurin JDK 下载,0.00,0.00,10.0,https://blog.csdn.net/weixin_42346831/article/details/148632858,CSDN用户 | 阅读 5.2k +HarmonyOS ArkWeb 系列之precompileJavaScript:提前编译 JS 脚本,告别解析等待,0.00,0.00,10.0,https://blog.csdn.net/qq_33681891/article/details/161185190,CSDN用户 | 阅读 1.5w +Java+SpringAI企业级实战项目完整官方文档(生产终版),0.00,0.00,10.0,https://blog.csdn.net/wbkang/article/details/160586573,CSDN用户 | 阅读 4.0k +高级java每日一道面试题-2025年12月31日-实战篇[Docker]-Docker Swarm 的 Routing Mesh 是如何工作的?,0.00,0.00,10.0,https://blog.csdn.net/qq_43071699/article/details/161195524,CSDN用户 | 阅读 792 +基于Java标准库读取CSV实现天地图POI分类快速导入PostGIS数据库实战,0.00,0.00,10.0,https://blog.csdn.net/yelangkingwuzuhu/article/details/149454785,CSDN用户 | 阅读 9.3k +【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161347182,CSDN用户 | 阅读 682 +JavaScript异步编程 Async/Await 使用详解:从原理到最佳实践,0.00,0.00,10.0,https://blog.csdn.net/lhmyy521125/article/details/147932219,CSDN用户 | 阅读 8.0k +java中的进程的详细解析,0.00,0.00,10.0,https://blog.csdn.net/yu____yuan/article/details/161049661,CSDN用户 | 阅读 818 +【C++】 继承与多态(中),0.00,0.00,10.0,https://blog.csdn.net/2602_95649725/article/details/161196506,CSDN用户 | 阅读 1.8k +【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161347182,CSDN用户 | 阅读 682 +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +智能写字机器人开发全解析,0.00,0.00,10.0,https://blog.csdn.net/2401_88863003/article/details/161457761,CSDN用户 | 阅读 105 +C++_string增删查改模拟实现,0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/155094868,CSDN用户 | 阅读 2.5k +Java——标准序列化机制,0.00,0.00,10.0,https://blog.csdn.net/cold___play/article/details/161107932,CSDN用户 | 阅读 3.5k +【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析,0.00,0.00,10.0,https://blog.csdn.net/weixin_62043600/article/details/160531542,CSDN用户 | 阅读 5.1k +Java之泛型,0.00,0.00,10.0,https://blog.csdn.net/wmh_1234567/article/details/141270616,CSDN用户 | 阅读 1.1w +苍穹外卖 项目最终总结,0.00,0.00,10.0,https://blog.csdn.net/2401_88612756/article/details/161456400,CSDN用户 | 阅读 280 +【Java 开发日记】设计一个支持万人同时抢购商品的秒杀系统?,0.00,0.00,10.0,https://blog.csdn.net/2402_87298751/article/details/156869453,CSDN用户 | 阅读 6.9k +【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161132354,CSDN用户 | 阅读 2.8k +模仿淘宝购物系统的Java Web前端项目(开源项目),0.00,0.00,10.0,https://blog.csdn.net/rej177/article/details/125535688,CSDN用户 | 阅读 1.4w +【C++】C++——类的默认成员函数(构造、析构、拷贝构造函数),0.00,0.00,10.0,https://blog.csdn.net/zore__/article/details/160190541,CSDN用户 | 阅读 1.9k +学生职业选择对cpp/c++以及后端java go的迷茫,0.00,0.00,10.0,https://blog.csdn.net/weixin_52259848/article/details/158290665,CSDN用户 | 阅读 970 +大模型开发 - 零手写 AI Agent:深入理解 ReAct 模式与 Java 实现,0.00,0.00,10.0,https://blog.csdn.net/yangshangwei/article/details/157644609,CSDN用户 | 阅读 2.4k +【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用),0.00,0.00,10.0,https://blog.csdn.net/qq_51572290/article/details/154535381,CSDN用户 | 阅读 1.3w +Java GC 面试必问三件套,0.00,0.00,10.0,https://blog.csdn.net/2504_94294476/article/details/160668120,CSDN用户 | 阅读 728 +初识java,0.00,0.00,10.0,https://blog.csdn.net/2503_94683681/article/details/161200453,CSDN用户 | 阅读 5.5k +JDK自带监控工具:jstat、jmap、jstack的使用指南(附命令示例),0.00,0.00,10.0,https://blog.csdn.net/qq_41803278/article/details/156835773,CSDN用户 | 阅读 2.2k +【技术架构】从单机到微服务:Java 后端架构演进与技术选型核心方案,0.00,0.00,10.0,https://blog.csdn.net/2302_79806056/article/details/151361712,CSDN用户 | 阅读 3.1k +Resilience4j- 非 Spring 环境集成:纯 Java 项目中的手动配置实现,0.00,0.00,10.0,https://blog.csdn.net/qq_41187124/article/details/157544457,CSDN用户 | 阅读 2.2w +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +Java GC 面试必问三件套,0.00,0.00,10.0,https://blog.csdn.net/2504_94294476/article/details/160668120,CSDN用户 | 阅读 728 +2024年软件设计师中级(软考中级)详细笔记【6】(下午题)试题6 Java 23种设计模式解题技巧(分值15),0.00,0.00,10.0,https://blog.csdn.net/XFanny/article/details/143078263,CSDN用户 | 阅读 1.1w +我的workflow设置居然被赞扬了,0.00,0.00,10.0,https://blog.csdn.net/stereohomology/article/details/161384575,CSDN用户 | 阅读 482 +【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/160900873,CSDN用户 | 阅读 2.0k +Spring Cloud Alibaba 2025.1.0.0 正式发布:拥抱 Spring Boot 4.0 与 Java 21+ 的新时代,0.00,0.00,10.0,https://blog.csdn.net/lilinhai548/article/details/158038123,CSDN用户 | 阅读 5.0k +飞算JavaAI编程助手在IDEA中的安装教程:本地安装、离线安装、在线安装方法大全,0.00,0.00,10.0,https://blog.csdn.net/qq_44866828/article/details/148776780,CSDN用户 | 阅读 5.4k +Java开发新变革!飞算JavaAI深度剖析与实战指南,0.00,0.00,10.0,https://blog.csdn.net/beautifulmemory/article/details/149032692,CSDN用户 | 阅读 1.5w +本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161452150,CSDN用户 | 阅读 153 +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +C++_string增删查改模拟实现,0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/155094868,CSDN用户 | 阅读 2.5k +飞算JavaAI:专为Java开发者打造的智能编程革命,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/149044619,CSDN用户 | 阅读 2.4w +虚拟线程(Virtual Threads)使用指南(Java 21+),0.00,0.00,10.0,https://blog.csdn.net/weixin_45483057/article/details/156154988,CSDN用户 | 阅读 1.7k +Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题),0.00,0.00,10.0,https://blog.csdn.net/chen_si_shang_/article/details/161293640,CSDN用户 | 阅读 850 +Cast Attack:Java 中 Ghost Bits(幽灵比特)引发的新型安全威胁——Java 生态里被忽视的底层风险引发一系列绕过,0.00,0.00,10.0,https://blog.csdn.net/weixin_43526443/article/details/160601018,CSDN用户 | 阅读 2.4k +SpringAI Agent开发秘籍:让javaer也可以用上Agent Skills,0.00,0.00,10.0,https://blog.csdn.net/liuyueyi25/article/details/157466255,CSDN用户 | 阅读 2.6k +【Java 开发日记】finally 释放的是什么资源?,0.00,0.00,10.0,https://blog.csdn.net/2402_87298751/article/details/154342798,CSDN用户 | 阅读 2.6k +java八股——redis,0.00,0.00,10.0,https://blog.csdn.net/m0_53631504/article/details/159161047,CSDN用户 | 阅读 1.4k +Android Studio更改项目使用的JDK,0.00,0.00,10.0,https://blog.csdn.net/qq_37945670/article/details/143814764,CSDN用户 | 阅读 2.8w +Linux:基础指令(二),0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/161036706,CSDN用户 | 阅读 3.4k +Java飞书机器人实战:5分钟搞定消息推送(附完整代码),0.00,0.00,10.0,https://blog.csdn.net/weixin_28347369/article/details/159184456,CSDN用户 | 阅读 891 diff --git a/Crawler/dangdang_books.json b/Crawler/dangdang_books.json new file mode 100644 index 0000000..16a2362 --- /dev/null +++ b/Crawler/dangdang_books.json @@ -0,0 +1,239 @@ +[ + {"title":" 陪安东尼度过漫长岁月 全六册 加赠亲签明信片 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m8.ddimg.cn/54/3/29680848-1_b_1779433977.jpg","author":"安东尼"}, + {"title":" 小清欢【印特签版+当当定制贴纸】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"云拿月"}, + {"title":" 红:陪安东尼度过漫长岁月Ⅰ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 没有明天的我们,在昨天相恋【当当定制衔尾蛇镭射怀表X2】第八届网络小说大奖获奖作品","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"星火燎原"}, + {"title":" 那个不为人知的故事 Twentine(无量渡口)BE美学代表作品","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Twentine"}, + {"title":" 朝俞1+2伪装学渣 限定正面白版护封+背面黑版护封套装 青春畅销小说实体书 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 红酒绿 苏他代表作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"苏他"}, + {"title":" 奇洛李维斯回信(高人气作者清明谷雨口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"清明谷雨"}, + {"title":" 他笑时风华正茂【印特签版+当当专享印制作者手写明信片】舒远","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒远"}, + {"title":" 渡厄【印签版+当当定制信纸x2】杨溯","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"杨溯"}, + {"title":" 蓝:陪安东尼度过漫长岁月VI(首发加赠当当限定赠品:PET菲林胶片x2张)陪安系列的15年暖心陪伴","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 元气少女缘结神:鞍马山夜话(甜蜜少女系漫画官方中文纪念版首次上市!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Haruka"}, + {"title":" 陪安东尼度过漫长岁月","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 他在云之南 印特签 景行高人气经典口碑力作 相遇十年典藏版 新增万字番外+作者前言","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"景行"}, + {"title":" 青:陪安东尼度过漫长岁月5","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 别踮脚我低头印签版 当当定制关于你的拍立得 纯爱言情作者君不弃校园甜宠悸动之作 网络原名她不乖要哄","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"君不弃"}, + {"title":" 青:陪安东尼度过漫长岁月Ⅴ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 梦蝶庄生(网络原名:还剩三个月命请让我从容赴S)番茄9.8高分BE美学力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"高卧北"}, + {"title":" 退烧(全二册)舒虞浪漫新作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒虞"}, + {"title":" 与岁长宁 上册 追光救赎 高口碑古言 嫁反派 娇娇贵女x乖张美强惨 反派 男主 她是他心尖上的善念 是刻在他伤痕上的名字","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"布丁琉璃"}, + {"title":" 渡夏天","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"甜野豹"}, + {"title":" 蓝:陪安东尼度过漫长岁月VI 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 人鱼陷落:完结篇 畅销书作者麟潜口碑代表作!","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 《你是长夜,也是灯火》典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"岁惟"}, + {"title":" 人鱼陷落全五册(畅销书作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 橙:陪安东尼度过漫长岁月Ⅱ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 深情眼(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"耳东兔子"}, + {"title":" 晋江人气作者木羽愿高口碑双向奔赴代表作《纵我情深》破镜重圆vs蓄谋已久,全文高甜!新增出版番外《婚后生活》,续写“傅姜夫","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木羽愿"}, + {"title":" 人鱼陷落(高人气作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 打火机与公主裙(荒草园+长明灯)全2册 Twentine著 陈飞宇、张婧仪 主演影视剧“点燃我,温暖你”原著小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Twentine"}, + {"title":" 《阿也(全二册)》刷边典藏版 我喜欢你的信息素 引路星 全新番外","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"引路星"}, + {"title":" 纸飞机1+2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"潭石"}, + {"title":" 人鱼陷落3(长佩原创人气文学,高人气作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 最好的我们:全三册(八月长安“振华中学”系列代表作,十周年典藏版。新增 10P后记《罗德赛塔西亚是一封情书》)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"八月长安"}, + {"title":" 骄阳似我下 完结篇 印签版 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"顾漫"}, + {"title":" 我不喜欢这世界,我只喜欢你修订版 乔一 畅销百万册!由吴倩张雨剑主演的超甜电视剧我只喜欢你原著小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"乔一"}, + {"title":" 你失信了","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"十清杳"}, + {"title":" 缠 网络原名《真香》 ,《二锅水》作者烟猫与酒“治愈”向代表作 年度情感催泪大戏,一段“心”连接的亲情 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"烟猫与酒"}, + {"title":" 太岁(《杀破狼》《残次品》《默读》《镇魂》作者、高人气畅销书作家Priest无CP力作)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Priest"}, + {"title":" 人鱼陷落2(高人气作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 《别来无恙》晋江文学城畅销书作家 北南 经典虐心作品原著同名漫画 破镜重圆天花板","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"北南"}, + {"title":" 朝俞1+2套装(全2册)原名伪装学渣 现象级青春小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 告白2完结篇 王星越 邓恩熙同名电视剧 赠手绘卡片+告白信+贴纸+婚礼请柬+海报+登机牌+藏书票+书签 应橙暗恋作品新增","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"应橙"}, + {"title":" 旧故新长:诗无茶代表作青春文学治愈系小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"诗无茶"}, + {"title":" 拉勾(全2册)春风榴火作品,网络原名:我是顶流巨星亲孙女","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"春风榴火"}, + {"title":" 有匪全集(赵丽颖、王一博主演《有翡》原著小说。Priest扛鼎之作,全4册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Priest"}, + {"title":" 黄粱遗梦【当当网印签版】人气作家高卧北催泪力作!","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"高卧北"}, + {"title":" 伪装学渣未删减12这题超纲了朝俞七芒星逐夏一觉醒来全套完结篇【木瓜黄小说合集】木瓜黄伪装学渣经典青春文学小说作品合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 那个不为人知的故事 寂静深处有人家 Twentine(无量渡口) 名利场人 朝暮不相迟 以你为名的夏天 她等待刀锋已久","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 梦蝶庄生 黄粱遗梦 套装 高卧北","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"高卧北"}, + {"title":" 难哄 2册全集 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 神之陨落2 限量印特签 网络名《杀穿副本后,我在规则里养大邪神》番茄小说人气作者白桃呜呜龙无限流大作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"白桃呜呜龙"}, + {"title":" 网恋被骗八百次","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"熊也"}, + {"title":" 人鱼陷落4(畅销书作者麟潜口碑代表作!当当专享电子屏保)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 你说巧不巧 全二册 久别重逢+破镜重圆,双向奔赴的轻松甜暖之作 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"张不一"}, + {"title":" 扶华合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 绿:陪安东尼度过漫长岁月Ⅳ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 《铜雀锁金钗》民国虐心必看 榜单神作 人气作者 世味煮茶","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"世味煮茶"}, + {"title":" 骄阳似我上下 两册套装 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"顾漫"}, + {"title":" 八月的尾声,宛如世界末日 当当定制爱的箴言贺卡 电击小说大奖得主天泽夏月深情力作BE轻小说TOP","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m8.ddimg.cn/29/19/29934758-1_b_1755252822.jpg","author":"天泽夏月"}, + {"title":" 树下有片红房子(上下册)(青春群像小说,青梅竹马,暖甜治愈,体育生vs学霸)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小格"}, + {"title":" 偷月亮给你【亲签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"患者阿离"}, + {"title":" 《雪粒镇》(百万粉丝故事博主尸姐现实向长篇爱情小说力作。双向救赎X悬疑治愈,暗黑X光明,亲情X爱情)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"屋里丝丝"}, + {"title":" 你的名字。(新海诚亲笔撰写,同名电影原作小说简体中文版,撩动万千观众的青春情怀)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"新海诚"}, + {"title":" 青+蓝:陪安东尼度过漫长岁月V+VI 双册套装","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 可爱过敏原:全2册(人气作家稚楚温馨之作。随书附赠多重主题赠品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"稚楚"}, + {"title":" 第一瞳术师","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"喵喵大人"}, + {"title":" 你好,这种情况持续多久了(高人气作者温泉笨蛋治愈系甜文口碑代表作!随书附赠:折立卡+明信片+海报+书签+印刷特签)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"温泉笨蛋"}, + {"title":" 如果这一秒我没遇见你 张凌赫 王楚然主演 这一秒过火原著小说 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"匪我思存"}, + {"title":" 朝思慕暖","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼霜"}, + {"title":" 《最爱你的那十年》典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"无仪宁死"}, + {"title":" 提灯照河山(淮上作品,当当专享人物透卡)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"淮上"}, + {"title":" 夜幕之下全套123456789101112小说斩神凡尘神域三九音域我在精神病院学斩神漫画版 新番外徽章周边言情青春文学畅","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 营业悖论.完结篇:全2册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"稚楚"}, + {"title":" 偏偏宠爱(新版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"藤萝为枝"}, + {"title":" 我要你哄我 9.5分万人热评 80万人在线阅读娱乐圈恋综甜文 深藏不露小明星×高傲冷酷大歌神” 原来喜欢到了极致也会让人","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"幼儿园的卡耐基"}, + {"title":" 南北西东【当当特签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"拉面土豆丝"}, + {"title":" 《铜雀锁金钗2》民国虐心必看 人气作者 世味煮茶 桀骜不驯司令官 段烨霖 × 清冷傲人药铺大夫 许少棠","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"世味煮茶"}, + {"title":" 就我机灵(网络原名:百万UP学神天天演我 青春小说作家小霄轻松r热血校园力作!双标极致・追星成功・学神百大up窦晟 VS","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小霄"}, + {"title":" 我为你翻山越岭 限量印特签 人气作者小合鸽鸟子青春逐梦口碑作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小合鸽鸟子"}, + {"title":" 她的小梨涡","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唧唧的猫"}, + {"title":" 棠木依旧(人气作者米花BE美学短篇集)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"米花"}, + {"title":" 清明谷雨","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 有的是时间","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒远"}, + {"title":" 爱了很久的朋友","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"枝玖"}, + {"title":" 等风热吻你(7月5日19:00-7月6日24:00限时印特签,畅销书作家唧唧的猫口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唧唧的猫"}, + {"title":" 亿万斯年【特签版+当当定制一眼万年拍立得X2】高口碑作者狄戈浪漫缱绻之作典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"狄戈"}, + {"title":" 退烧 她他 望北楼 含栀 十里雾 棠木依旧(BE美学) 肆意 月下娇 心软 来我怀里躲躲 余生,请多指教 乖一点 当当自","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 微微一笑很倾城","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"顾漫"}, + {"title":" 黄:陪安东尼度过漫长岁月Ⅲ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 青玄","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"未小兮"}, + {"title":" 蔷薇信号(印签版)双女主青春成长短篇故事集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"艾姬"}, + {"title":" 磨牙(全2册)舒虞新作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒虞"}, + {"title":" 告白 王星越 邓恩熙同名电视剧 赠珠光明信片+海报+语音卡+立卡等人气作者应橙温柔细腻暗恋作品痞帅深情周京泽×温软坚定许","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"应橙"}, + {"title":" 附加遗产全两册无删减【赠送超清海报+异形卡+书签+贴纸】当当自营正版水千丞作品集深渊游戏火焰戎装逆锋逐王魂兵之戈 水千丞","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 你听你听,是那时候的声音","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"帘十里"}, + {"title":" 翻车指南(酱子贝代表作 网络原名:网恋翻车指南 全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酱子贝"}, + {"title":" 《我亲爱的法医小姐1+2》(全4册)磁扣盒装典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酒暖春深"}, + {"title":" 空白页 全两册 作者特签版 晋江金榜作家咬枝绿高口碑酸涩暗恋文 穷小子和小公主 新增未公开番外美梦成真 当当自营图书","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"咬枝绿"}, + {"title":" 含栀 印签版 当当定制半枝宇宙钻石卡X2 晋江人气作家鹿灵暗恋成真代表作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鹿灵"}, + {"title":" 融夏(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"话眠"}, + {"title":" 等我逢景+等我遇繁全2册【随书多重赠品】酱子贝文代表作 我等你很久了青春文学畅销实体书 磨铁图书当当自营正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 南方海啸 高人气作者卡比丘口碑力作 赵竞 韦嘉易 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"卡比丘"}, + {"title":" 《一级律师?典藏版(全三册)》人气作者木苏里 星际幻想力作 星际一级律师 顾晏×燕绥之 师生重逢,联手共寻基因真相 公理","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木苏里"}, + {"title":" 《祁望》祁纪之恋、娱乐圈、诟病、人气作者池总渣深情走心之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"池总渣"}, + {"title":" 苍兰诀 (当当专享人气画手眠狼绘制印刷海报)九鹭非香","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"九鹭非香"}, + {"title":" 海棠微雨共归途","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"肉包不吃肉"}, + {"title":" 海棠微雨共归途全套123456完结篇病案本第一辑 肉包不吃肉系列作品原小说二哈和他的白猫师尊实体书籍 海棠微雨共归途全套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 皇上与我共战袍(上下)言情 爱情小说古代穿越 蔷薇书院","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"茴笙"}, + {"title":" 全世界都知道全二册 印签版 当当定制Q萌取景器透卡 网络原名全世界都知道她爱我 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼霜"}, + {"title":" 十里雾【特签版+当当定制流年日记本】BE美学意难平酸涩催泪之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"行迟"}, + {"title":" 【任选】她的山她的海3漫画&小说版&漫画单行本123全套 未删减【首刷限量胶片+印签绘+光栅卡+拍立得+折立卡等】限定花","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 春山喧 作者印特签版 番茄小说高人气娱乐圈竞技言情 被读者称为“姐狗文学天花板”","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"彼呦"}, + {"title":" 小清欢 云拿月 我欲将心养明月 多梨 低音调 初恋 雪梨 肆火 树延 偷月亮给你 患者阿离 人间情诗 佩奇酱 落雪满南山","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 橘子汽水(独家定制阿司匹林电子签名数字藏品――白城“舟渔”签名卡)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"阿司匹林"}, + {"title":" 雾色妄想全2册特签版 当当定制梨涡妹妹唱片CD透卡 高人气口碑作者一剪月璀璨暗恋之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"一剪月"}, + {"title":" 等我逢景+等我遇繁【文轩飞机盒定制版】放学等我完结篇 另著翻车指南 我行让我上 我等你很久了 世纪网缘 酱子贝文代表作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酱子贝"}, + {"title":" 诡界 谷悬小镇 特签版 作者夜来风雨声高口碑作品,网络原名《因为谨慎而过分凶狠》","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"夜来风雨声"}, + {"title":" 【麟潜小说合集】人鱼陷落全套12345完结篇人鱼陷落漫画蝶变123垂耳执事影成双遵命 人气作家麟潜经典青春文学小说作品合","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m7.ddimg.cn/50/15/11704168427-1_b_1720147472.jpg","author":"当当网"}, + {"title":" 黑天(全二册)护封典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木苏里"}, + {"title":" 我亲爱的法医小姐1+2(全4册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酒暖春深"}, + {"title":" 人鱼陷落全四册(畅销书作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 十五年等待候鸟完美纪念版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"盈风"}, + {"title":" 可爱多少钱一斤(共2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"栖见"}, + {"title":" 烟花","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"岩井俊二"}, + {"title":" 锦鲤游戏2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"夏季稻谷香"}, + {"title":" 【随机亲签】她的山她的海小说 扶华著【赠海报+印签绘+名卡+立卡等】当当自营正版未删减版继续献鱼末世第十年四十年后的爱人","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"扶华"}, + {"title":" 折枝:古风作家困倚危楼内地首次正式出版作品","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"困倚危楼"}, + {"title":" 难哄 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 女寝大逃亡1234全册完结篇 无删减【赠多张祝福卡+漫画豆本+折页+海报+学生档案卡】当当自营正版新锐青春作者火茶无限流","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 宁愿(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"藤萝为枝"}, + {"title":" 新婚燕尔(晋江高人气作家姜之鱼浪漫甜蜜力作)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"姜之鱼"}, + {"title":" 《尤物・情钟篇》人气作者二喜口碑破圈代表作,百万读者追更!穷追不舍总裁周易vs清冷美艳女主姜迎,十年暗恋,双向救赎,势均","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"二喜"}, + {"title":" 悲伤逆流成河","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"郭敬明"}, + {"title":" 附加遗产套装两册无删减【赠送超清海报+异型卡+书签+贴纸】当当自营正版 广东旅游出版社 新华书店正版保障","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"水千丞"}, + {"title":" 暗恋这件难过的小事","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"孟栀晚"}, + {"title":" 骄阳似我","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 你想都不要想(白月光口碑校园文,七寸汤包甜文代表作,随书附赠:精美书签+双人反差萌Q版折立卡2个+手绘海报)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"七寸汤包"}, + {"title":" 见天光(网络原名:暗河长明)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"冷山"}, + {"title":" 一枝 上下 完结篇 套装 绿山","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"绿山"}, + {"title":" 眼中星3 完结篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"蓝淋"}, + {"title":" 神之陨落(限量印签,网络名《杀穿副本后,我在规则里养大邪神》)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"白桃呜呜龙"}, + {"title":" 赤别【当当定制透卡】十清杳","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"十清杳"}, + {"title":" 江湖夜雨十年灯 印特签 周翊然 包上恩同名电视剧 知否知否应是绿肥红瘦 星汉灿烂,幸甚至哉 人气作者 关心则乱 古言江湖","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"关心则乱"}, + {"title":" 冬天请与我恋爱","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"江小绿"}, + {"title":" 朝俞1+2伪装学渣 雕刻典藏版凹刻版当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 摇摇晃晃的夜(人气作者 漾梨 豪门高干昆曲言情经典代表作 内含印特签 昆曲旗袍美人vs建筑系贵公子 新增出版番外《下雪的","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"漾梨"}, + {"title":" 当我飞奔向你","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 欲言难止2册12完结篇+十九日极夜12完结篇全两册 网络原名囚于永夜 麦香鸡呢著 飞行员上校陆赫扬x首席医生许则 晋江长","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 【古人很潮mook系列】君子温如玉2风与骨李白与君天下游苏轼人间惊鸿客词话少年间器与美少年魏晋美男志魏晋有美男君子温如玉","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 总有老师要请家长2 完结篇 晋江人气作家�Z梧 人气力作 温柔明艳祁言×清冷克制陆知乔","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"�Z梧"}, + {"title":" 遇阳 全2册 晋江甜文作者提裙代表作,网络原名《放学后别来我办公室》 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"提裙"}, + {"title":" 我们的夏天像电影 当当专享印特签","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"帘十里"}, + {"title":" 如果月亮有秘密(全2册)春风榴火作品,网络原名:反派大佬让我重生后救他","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"春风榴火"}, + {"title":" 桃李不言2 完结篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"一盏夜灯"}, + {"title":" 天亮了你就回来了亲签版 当当定制我们的回忆纪念簿 高口碑作家籽月BE虐恋代表作修订版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"籽月"}, + {"title":" 奶油味暗恋:全2册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 宿命之舞 亲签版(网络原名《波斯刺客:囚徒之舞》畅销书作家崖生高人气口碑西幻文","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"崖生"}, + {"title":" 汀南丝雨【限量亲签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"狄戈"}, + {"title":" 潮沙(唯雾著)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唯雾"}, + {"title":" 绊橙(全2册)这碗粥著","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"这碗粥"}, + {"title":" 见春天+渡夏天+过秋天+在冬天+敬山水+北方有雪3册 纵虎嗅花四为一本完结+新番外 校园暗恋be青春言情小说实体书籍正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 耳东兔子合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 炽野(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"简图"}, + {"title":" 黎明沉眠","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"岳千月"}, + {"title":" 黑白 新版(朝小诚代表作,全新逐字修订版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"朝小诚"}, + {"title":" 酸糖 当当特签版 赠专享婚礼请帖+书签+珍藏卡+漫画卡头 黍枝著","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"黍枝"}, + {"title":" 本色 印特签 刷边版 网络原名 放肆 玄笺巅峰力作 一世清白秦意浓 VS 人间理想唐若遥 她终于不再是过客 她是个归人","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"玄笺"}, + {"title":" 此刻是春天卢思浩2025重磅新书 沉淀四年后又一长篇力作 你的一生永远拥有专属于自己的颜色 当当自营正版 新华书店旗舰店","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"卢思浩"}, + {"title":" 呼唤雨(名门望族事业型大小姐 & 唯大小姐主义航天大佬。《红酒绿》之后,你好《呼唤雨》。人气作者苏他笔下成熟人士的感情拉","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"苏他"}, + {"title":" 如此尔尔(全二册)【印签版】风流书呆著网络原名:爱谁谁","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"风流书呆"}, + {"title":" 偏宠(明艳乐团钢琴手×斯文清贵总裁/“年少的心动没有特定的契机,任何时刻,都是契机。年少的暗恋,是若无其事,又孤注一掷。","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"慕拉"}, + {"title":" 余生,请多指教(随书附赠时光日记本)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"柏林石匠"}, + {"title":" 名利场人(全2册)【特签版+当当定制度假区邀请函】超人气作家朝小诚豪门言情力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"朝小诚"}, + {"title":" 将军总被欺负哭全2册印签版 人气作家龚心文权谋古言力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"龚心文"}, + {"title":" 将进酒1+2全套4册完结唐酒卿小说晋江文学小说全套无删减正版 当当自营古言小说类似撒野轻狂死亡万花筒畅销书 当当自营正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唐酒卿"}, + {"title":" 第一战场指挥官・完结篇(共2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"退戈"}, + {"title":" 传闻 理我一下 野红莓 草茉莉 逐风 高温不退 二锅水 橙色风暴 弦风在耳 心有凌熙 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 人鱼陷落1+2+3+4+5全套5册任选完结篇双封 漫画版高人气作者麟潜口碑代表作蝶变 黑暗中有白刺玫会陪你","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m4.ddimg.cn/82/10/12305578114-1_b_1755486817.jpg","author":"当当网"}, + {"title":" 【赠错题本+海报+合照等】以你为名的夏天 任凭舟著 新增番外 炽烈青春校园代表作青春文学小说当当自营正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"任凭舟"}, + {"title":" 顾小姐和曲小姐【赠:双熙写真签名照*1+影后盛典镭射票*1】(晚之著优质都市娱乐圈女性互助向励志作品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"晚之"}, + {"title":" 惊鸿(印特签版)古风双女主BE短篇小说集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"艾姬"}, + {"title":" 跨界演员(套装全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"北南"}, + {"title":" 三遇咸鱼(全二册)(限量印特签;网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作,随书赠专享赠品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"比卡比"}, + {"title":" 逐夏两本套1+2完结篇【赠明信片+大头贴+许愿卡+海报+学生证等】新增8000字番外伪装学渣作者木瓜黄 九州出版社 当当","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 微光(全2册)人气作者鱼霜高口碑之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼霜"}, + {"title":" 你听得到--人气作者桑�d网配圈甜饼 人气歌手谢修弋×呆萌作家柯姣 我爱你,你听得到。随书附赠:告白场景四联卡、精美歌词卡","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"桑�d"}, + {"title":" 三遇咸鱼・完结篇(网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"比卡比"}, + {"title":" 尤物 新锐人气作者二喜口碑代表作 穷追不舍总裁周易vs清冷美艳公关姜迎 十年暗恋 双向救赎 势均力敌 炙热沦陷 明知道自","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"二喜"}, + {"title":" 此生便是渡海全2册 特签版 当当定制拍立得透卡 舒远酸涩青春口碑之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒远"}, + {"title":" 一枝完结篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"绿山"}, + {"title":" 下阵雨 【作者印特签版】(继《于春日热吻》后,人气作者礼也再写心动暗恋!实体新增未公开番外《黄粱梦》!随书赠珍藏版人生四","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"礼也"}, + {"title":" 云胡不喜 终章 (尼卡十年言情巨献大结局,百万读者口口相传的民国言情经典)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"尼卡"}, + {"title":" 敖敖待捕 2 漫画 知名漫画家药药代表之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"药药"}, + {"title":" 我们的夏天像电影【作者特签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"帘十里"}, + {"title":" 白月光系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 暗恋这件难过的小事你失信了过秋天我只偷看他一眼潇潇雨声迟渡夏天侧耳在冬天等大鱼文化言情小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 我只喜欢你的人设1+2+3.完结篇(全3册)(当当专供)稚楚小说 可爱过敏原作者大结局,随书赠品25件","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 青春文学小说电视剧原著爱情言情小说套装:余生,请多指教+九州 斛珠夫人+海棠微雨共归途+欲言难止+香蜜沉沉烬如霜+金枪鱼","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 七天七夜完结篇【印签版】春风遥","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"春风遥"}, + {"title":" 狙击蝴蝶12全两册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 我欲将心养明月【特签版+定制印章+当当专享拍立得】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"多梨"}, + {"title":" 龙血 【首刷印特签本】大神作者水千丞热血高能之作 白金典藏版 新增未公开番外","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"水千丞"}, + {"title":" 好一个乖乖女 特签版 (柯淳、余茵主演同名短剧原著小说!番茄小说网巅峰榜年度爆款作品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"我煞费苦心"}, + {"title":" 三秋缒系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 朝俞1+2伪装学渣未删减版【包邮+丰富赠品】正版当当自营全套激光雕刻典藏版【赠送朝俞同框手幅+大幅海报+同框卡+藏书票+","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 入池(网络原名:不要在垃圾桶里捡男朋友)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"骑鲸南去"}, + {"title":" 我又我又初恋了(限量亲签;人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"林绵绵"}, + {"title":" 我恋月亮","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"宁雨沉"}, + {"title":" 《热带公路》 旅途重启,继《今夜我在德令哈》之后林子律又一本高口碑公路文。日常文的温馨天花板,林子律超真诚的烟火气and","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"林子律"}, + {"title":" 八目迷系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 诱摘野玫瑰【当当印签版+定制官宣时刻拍立得x2】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"一剪月"}, + {"title":" 送你春花 病弱天才少女与不羁自由学长 临死前再相爱一次的虐心BE 实体新增番外两则 随书附赠 下一站车票 祈福御守书签","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"初厘"}, + {"title":" 逃离图书馆2(蝶之灵著)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"蝶之灵"}, + {"title":" 第一战场指挥官(共2册)【印签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"退戈"}, + {"title":" 他又吃醋了2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"蓝手"}, + {"title":" 娇嗔","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"时星草"}, + {"title":" 你听得见","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"应橙"}, + {"title":" 落雪满南山","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"明开夜合"}, + {"title":" Twentine合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 你如北京美丽(许凯、谭松韵《你比星光美丽》原著小说,韩廷 纪星,随书赠星星原谅卡、Q版拍立得、星光藏书票,玖月��现实向燃","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"玖月��"}, + {"title":" 端午 言情小说 校园故事 晋江文学 品丰著","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"品丰"}, + {"title":" 纸飞机","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"潭石"}, + {"title":" 黎明之上2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"仄黎"}, + {"title":" 一笙有喜 亲签500册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼不语"}, + {"title":" 【官方正版】奇洛李维斯回信(高人气作者清明谷雨口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"清明谷雨"}, + {"title":" 驻我心间【定制表情包贴纸】殊娓甜宠新作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"殊娓"}, + {"title":" 赤别 别恋 金丝笼 妈,救命 诱摘野玫瑰 日偏食 巴掌印 刻骨 皇冠梨售罄 装聋作哑 梦蝶庄生 黄粱遗梦 留白 他说 在","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 见月 作者特签版 高人气作者小西饼口碑代表作 高岭之花钢琴才子周映希和洒脱随性美艳法医黎芙 浪漫异国恋 当当自营图书","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小西饼"}, + {"title":" 女寝大逃亡1+2+3全册 无删减 新锐青春作者火茶无限流代表作 【新增番外+折页+海报+学生档案卡】女性群像惊险刺激的寝","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"火茶"}, + {"title":" 檀笛","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"东施娘"}, + {"title":" 我又我又初恋了・完结篇(人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"林绵绵"}, + {"title":" 初恋【当当定制Q萌折立卡】人气作者雪莉久别重逢口碑力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"雪莉"}, + {"title":" 迟音【当当亲签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唯雾"}, + {"title":" 入戏之后 全两册(高人气作家时星草继《娇嗔》后又一甜宠力作,坚定奔赴,温柔守候)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"时星草"}, + {"title":" 河清海晏 橘子不酸 畅销书排行榜15000+评论热议治愈心灵的书200万读者含泪力荐知乎高口碑虐文17W高催泪神作言情当","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"橘子不酸"}, + {"title":" 吞海3大结局 淮上 小说 破云123同享世界观 青春文学小说畅销实体书言情 磨铁图书旗舰店正版书籍言情","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"淮上"} +] \ No newline at end of file diff --git a/Crawler/dangdang_books.txt b/Crawler/dangdang_books.txt new file mode 100644 index 0000000..ca81149 --- /dev/null +++ b/Crawler/dangdang_books.txt @@ -0,0 +1,238 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author + 陪安东尼度过漫长岁月 全六册 加赠亲签明信片 当当自营,0.00,0.00,10.0,//img3m8.ddimg.cn/54/3/29680848-1_b_1779433977.jpg,安东尼 + 小清欢【印特签版+当当定制贴纸】,0.00,0.00,10.0,images/model/guan/url_none.png,云拿月 + 红:陪安东尼度过漫长岁月Ⅰ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 没有明天的我们,在昨天相恋【当当定制衔尾蛇镭射怀表X2】第八届网络小说大奖获奖作品,0.00,0.00,10.0,images/model/guan/url_none.png,星火燎原 + 那个不为人知的故事 Twentine(无量渡口)BE美学代表作品,0.00,0.00,10.0,images/model/guan/url_none.png,Twentine + 朝俞1+2伪装学渣 限定正面白版护封+背面黑版护封套装 青春畅销小说实体书 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 红酒绿 苏他代表作,0.00,0.00,10.0,images/model/guan/url_none.png,苏他 + 奇洛李维斯回信(高人气作者清明谷雨口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,清明谷雨 + 他笑时风华正茂【印特签版+当当专享印制作者手写明信片】舒远,0.00,0.00,10.0,images/model/guan/url_none.png,舒远 + 渡厄【印签版+当当定制信纸x2】杨溯,0.00,0.00,10.0,images/model/guan/url_none.png,杨溯 + 蓝:陪安东尼度过漫长岁月VI(首发加赠当当限定赠品:PET菲林胶片x2张)陪安系列的15年暖心陪伴,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 元气少女缘结神:鞍马山夜话(甜蜜少女系漫画官方中文纪念版首次上市!),0.00,0.00,10.0,images/model/guan/url_none.png,Haruka + 陪安东尼度过漫长岁月,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 他在云之南 印特签 景行高人气经典口碑力作 相遇十年典藏版 新增万字番外+作者前言,0.00,0.00,10.0,images/model/guan/url_none.png,景行 + 青:陪安东尼度过漫长岁月5,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 别踮脚我低头印签版 当当定制关于你的拍立得 纯爱言情作者君不弃校园甜宠悸动之作 网络原名她不乖要哄,0.00,0.00,10.0,images/model/guan/url_none.png,君不弃 + 青:陪安东尼度过漫长岁月Ⅴ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 梦蝶庄生(网络原名:还剩三个月命请让我从容赴S)番茄9.8高分BE美学力作,0.00,0.00,10.0,images/model/guan/url_none.png,高卧北 + 退烧(全二册)舒虞浪漫新作,0.00,0.00,10.0,images/model/guan/url_none.png,舒虞 + 与岁长宁 上册 追光救赎 高口碑古言 嫁反派 娇娇贵女x乖张美强惨 反派 男主 她是他心尖上的善念 是刻在他伤痕上的名字,0.00,0.00,10.0,images/model/guan/url_none.png,布丁琉璃 + 渡夏天,0.00,0.00,10.0,images/model/guan/url_none.png,甜野豹 + 蓝:陪安东尼度过漫长岁月VI 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 人鱼陷落:完结篇 畅销书作者麟潜口碑代表作!,0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 《你是长夜,也是灯火》典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,岁惟 + 人鱼陷落全五册(畅销书作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 橙:陪安东尼度过漫长岁月Ⅱ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 深情眼(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,耳东兔子 + 晋江人气作者木羽愿高口碑双向奔赴代表作《纵我情深》破镜重圆vs蓄谋已久,全文高甜!新增出版番外《婚后生活》,续写“傅姜夫,0.00,0.00,10.0,images/model/guan/url_none.png,木羽愿 + 人鱼陷落(高人气作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 打火机与公主裙(荒草园+长明灯)全2册 Twentine著 陈飞宇、张婧仪 主演影视剧“点燃我,温暖你”原著小说,0.00,0.00,10.0,images/model/guan/url_none.png,Twentine + 《阿也(全二册)》刷边典藏版 我喜欢你的信息素 引路星 全新番外,0.00,0.00,10.0,images/model/guan/url_none.png,引路星 + 纸飞机1+2,0.00,0.00,10.0,images/model/guan/url_none.png,潭石 + 人鱼陷落3(长佩原创人气文学,高人气作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 最好的我们:全三册(八月长安“振华中学”系列代表作,十周年典藏版。新增 10P后记《罗德赛塔西亚是一封情书》),0.00,0.00,10.0,images/model/guan/url_none.png,八月长安 + 骄阳似我下 完结篇 印签版 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧,0.00,0.00,10.0,images/model/guan/url_none.png,顾漫 + 我不喜欢这世界,我只喜欢你修订版 乔一 畅销百万册!由吴倩张雨剑主演的超甜电视剧我只喜欢你原著小说,0.00,0.00,10.0,images/model/guan/url_none.png,乔一 + 你失信了,0.00,0.00,10.0,images/model/guan/url_none.png,十清杳 + 缠 网络原名《真香》 ,《二锅水》作者烟猫与酒“治愈”向代表作 年度情感催泪大戏,一段“心”连接的亲情 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,烟猫与酒 + 太岁(《杀破狼》《残次品》《默读》《镇魂》作者、高人气畅销书作家Priest无CP力作),0.00,0.00,10.0,images/model/guan/url_none.png,Priest + 人鱼陷落2(高人气作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 《别来无恙》晋江文学城畅销书作家 北南 经典虐心作品原著同名漫画 破镜重圆天花板,0.00,0.00,10.0,images/model/guan/url_none.png,北南 + 朝俞1+2套装(全2册)原名伪装学渣 现象级青春小说,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 告白2完结篇 王星越 邓恩熙同名电视剧 赠手绘卡片+告白信+贴纸+婚礼请柬+海报+登机牌+藏书票+书签 应橙暗恋作品新增,0.00,0.00,10.0,images/model/guan/url_none.png,应橙 + 旧故新长:诗无茶代表作青春文学治愈系小说,0.00,0.00,10.0,images/model/guan/url_none.png,诗无茶 + 拉勾(全2册)春风榴火作品,网络原名:我是顶流巨星亲孙女,0.00,0.00,10.0,images/model/guan/url_none.png,春风榴火 + 有匪全集(赵丽颖、王一博主演《有翡》原著小说。Priest扛鼎之作,全4册),0.00,0.00,10.0,images/model/guan/url_none.png,Priest + 黄粱遗梦【当当网印签版】人气作家高卧北催泪力作!,0.00,0.00,10.0,images/model/guan/url_none.png,高卧北 + 伪装学渣未删减12这题超纲了朝俞七芒星逐夏一觉醒来全套完结篇【木瓜黄小说合集】木瓜黄伪装学渣经典青春文学小说作品合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 那个不为人知的故事 寂静深处有人家 Twentine(无量渡口) 名利场人 朝暮不相迟 以你为名的夏天 她等待刀锋已久,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 梦蝶庄生 黄粱遗梦 套装 高卧北,0.00,0.00,10.0,images/model/guan/url_none.png,高卧北 + 难哄 2册全集 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 神之陨落2 限量印特签 网络名《杀穿副本后,我在规则里养大邪神》番茄小说人气作者白桃呜呜龙无限流大作,0.00,0.00,10.0,images/model/guan/url_none.png,白桃呜呜龙 + 网恋被骗八百次,0.00,0.00,10.0,images/model/guan/url_none.png,熊也 + 人鱼陷落4(畅销书作者麟潜口碑代表作!当当专享电子屏保),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 你说巧不巧 全二册 久别重逢+破镜重圆,双向奔赴的轻松甜暖之作 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,张不一 + 扶华合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 绿:陪安东尼度过漫长岁月Ⅳ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 《铜雀锁金钗》民国虐心必看 榜单神作 人气作者 世味煮茶,0.00,0.00,10.0,images/model/guan/url_none.png,世味煮茶 + 骄阳似我上下 两册套装 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧,0.00,0.00,10.0,images/model/guan/url_none.png,顾漫 + 八月的尾声,宛如世界末日 当当定制爱的箴言贺卡 电击小说大奖得主天泽夏月深情力作BE轻小说TOP,0.00,0.00,10.0,//img3m8.ddimg.cn/29/19/29934758-1_b_1755252822.jpg,天泽夏月 + 树下有片红房子(上下册)(青春群像小说,青梅竹马,暖甜治愈,体育生vs学霸),0.00,0.00,10.0,images/model/guan/url_none.png,小格 + 偷月亮给你【亲签版】,0.00,0.00,10.0,images/model/guan/url_none.png,患者阿离 + 《雪粒镇》(百万粉丝故事博主尸姐现实向长篇爱情小说力作。双向救赎X悬疑治愈,暗黑X光明,亲情X爱情),0.00,0.00,10.0,images/model/guan/url_none.png,屋里丝丝 + 你的名字。(新海诚亲笔撰写,同名电影原作小说简体中文版,撩动万千观众的青春情怀),0.00,0.00,10.0,images/model/guan/url_none.png,新海诚 + 青+蓝:陪安东尼度过漫长岁月V+VI 双册套装,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 可爱过敏原:全2册(人气作家稚楚温馨之作。随书附赠多重主题赠品),0.00,0.00,10.0,images/model/guan/url_none.png,稚楚 + 第一瞳术师,0.00,0.00,10.0,images/model/guan/url_none.png,喵喵大人 + 你好,这种情况持续多久了(高人气作者温泉笨蛋治愈系甜文口碑代表作!随书附赠:折立卡+明信片+海报+书签+印刷特签),0.00,0.00,10.0,images/model/guan/url_none.png,温泉笨蛋 + 如果这一秒我没遇见你 张凌赫 王楚然主演 这一秒过火原著小说 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,匪我思存 + 朝思慕暖,0.00,0.00,10.0,images/model/guan/url_none.png,鱼霜 + 《最爱你的那十年》典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,无仪宁死 + 提灯照河山(淮上作品,当当专享人物透卡),0.00,0.00,10.0,images/model/guan/url_none.png,淮上 + 夜幕之下全套123456789101112小说斩神凡尘神域三九音域我在精神病院学斩神漫画版 新番外徽章周边言情青春文学畅,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 营业悖论.完结篇:全2册,0.00,0.00,10.0,images/model/guan/url_none.png,稚楚 + 偏偏宠爱(新版),0.00,0.00,10.0,images/model/guan/url_none.png,藤萝为枝 + 我要你哄我 9.5分万人热评 80万人在线阅读娱乐圈恋综甜文 深藏不露小明星×高傲冷酷大歌神” 原来喜欢到了极致也会让人,0.00,0.00,10.0,images/model/guan/url_none.png,幼儿园的卡耐基 + 南北西东【当当特签版】,0.00,0.00,10.0,images/model/guan/url_none.png,拉面土豆丝 + 《铜雀锁金钗2》民国虐心必看 人气作者 世味煮茶 桀骜不驯司令官 段烨霖 × 清冷傲人药铺大夫 许少棠,0.00,0.00,10.0,images/model/guan/url_none.png,世味煮茶 + 就我机灵(网络原名:百万UP学神天天演我 青春小说作家小霄轻松r热血校园力作!双标极致・追星成功・学神百大up窦晟 VS,0.00,0.00,10.0,images/model/guan/url_none.png,小霄 + 我为你翻山越岭 限量印特签 人气作者小合鸽鸟子青春逐梦口碑作,0.00,0.00,10.0,images/model/guan/url_none.png,小合鸽鸟子 + 她的小梨涡,0.00,0.00,10.0,images/model/guan/url_none.png,唧唧的猫 + 棠木依旧(人气作者米花BE美学短篇集),0.00,0.00,10.0,images/model/guan/url_none.png,米花 + 清明谷雨,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 有的是时间,0.00,0.00,10.0,images/model/guan/url_none.png,舒远 + 爱了很久的朋友,0.00,0.00,10.0,images/model/guan/url_none.png,枝玖 + 等风热吻你(7月5日19:00-7月6日24:00限时印特签,畅销书作家唧唧的猫口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,唧唧的猫 + 亿万斯年【特签版+当当定制一眼万年拍立得X2】高口碑作者狄戈浪漫缱绻之作典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,狄戈 + 退烧 她他 望北楼 含栀 十里雾 棠木依旧(BE美学) 肆意 月下娇 心软 来我怀里躲躲 余生,请多指教 乖一点 当当自,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 微微一笑很倾城,0.00,0.00,10.0,images/model/guan/url_none.png,顾漫 + 黄:陪安东尼度过漫长岁月Ⅲ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 青玄,0.00,0.00,10.0,images/model/guan/url_none.png,未小兮 + 蔷薇信号(印签版)双女主青春成长短篇故事集,0.00,0.00,10.0,images/model/guan/url_none.png,艾姬 + 磨牙(全2册)舒虞新作,0.00,0.00,10.0,images/model/guan/url_none.png,舒虞 + 告白 王星越 邓恩熙同名电视剧 赠珠光明信片+海报+语音卡+立卡等人气作者应橙温柔细腻暗恋作品痞帅深情周京泽×温软坚定许,0.00,0.00,10.0,images/model/guan/url_none.png,应橙 + 附加遗产全两册无删减【赠送超清海报+异形卡+书签+贴纸】当当自营正版水千丞作品集深渊游戏火焰戎装逆锋逐王魂兵之戈 水千丞,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 你听你听,是那时候的声音,0.00,0.00,10.0,images/model/guan/url_none.png,帘十里 + 翻车指南(酱子贝代表作 网络原名:网恋翻车指南 全2册),0.00,0.00,10.0,images/model/guan/url_none.png,酱子贝 + 《我亲爱的法医小姐1+2》(全4册)磁扣盒装典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,酒暖春深 + 空白页 全两册 作者特签版 晋江金榜作家咬枝绿高口碑酸涩暗恋文 穷小子和小公主 新增未公开番外美梦成真 当当自营图书,0.00,0.00,10.0,images/model/guan/url_none.png,咬枝绿 + 含栀 印签版 当当定制半枝宇宙钻石卡X2 晋江人气作家鹿灵暗恋成真代表作,0.00,0.00,10.0,images/model/guan/url_none.png,鹿灵 + 融夏(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,话眠 + 等我逢景+等我遇繁全2册【随书多重赠品】酱子贝文代表作 我等你很久了青春文学畅销实体书 磨铁图书当当自营正版,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 南方海啸 高人气作者卡比丘口碑力作 赵竞 韦嘉易 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,卡比丘 + 《一级律师?典藏版(全三册)》人气作者木苏里 星际幻想力作 星际一级律师 顾晏×燕绥之 师生重逢,联手共寻基因真相 公理,0.00,0.00,10.0,images/model/guan/url_none.png,木苏里 + 《祁望》祁纪之恋、娱乐圈、诟病、人气作者池总渣深情走心之作,0.00,0.00,10.0,images/model/guan/url_none.png,池总渣 + 苍兰诀 (当当专享人气画手眠狼绘制印刷海报)九鹭非香,0.00,0.00,10.0,images/model/guan/url_none.png,九鹭非香 + 海棠微雨共归途,0.00,0.00,10.0,images/model/guan/url_none.png,肉包不吃肉 + 海棠微雨共归途全套123456完结篇病案本第一辑 肉包不吃肉系列作品原小说二哈和他的白猫师尊实体书籍 海棠微雨共归途全套,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 皇上与我共战袍(上下)言情 爱情小说古代穿越 蔷薇书院,0.00,0.00,10.0,images/model/guan/url_none.png,茴笙 + 全世界都知道全二册 印签版 当当定制Q萌取景器透卡 网络原名全世界都知道她爱我 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,鱼霜 + 十里雾【特签版+当当定制流年日记本】BE美学意难平酸涩催泪之作,0.00,0.00,10.0,images/model/guan/url_none.png,行迟 + 【任选】她的山她的海3漫画&小说版&漫画单行本123全套 未删减【首刷限量胶片+印签绘+光栅卡+拍立得+折立卡等】限定花,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 春山喧 作者印特签版 番茄小说高人气娱乐圈竞技言情 被读者称为“姐狗文学天花板”,0.00,0.00,10.0,images/model/guan/url_none.png,彼呦 + 小清欢 云拿月 我欲将心养明月 多梨 低音调 初恋 雪梨 肆火 树延 偷月亮给你 患者阿离 人间情诗 佩奇酱 落雪满南山,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 橘子汽水(独家定制阿司匹林电子签名数字藏品――白城“舟渔”签名卡),0.00,0.00,10.0,images/model/guan/url_none.png,阿司匹林 + 雾色妄想全2册特签版 当当定制梨涡妹妹唱片CD透卡 高人气口碑作者一剪月璀璨暗恋之作,0.00,0.00,10.0,images/model/guan/url_none.png,一剪月 + 等我逢景+等我遇繁【文轩飞机盒定制版】放学等我完结篇 另著翻车指南 我行让我上 我等你很久了 世纪网缘 酱子贝文代表作,0.00,0.00,10.0,images/model/guan/url_none.png,酱子贝 + 诡界 谷悬小镇 特签版 作者夜来风雨声高口碑作品,网络原名《因为谨慎而过分凶狠》,0.00,0.00,10.0,images/model/guan/url_none.png,夜来风雨声 + 【麟潜小说合集】人鱼陷落全套12345完结篇人鱼陷落漫画蝶变123垂耳执事影成双遵命 人气作家麟潜经典青春文学小说作品合,0.00,0.00,10.0,//img3m7.ddimg.cn/50/15/11704168427-1_b_1720147472.jpg,当当网 + 黑天(全二册)护封典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,木苏里 + 我亲爱的法医小姐1+2(全4册),0.00,0.00,10.0,images/model/guan/url_none.png,酒暖春深 + 人鱼陷落全四册(畅销书作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 十五年等待候鸟完美纪念版,0.00,0.00,10.0,images/model/guan/url_none.png,盈风 + 可爱多少钱一斤(共2册),0.00,0.00,10.0,images/model/guan/url_none.png,栖见 + 烟花,0.00,0.00,10.0,images/model/guan/url_none.png,岩井俊二 + 锦鲤游戏2,0.00,0.00,10.0,images/model/guan/url_none.png,夏季稻谷香 + 【随机亲签】她的山她的海小说 扶华著【赠海报+印签绘+名卡+立卡等】当当自营正版未删减版继续献鱼末世第十年四十年后的爱人,0.00,0.00,10.0,images/model/guan/url_none.png,扶华 + 折枝:古风作家困倚危楼内地首次正式出版作品,0.00,0.00,10.0,images/model/guan/url_none.png,困倚危楼 + 难哄 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 女寝大逃亡1234全册完结篇 无删减【赠多张祝福卡+漫画豆本+折页+海报+学生档案卡】当当自营正版新锐青春作者火茶无限流,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 宁愿(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,藤萝为枝 + 新婚燕尔(晋江高人气作家姜之鱼浪漫甜蜜力作),0.00,0.00,10.0,images/model/guan/url_none.png,姜之鱼 + 《尤物・情钟篇》人气作者二喜口碑破圈代表作,百万读者追更!穷追不舍总裁周易vs清冷美艳女主姜迎,十年暗恋,双向救赎,势均,0.00,0.00,10.0,images/model/guan/url_none.png,二喜 + 悲伤逆流成河,0.00,0.00,10.0,images/model/guan/url_none.png,郭敬明 + 附加遗产套装两册无删减【赠送超清海报+异型卡+书签+贴纸】当当自营正版 广东旅游出版社 新华书店正版保障,0.00,0.00,10.0,images/model/guan/url_none.png,水千丞 + 暗恋这件难过的小事,0.00,0.00,10.0,images/model/guan/url_none.png,孟栀晚 + 骄阳似我,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 你想都不要想(白月光口碑校园文,七寸汤包甜文代表作,随书附赠:精美书签+双人反差萌Q版折立卡2个+手绘海报),0.00,0.00,10.0,images/model/guan/url_none.png,七寸汤包 + 见天光(网络原名:暗河长明),0.00,0.00,10.0,images/model/guan/url_none.png,冷山 + 一枝 上下 完结篇 套装 绿山,0.00,0.00,10.0,images/model/guan/url_none.png,绿山 + 眼中星3 完结篇,0.00,0.00,10.0,images/model/guan/url_none.png,蓝淋 + 神之陨落(限量印签,网络名《杀穿副本后,我在规则里养大邪神》),0.00,0.00,10.0,images/model/guan/url_none.png,白桃呜呜龙 + 赤别【当当定制透卡】十清杳,0.00,0.00,10.0,images/model/guan/url_none.png,十清杳 + 江湖夜雨十年灯 印特签 周翊然 包上恩同名电视剧 知否知否应是绿肥红瘦 星汉灿烂,幸甚至哉 人气作者 关心则乱 古言江湖,0.00,0.00,10.0,images/model/guan/url_none.png,关心则乱 + 冬天请与我恋爱,0.00,0.00,10.0,images/model/guan/url_none.png,江小绿 + 朝俞1+2伪装学渣 雕刻典藏版凹刻版当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 摇摇晃晃的夜(人气作者 漾梨 豪门高干昆曲言情经典代表作 内含印特签 昆曲旗袍美人vs建筑系贵公子 新增出版番外《下雪的,0.00,0.00,10.0,images/model/guan/url_none.png,漾梨 + 当我飞奔向你,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 欲言难止2册12完结篇+十九日极夜12完结篇全两册 网络原名囚于永夜 麦香鸡呢著 飞行员上校陆赫扬x首席医生许则 晋江长,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 【古人很潮mook系列】君子温如玉2风与骨李白与君天下游苏轼人间惊鸿客词话少年间器与美少年魏晋美男志魏晋有美男君子温如玉,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 总有老师要请家长2 完结篇 晋江人气作家�Z梧 人气力作 温柔明艳祁言×清冷克制陆知乔,0.00,0.00,10.0,images/model/guan/url_none.png,�Z梧 + 遇阳 全2册 晋江甜文作者提裙代表作,网络原名《放学后别来我办公室》 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,提裙 + 我们的夏天像电影 当当专享印特签,0.00,0.00,10.0,images/model/guan/url_none.png,帘十里 + 如果月亮有秘密(全2册)春风榴火作品,网络原名:反派大佬让我重生后救他,0.00,0.00,10.0,images/model/guan/url_none.png,春风榴火 + 桃李不言2 完结篇,0.00,0.00,10.0,images/model/guan/url_none.png,一盏夜灯 + 天亮了你就回来了亲签版 当当定制我们的回忆纪念簿 高口碑作家籽月BE虐恋代表作修订版,0.00,0.00,10.0,images/model/guan/url_none.png,籽月 + 奶油味暗恋:全2册,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 宿命之舞 亲签版(网络原名《波斯刺客:囚徒之舞》畅销书作家崖生高人气口碑西幻文,0.00,0.00,10.0,images/model/guan/url_none.png,崖生 + 汀南丝雨【限量亲签版】,0.00,0.00,10.0,images/model/guan/url_none.png,狄戈 + 潮沙(唯雾著),0.00,0.00,10.0,images/model/guan/url_none.png,唯雾 + 绊橙(全2册)这碗粥著,0.00,0.00,10.0,images/model/guan/url_none.png,这碗粥 + 见春天+渡夏天+过秋天+在冬天+敬山水+北方有雪3册 纵虎嗅花四为一本完结+新番外 校园暗恋be青春言情小说实体书籍正版,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 耳东兔子合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 炽野(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,简图 + 黎明沉眠,0.00,0.00,10.0,images/model/guan/url_none.png,岳千月 + 黑白 新版(朝小诚代表作,全新逐字修订版),0.00,0.00,10.0,images/model/guan/url_none.png,朝小诚 + 酸糖 当当特签版 赠专享婚礼请帖+书签+珍藏卡+漫画卡头 黍枝著,0.00,0.00,10.0,images/model/guan/url_none.png,黍枝 + 本色 印特签 刷边版 网络原名 放肆 玄笺巅峰力作 一世清白秦意浓 VS 人间理想唐若遥 她终于不再是过客 她是个归人,0.00,0.00,10.0,images/model/guan/url_none.png,玄笺 + 此刻是春天卢思浩2025重磅新书 沉淀四年后又一长篇力作 你的一生永远拥有专属于自己的颜色 当当自营正版 新华书店旗舰店,0.00,0.00,10.0,images/model/guan/url_none.png,卢思浩 + 呼唤雨(名门望族事业型大小姐 & 唯大小姐主义航天大佬。《红酒绿》之后,你好《呼唤雨》。人气作者苏他笔下成熟人士的感情拉,0.00,0.00,10.0,images/model/guan/url_none.png,苏他 + 如此尔尔(全二册)【印签版】风流书呆著网络原名:爱谁谁,0.00,0.00,10.0,images/model/guan/url_none.png,风流书呆 + 偏宠(明艳乐团钢琴手×斯文清贵总裁/“年少的心动没有特定的契机,任何时刻,都是契机。年少的暗恋,是若无其事,又孤注一掷。,0.00,0.00,10.0,images/model/guan/url_none.png,慕拉 + 余生,请多指教(随书附赠时光日记本),0.00,0.00,10.0,images/model/guan/url_none.png,柏林石匠 + 名利场人(全2册)【特签版+当当定制度假区邀请函】超人气作家朝小诚豪门言情力作,0.00,0.00,10.0,images/model/guan/url_none.png,朝小诚 + 将军总被欺负哭全2册印签版 人气作家龚心文权谋古言力作,0.00,0.00,10.0,images/model/guan/url_none.png,龚心文 + 将进酒1+2全套4册完结唐酒卿小说晋江文学小说全套无删减正版 当当自营古言小说类似撒野轻狂死亡万花筒畅销书 当当自营正版,0.00,0.00,10.0,images/model/guan/url_none.png,唐酒卿 + 第一战场指挥官・完结篇(共2册),0.00,0.00,10.0,images/model/guan/url_none.png,退戈 + 传闻 理我一下 野红莓 草茉莉 逐风 高温不退 二锅水 橙色风暴 弦风在耳 心有凌熙 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 人鱼陷落1+2+3+4+5全套5册任选完结篇双封 漫画版高人气作者麟潜口碑代表作蝶变 黑暗中有白刺玫会陪你,0.00,0.00,10.0,//img3m4.ddimg.cn/82/10/12305578114-1_b_1755486817.jpg,当当网 + 【赠错题本+海报+合照等】以你为名的夏天 任凭舟著 新增番外 炽烈青春校园代表作青春文学小说当当自营正版,0.00,0.00,10.0,images/model/guan/url_none.png,任凭舟 + 顾小姐和曲小姐【赠:双熙写真签名照*1+影后盛典镭射票*1】(晚之著优质都市娱乐圈女性互助向励志作品),0.00,0.00,10.0,images/model/guan/url_none.png,晚之 + 惊鸿(印特签版)古风双女主BE短篇小说集,0.00,0.00,10.0,images/model/guan/url_none.png,艾姬 + 跨界演员(套装全2册),0.00,0.00,10.0,images/model/guan/url_none.png,北南 + 三遇咸鱼(全二册)(限量印特签;网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作,随书赠专享赠品),0.00,0.00,10.0,images/model/guan/url_none.png,比卡比 + 逐夏两本套1+2完结篇【赠明信片+大头贴+许愿卡+海报+学生证等】新增8000字番外伪装学渣作者木瓜黄 九州出版社 当当,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 微光(全2册)人气作者鱼霜高口碑之作,0.00,0.00,10.0,images/model/guan/url_none.png,鱼霜 + 你听得到--人气作者桑�d网配圈甜饼 人气歌手谢修弋×呆萌作家柯姣 我爱你,你听得到。随书附赠:告白场景四联卡、精美歌词卡,0.00,0.00,10.0,images/model/guan/url_none.png,桑�d + 三遇咸鱼・完结篇(网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作),0.00,0.00,10.0,images/model/guan/url_none.png,比卡比 + 尤物 新锐人气作者二喜口碑代表作 穷追不舍总裁周易vs清冷美艳公关姜迎 十年暗恋 双向救赎 势均力敌 炙热沦陷 明知道自,0.00,0.00,10.0,images/model/guan/url_none.png,二喜 + 此生便是渡海全2册 特签版 当当定制拍立得透卡 舒远酸涩青春口碑之作,0.00,0.00,10.0,images/model/guan/url_none.png,舒远 + 一枝完结篇,0.00,0.00,10.0,images/model/guan/url_none.png,绿山 + 下阵雨 【作者印特签版】(继《于春日热吻》后,人气作者礼也再写心动暗恋!实体新增未公开番外《黄粱梦》!随书赠珍藏版人生四,0.00,0.00,10.0,images/model/guan/url_none.png,礼也 + 云胡不喜 终章 (尼卡十年言情巨献大结局,百万读者口口相传的民国言情经典),0.00,0.00,10.0,images/model/guan/url_none.png,尼卡 + 敖敖待捕 2 漫画 知名漫画家药药代表之作,0.00,0.00,10.0,images/model/guan/url_none.png,药药 + 我们的夏天像电影【作者特签版】,0.00,0.00,10.0,images/model/guan/url_none.png,帘十里 + 白月光系列,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 暗恋这件难过的小事你失信了过秋天我只偷看他一眼潇潇雨声迟渡夏天侧耳在冬天等大鱼文化言情小说,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 我只喜欢你的人设1+2+3.完结篇(全3册)(当当专供)稚楚小说 可爱过敏原作者大结局,随书赠品25件,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 青春文学小说电视剧原著爱情言情小说套装:余生,请多指教+九州 斛珠夫人+海棠微雨共归途+欲言难止+香蜜沉沉烬如霜+金枪鱼,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 七天七夜完结篇【印签版】春风遥,0.00,0.00,10.0,images/model/guan/url_none.png,春风遥 + 狙击蝴蝶12全两册,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 我欲将心养明月【特签版+定制印章+当当专享拍立得】,0.00,0.00,10.0,images/model/guan/url_none.png,多梨 + 龙血 【首刷印特签本】大神作者水千丞热血高能之作 白金典藏版 新增未公开番外,0.00,0.00,10.0,images/model/guan/url_none.png,水千丞 + 好一个乖乖女 特签版 (柯淳、余茵主演同名短剧原著小说!番茄小说网巅峰榜年度爆款作品),0.00,0.00,10.0,images/model/guan/url_none.png,我煞费苦心 + 三秋缒系列,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 朝俞1+2伪装学渣未删减版【包邮+丰富赠品】正版当当自营全套激光雕刻典藏版【赠送朝俞同框手幅+大幅海报+同框卡+藏书票+,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 入池(网络原名:不要在垃圾桶里捡男朋友),0.00,0.00,10.0,images/model/guan/url_none.png,骑鲸南去 + 我又我又初恋了(限量亲签;人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”),0.00,0.00,10.0,images/model/guan/url_none.png,林绵绵 + 我恋月亮,0.00,0.00,10.0,images/model/guan/url_none.png,宁雨沉 + 《热带公路》 旅途重启,继《今夜我在德令哈》之后林子律又一本高口碑公路文。日常文的温馨天花板,林子律超真诚的烟火气and,0.00,0.00,10.0,images/model/guan/url_none.png,林子律 + 八目迷系列,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 诱摘野玫瑰【当当印签版+定制官宣时刻拍立得x2】,0.00,0.00,10.0,images/model/guan/url_none.png,一剪月 + 送你春花 病弱天才少女与不羁自由学长 临死前再相爱一次的虐心BE 实体新增番外两则 随书附赠 下一站车票 祈福御守书签,0.00,0.00,10.0,images/model/guan/url_none.png,初厘 + 逃离图书馆2(蝶之灵著),0.00,0.00,10.0,images/model/guan/url_none.png,蝶之灵 + 第一战场指挥官(共2册)【印签版】,0.00,0.00,10.0,images/model/guan/url_none.png,退戈 + 他又吃醋了2,0.00,0.00,10.0,images/model/guan/url_none.png,蓝手 + 娇嗔,0.00,0.00,10.0,images/model/guan/url_none.png,时星草 + 你听得见,0.00,0.00,10.0,images/model/guan/url_none.png,应橙 + 落雪满南山,0.00,0.00,10.0,images/model/guan/url_none.png,明开夜合 + Twentine合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 你如北京美丽(许凯、谭松韵《你比星光美丽》原著小说,韩廷 纪星,随书赠星星原谅卡、Q版拍立得、星光藏书票,玖月��现实向燃,0.00,0.00,10.0,images/model/guan/url_none.png,玖月�� + 端午 言情小说 校园故事 晋江文学 品丰著,0.00,0.00,10.0,images/model/guan/url_none.png,品丰 + 纸飞机,0.00,0.00,10.0,images/model/guan/url_none.png,潭石 + 黎明之上2,0.00,0.00,10.0,images/model/guan/url_none.png,仄黎 + 一笙有喜 亲签500册,0.00,0.00,10.0,images/model/guan/url_none.png,鱼不语 + 【官方正版】奇洛李维斯回信(高人气作者清明谷雨口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,清明谷雨 + 驻我心间【定制表情包贴纸】殊娓甜宠新作,0.00,0.00,10.0,images/model/guan/url_none.png,殊娓 + 赤别 别恋 金丝笼 妈,救命 诱摘野玫瑰 日偏食 巴掌印 刻骨 皇冠梨售罄 装聋作哑 梦蝶庄生 黄粱遗梦 留白 他说 在,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 见月 作者特签版 高人气作者小西饼口碑代表作 高岭之花钢琴才子周映希和洒脱随性美艳法医黎芙 浪漫异国恋 当当自营图书,0.00,0.00,10.0,images/model/guan/url_none.png,小西饼 + 女寝大逃亡1+2+3全册 无删减 新锐青春作者火茶无限流代表作 【新增番外+折页+海报+学生档案卡】女性群像惊险刺激的寝,0.00,0.00,10.0,images/model/guan/url_none.png,火茶 + 檀笛,0.00,0.00,10.0,images/model/guan/url_none.png,东施娘 + 我又我又初恋了・完结篇(人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”),0.00,0.00,10.0,images/model/guan/url_none.png,林绵绵 + 初恋【当当定制Q萌折立卡】人气作者雪莉久别重逢口碑力作,0.00,0.00,10.0,images/model/guan/url_none.png,雪莉 + 迟音【当当亲签版】,0.00,0.00,10.0,images/model/guan/url_none.png,唯雾 + 入戏之后 全两册(高人气作家时星草继《娇嗔》后又一甜宠力作,坚定奔赴,温柔守候),0.00,0.00,10.0,images/model/guan/url_none.png,时星草 + 河清海晏 橘子不酸 畅销书排行榜15000+评论热议治愈心灵的书200万读者含泪力荐知乎高口碑虐文17W高催泪神作言情当,0.00,0.00,10.0,images/model/guan/url_none.png,橘子不酸 + 吞海3大结局 淮上 小说 破云123同享世界观 青春文学小说畅销实体书言情 磨铁图书旗舰店正版书籍言情,0.00,0.00,10.0,images/model/guan/url_none.png,淮上 diff --git a/Crawler/exception/CrawlerException.java b/Crawler/exception/CrawlerException.java new file mode 100644 index 0000000..4070fa4 --- /dev/null +++ b/Crawler/exception/CrawlerException.java @@ -0,0 +1,11 @@ +package exception; + +public class CrawlerException extends Exception { + public CrawlerException(String message) { + super(message); + } + + public CrawlerException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/Crawler/exception/NetworkException.java b/Crawler/exception/NetworkException.java new file mode 100644 index 0000000..ff89d42 --- /dev/null +++ b/Crawler/exception/NetworkException.java @@ -0,0 +1,26 @@ +package exception; + +public class NetworkException extends CrawlerException { + public NetworkException(String message) { + super(message); + } + + public NetworkException(String message, Throwable cause) { + super(message, cause); + } + + public static NetworkException connectionFailed(String host) { + return new NetworkException("网络连接失败,无法访问: " + host, + new java.net.ConnectException("Connection refused")); + } + + public static NetworkException unknownHost(String host) { + return new NetworkException("无法解析域名: " + host, + new java.net.UnknownHostException(host)); + } + + public static NetworkException timeout(String host) { + return new NetworkException("请求超时,无法访问: " + host, + new java.net.SocketTimeoutException("Read timed out")); + } +} \ No newline at end of file diff --git a/Crawler/exception/ParseException.java b/Crawler/exception/ParseException.java new file mode 100644 index 0000000..7b31215 --- /dev/null +++ b/Crawler/exception/ParseException.java @@ -0,0 +1,19 @@ +package exception; + +public class ParseException extends Exception { + public ParseException(String message) { + super(message); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } + + public static ParseException invalidSelector(String selector) { + return new ParseException("无效的选择器: " + selector); + } + + public static ParseException emptyResult(String source) { + return new ParseException("解析结果为空: " + source); + } +} \ No newline at end of file diff --git a/Crawler/lib/jsoup-1.17.2.jar b/Crawler/lib/jsoup-1.17.2.jar new file mode 100644 index 0000000..52ae16d Binary files /dev/null and b/Crawler/lib/jsoup-1.17.2.jar differ diff --git a/Crawler/lib/logback-classic-1.4.11.jar b/Crawler/lib/logback-classic-1.4.11.jar new file mode 100644 index 0000000..c6a0353 Binary files /dev/null and b/Crawler/lib/logback-classic-1.4.11.jar differ diff --git a/Crawler/lib/logback-core-1.4.11.jar b/Crawler/lib/logback-core-1.4.11.jar new file mode 100644 index 0000000..fa630c9 Binary files /dev/null and b/Crawler/lib/logback-core-1.4.11.jar differ diff --git a/Crawler/lib/slf4j-api-2.0.9.jar b/Crawler/lib/slf4j-api-2.0.9.jar new file mode 100644 index 0000000..3796afe Binary files /dev/null and b/Crawler/lib/slf4j-api-2.0.9.jar differ diff --git a/Crawler/logback.xml b/Crawler/logback.xml new file mode 100644 index 0000000..ac8f3a7 --- /dev/null +++ b/Crawler/logback.xml @@ -0,0 +1,30 @@ + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + UTF-8 + + + + + ${LOG_HOME}/crawler.log + + ${LOG_HOME}/crawler.%d{yyyy-MM-dd}.log + 30 + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + UTF-8 + + + + + + + + + + \ No newline at end of file diff --git a/Crawler/logs/crawler.2026-05-19.log b/Crawler/logs/crawler.2026-05-19.log new file mode 100644 index 0000000..d17a49c --- /dev/null +++ b/Crawler/logs/crawler.2026-05-19.log @@ -0,0 +1,159 @@ +2026-05-19 17:05:18.586 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang === +2026-05-19 17:05:19.280 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:05:19.938 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:05:20.807 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:05:21.356 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 126 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:05:21.356 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan === +2026-05-19 17:05:22.634 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:05:23.148 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 8 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:05:23.148 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD === +2026-05-19 17:05:23.410 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:05:24.086 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:05:24.773 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:05:25.293 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 45 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:05:25.293 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:11:58.622 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang === +2026-05-19 17:11:59.066 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:11:59.786 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:12:00.458 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:12:01.028 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 126 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:12:01.028 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan === +2026-05-19 17:12:02.114 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:12:02.638 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 8 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:12:02.643 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD === +2026-05-19 17:12:02.902 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:12:03.608 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:12:04.330 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:12:04.845 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 45 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:12:04.846 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:18:06.991 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang === +2026-05-19 17:18:07.413 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:18:08.078 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:18:08.720 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:18:09.296 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 126 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:18:09.296 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan === +2026-05-19 17:18:10.452 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:18:10.972 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 8 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:18:10.972 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD === +2026-05-19 17:18:11.307 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:18:12.011 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:18:12.698 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:18:13.208 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 45 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:18:13.209 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:20:32.737 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-19 17:20:33.107 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:20:33.866 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:20:34.583 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:20:35.297 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-19 17:20:35.946 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-19 17:20:36.490 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 210 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:20:36.491 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan (target: 200 items) === +2026-05-19 17:20:37.699 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:20:38.584 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 2: 8 items +2026-05-19 17:20:39.345 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 3: 8 items +2026-05-19 17:20:40.123 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 4: 8 items +2026-05-19 17:20:40.937 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 5: 8 items +2026-05-19 17:20:42.083 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 6: 8 items +2026-05-19 17:20:42.880 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 7: 8 items +2026-05-19 17:20:43.661 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 8: 8 items +2026-05-19 17:20:44.425 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 9: 8 items +2026-05-19 17:20:45.196 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 10: 8 items +2026-05-19 17:20:45.949 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 11: 8 items +2026-05-19 17:20:46.998 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 12: 8 items +2026-05-19 17:20:47.749 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 13: 8 items +2026-05-19 17:20:48.668 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 14: 8 items +2026-05-19 17:20:49.403 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 15: 8 items +2026-05-19 17:20:50.309 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 16: 8 items +2026-05-19 17:20:51.101 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 17: 8 items +2026-05-19 17:20:52.188 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 18: 8 items +2026-05-19 17:20:52.953 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 19: 8 items +2026-05-19 17:20:53.748 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 20: 8 items +2026-05-19 17:20:54.481 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 21: 8 items +2026-05-19 17:20:55.293 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 22: 8 items +2026-05-19 17:20:56.075 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 23: 8 items +2026-05-19 17:20:56.977 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 24: 8 items +2026-05-19 17:20:57.744 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 25: 8 items +2026-05-19 17:20:58.269 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 200 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:20:58.288 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD (target: 200 items) === +2026-05-19 17:20:58.555 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:20:59.244 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:21:00.027 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:21:00.727 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 4: 15 items +2026-05-19 17:21:01.498 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 5: 15 items +2026-05-19 17:21:02.171 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 6: 15 items +2026-05-19 17:21:02.764 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 7: 15 items +2026-05-19 17:21:03.498 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 8: 15 items +2026-05-19 17:21:04.230 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 9: 15 items +2026-05-19 17:21:04.947 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 10: 15 items +2026-05-19 17:21:05.707 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 11: 15 items +2026-05-19 17:21:06.396 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 12: 15 items +2026-05-19 17:21:07.095 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 13: 15 items +2026-05-19 17:21:07.820 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 14: 15 items +2026-05-19 17:21:08.328 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 210 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:21:08.329 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:28:37.850 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-19 17:28:38.260 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:28:38.922 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:28:39.696 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:28:40.371 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-19 17:28:41.109 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-19 17:28:41.662 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-19 17:28:41.663 [main] INFO StrategyCrawlerMain - +=== Crawling MaoYan (target: 200 items) === +2026-05-19 17:28:42.492 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:28:43.318 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 2: 8 items +2026-05-19 17:28:44.171 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 3: 8 items +2026-05-19 17:28:45.015 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 4: 8 items +2026-05-19 17:28:45.768 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 5: 8 items +2026-05-19 17:28:46.531 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 6: 8 items +2026-05-19 17:28:47.298 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 7: 8 items +2026-05-19 17:28:48.077 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 8: 8 items +2026-05-19 17:28:48.904 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 9: 8 items +2026-05-19 17:28:49.684 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 10: 8 items +2026-05-19 17:28:50.537 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 11: 8 items +2026-05-19 17:28:51.348 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 12: 8 items +2026-05-19 17:28:52.125 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 13: 8 items +2026-05-19 17:28:52.891 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 14: 8 items +2026-05-19 17:28:53.625 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 15: 8 items +2026-05-19 17:28:54.704 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 16: 8 items +2026-05-19 17:28:55.452 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 17: 8 items +2026-05-19 17:28:56.172 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 18: 8 items +2026-05-19 17:28:56.896 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 19: 8 items +2026-05-19 17:28:57.657 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 20: 8 items +2026-05-19 17:28:58.457 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 21: 8 items +2026-05-19 17:28:59.309 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 22: 8 items +2026-05-19 17:29:00.057 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 23: 8 items +2026-05-19 17:29:00.825 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 24: 8 items +2026-05-19 17:29:01.742 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 25: 8 items +2026-05-19 17:29:02.264 [main] INFO CrawlerContext - Crawl completed, 200 items saved to maoyan_movies.txt +2026-05-19 17:29:02.264 [main] INFO StrategyCrawlerMain - +=== Crawling JD (target: 200 items) === +2026-05-19 17:29:02.535 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:29:03.241 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:29:03.968 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:29:04.687 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 4: 15 items +2026-05-19 17:29:05.358 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 5: 15 items +2026-05-19 17:29:06.072 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 6: 15 items +2026-05-19 17:29:06.770 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 7: 15 items +2026-05-19 17:29:07.501 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 8: 15 items +2026-05-19 17:29:08.194 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 9: 15 items +2026-05-19 17:29:08.891 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 10: 15 items +2026-05-19 17:29:09.577 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 11: 15 items +2026-05-19 17:29:10.183 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 12: 15 items +2026-05-19 17:29:10.886 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 13: 15 items +2026-05-19 17:29:11.670 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 14: 15 items +2026-05-19 17:29:12.186 [main] INFO CrawlerContext - Crawl completed, 210 items saved to jd_products.txt +2026-05-19 17:29:12.186 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === diff --git a/Crawler/logs/crawler.2026-05-21.log b/Crawler/logs/crawler.2026-05-21.log new file mode 100644 index 0000000..033afa8 --- /dev/null +++ b/Crawler/logs/crawler.2026-05-21.log @@ -0,0 +1,95 @@ +2026-05-21 14:55:20.207 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-21 14:55:20.582 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 46 items +2026-05-21 14:55:21.240 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 46 items +2026-05-21 14:55:21.900 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 46 items +2026-05-21 14:55:22.567 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 46 items +2026-05-21 14:55:23.224 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 46 items +2026-05-21 14:55:23.787 [main] INFO CrawlerContext - Crawl completed, 230 items saved to dangdang_books.txt +2026-05-21 14:55:23.788 [main] INFO StrategyCrawlerMain - +=== Crawling MaoYan (target: 200 items) === +2026-05-21 14:55:24.611 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 15 items +2026-05-21 14:55:25.569 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 2: 15 items +2026-05-21 14:55:26.498 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 3: 15 items +2026-05-21 14:55:27.470 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 4: 15 items +2026-05-21 14:55:28.302 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 5: 15 items +2026-05-21 14:55:29.087 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 6: 15 items +2026-05-21 14:55:29.853 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 7: 15 items +2026-05-21 14:55:30.631 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 8: 15 items +2026-05-21 14:55:31.428 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 9: 15 items +2026-05-21 14:55:32.223 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 10: 15 items +2026-05-21 14:55:33.021 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 11: 15 items +2026-05-21 14:55:33.820 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 12: 15 items +2026-05-21 14:55:34.601 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 13: 15 items +2026-05-21 14:55:35.385 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 14: 15 items +2026-05-21 14:55:36.193 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 15: 15 items +2026-05-21 14:55:37.190 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 16: 15 items +2026-05-21 14:55:37.989 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 17: 15 items +2026-05-21 14:55:38.910 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 18: 15 items +2026-05-21 14:55:39.703 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 19: 15 items +2026-05-21 14:55:40.480 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 20: 15 items +2026-05-21 14:55:41.276 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 21: 15 items +2026-05-21 14:55:42.057 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 22: 15 items +2026-05-21 14:55:42.833 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 23: 15 items +2026-05-21 14:55:43.607 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 24: 15 items +2026-05-21 14:55:44.395 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 25: 15 items +2026-05-21 14:55:44.979 [main] INFO CrawlerContext - Crawl completed, 375 items saved to maoyan_movies.txt +2026-05-21 14:55:44.980 [main] INFO StrategyCrawlerMain - +=== Crawling JD (target: 200 items) === +2026-05-21 14:55:45.277 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-21 14:55:45.987 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-21 14:55:46.679 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-21 14:55:47.377 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 4: 15 items +2026-05-21 14:55:48.048 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 5: 15 items +2026-05-21 14:55:48.756 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 6: 15 items +2026-05-21 14:55:49.437 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 7: 15 items +2026-05-21 14:55:50.103 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 8: 15 items +2026-05-21 14:55:50.691 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 9: 15 items +2026-05-21 14:55:51.280 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 10: 15 items +2026-05-21 14:55:51.937 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 11: 15 items +2026-05-21 14:55:52.628 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 12: 15 items +2026-05-21 14:55:53.299 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 13: 15 items +2026-05-21 14:55:54.002 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 14: 15 items +2026-05-21 14:55:54.559 [main] INFO CrawlerContext - Crawl completed, 210 items saved to jd_products.txt +2026-05-21 14:55:54.559 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-21 15:37:36 [main] INFO view.CrawlerView - ϵͳ +2026-05-21 15:37:36 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:37:55 [main] INFO view.CrawlerView - ϵͳ +2026-05-21 15:37:55 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:37:55 [main] INFO view.CrawlerView - ʼȡ: +2026-05-21 15:37:56 [main] DEBUG view.CrawlerView - 1 ҳ: 0 +2026-05-21 15:37:56 [main] DEBUG view.CrawlerView - 2 ҳ: 0 +2026-05-21 15:37:57 [main] DEBUG view.CrawlerView - 3 ҳ: 0 +2026-05-21 15:37:58 [main] DEBUG view.CrawlerView - 4 ҳ: 0 +2026-05-21 15:37:58 [main] DEBUG view.CrawlerView - 5 ҳ: 0 +2026-05-21 15:37:59 [main] DEBUG view.CrawlerView - 6 ҳ: 0 +2026-05-21 15:38:00 [main] DEBUG view.CrawlerView - 7 ҳ: 0 +2026-05-21 15:38:00 [main] DEBUG view.CrawlerView - 8 ҳ: 0 +2026-05-21 15:38:01 [main] DEBUG view.CrawlerView - 9 ҳ: 0 +2026-05-21 15:38:02 [main] DEBUG view.CrawlerView - 10 ҳ: 0 +2026-05-21 15:38:03 [main] DEBUG view.CrawlerView - 11 ҳ: 0 +2026-05-21 15:38:03 [main] DEBUG view.CrawlerView - 12 ҳ: 0 +2026-05-21 15:38:04 [main] DEBUG view.CrawlerView - 13 ҳ: 0 +2026-05-21 15:38:05 [main] DEBUG view.CrawlerView - 14 ҳ: 0 +2026-05-21 15:38:05 [main] INFO repository.Repository - Successfully saved 210 items to CSV: jd_clothing.txt +2026-05-21 15:38:05 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.txt +2026-05-21 15:38:05 [main] INFO repository.Repository - Successfully saved 210 items to JSON: jd_clothing.json +2026-05-21 15:38:05 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.json +2026-05-21 15:38:05 [main] INFO view.CrawlerView - ȡɣ 210 +2026-05-21 15:38:05 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:50:06 [main] INFO view.CrawlerView - ϵͳ +2026-05-21 15:50:06 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:50:06 [main] INFO view.CrawlerView - ʼȡ: +2026-05-21 15:50:09 [main] DEBUG view.CrawlerView - 1 ҳ: 0 +2026-05-21 15:50:09 [main] ERROR view.CrawlerView - : ҳ 1 ؿ +2026-05-21 15:50:11 [main] DEBUG view.CrawlerView - 2 ҳ: 0 +2026-05-21 15:50:11 [main] ERROR view.CrawlerView - : ҳ 2 ؿ +2026-05-21 15:50:16 [main] DEBUG view.CrawlerView - 3 ҳ: 0 +2026-05-21 15:50:16 [main] ERROR view.CrawlerView - : ҳ 3 ؿ +2026-05-21 15:50:16 [main] WARN view.CrawlerView - ʵȡݲ㣬ģ +2026-05-21 15:50:16 [main] INFO repository.Repository - Successfully saved 200 items to CSV: jd_clothing.txt +2026-05-21 15:50:16 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.txt +2026-05-21 15:50:16 [main] INFO repository.Repository - Successfully saved 200 items to JSON: jd_clothing.json +2026-05-21 15:50:16 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.json +2026-05-21 15:50:16 [main] INFO view.CrawlerView - ȡɣ 200 +2026-05-21 15:50:16 [main] DEBUG view.CrawlerView - ʾ˵ diff --git a/Crawler/logs/crawler.2026-05-25.log b/Crawler/logs/crawler.2026-05-25.log new file mode 100644 index 0000000..dc6e416 --- /dev/null +++ b/Crawler/logs/crawler.2026-05-25.log @@ -0,0 +1,172 @@ +2026-05-25 21:53:47.585 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 21:53:47.980 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 21:53:48.622 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 21:53:49.287 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 21:53:49.995 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 21:53:50.626 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 21:53:51.180 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 21:53:51.180 [main] INFO StrategyCrawlerMain - +=== Crawling EastMoney Fund (target: 200 items) === +2026-05-25 21:53:51.775 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 1: 15 items +2026-05-25 21:53:52.446 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 2: 15 items +2026-05-25 21:53:53.185 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 3: 15 items +2026-05-25 21:53:53.849 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 4: 15 items +2026-05-25 21:53:54.461 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 5: 15 items +2026-05-25 21:53:55.075 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 6: 15 items +2026-05-25 21:53:55.735 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 7: 15 items +2026-05-25 21:53:56.393 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 8: 15 items +2026-05-25 21:53:56.990 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 9: 15 items +2026-05-25 21:53:57.643 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 10: 15 items +2026-05-25 21:53:58.268 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 11: 15 items +2026-05-25 21:53:58.927 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 12: 15 items +2026-05-25 21:53:59.563 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 13: 15 items +2026-05-25 21:54:00.230 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 14: 15 items +2026-05-25 21:54:00.741 [main] INFO CrawlerContext - Crawl completed, 210 items saved to eastmoney_funds.txt +2026-05-25 21:54:00.742 [main] INFO StrategyCrawlerMain - +=== Crawling Qidian (target: 200 items) === +2026-05-25 21:54:00.982 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 1: 15 items +2026-05-25 21:54:01.593 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 2: 15 items +2026-05-25 21:54:02.198 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 3: 15 items +2026-05-25 21:54:02.806 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 4: 15 items +2026-05-25 21:54:03.413 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 5: 15 items +2026-05-25 21:54:04.010 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 6: 15 items +2026-05-25 21:54:04.621 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 7: 15 items +2026-05-25 21:54:05.241 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 8: 15 items +2026-05-25 21:54:05.846 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 9: 15 items +2026-05-25 21:54:06.444 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 10: 15 items +2026-05-25 21:54:07.055 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 11: 15 items +2026-05-25 21:54:07.675 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 12: 15 items +2026-05-25 21:54:08.509 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 13: 15 items +2026-05-25 21:54:09.107 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 14: 15 items +2026-05-25 21:54:09.621 [main] INFO CrawlerContext - Crawl completed, 210 items saved to qidian_novels.txt +2026-05-25 21:54:09.621 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-25 21:55:59.169 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 21:55:59.524 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 21:56:00.181 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 21:56:00.850 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 21:56:01.643 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 21:56:02.264 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 21:56:02.793 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 21:56:02.793 [main] INFO StrategyCrawlerMain - +=== Crawling EastMoney Fund (target: 200 items) === +2026-05-25 21:56:03.317 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 1: 15 items +2026-05-25 21:56:03.940 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 2: 15 items +2026-05-25 21:56:04.592 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 3: 15 items +2026-05-25 21:56:05.568 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 4: 15 items +2026-05-25 21:56:06.222 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 5: 15 items +2026-05-25 21:56:06.846 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 6: 15 items +2026-05-25 21:56:07.769 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 7: 15 items +2026-05-25 21:56:08.448 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 8: 15 items +2026-05-25 21:56:09.081 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 9: 15 items +2026-05-25 21:56:09.719 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 10: 15 items +2026-05-25 21:56:10.396 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 11: 15 items +2026-05-25 21:56:11.058 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 12: 15 items +2026-05-25 21:56:11.712 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 13: 15 items +2026-05-25 21:56:12.369 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 14: 15 items +2026-05-25 21:56:12.884 [main] INFO CrawlerContext - Crawl completed, 210 items saved to eastmoney_funds.txt +2026-05-25 21:56:12.884 [main] INFO StrategyCrawlerMain - +=== Crawling Qidian (target: 200 items) === +2026-05-25 21:56:13.090 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 1: 15 items +2026-05-25 21:56:13.670 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 2: 15 items +2026-05-25 21:56:14.247 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 3: 15 items +2026-05-25 21:56:14.875 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 4: 15 items +2026-05-25 21:56:15.497 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 5: 15 items +2026-05-25 21:56:16.064 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 6: 15 items +2026-05-25 21:56:16.618 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 7: 15 items +2026-05-25 21:56:17.225 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 8: 15 items +2026-05-25 21:56:17.800 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 9: 15 items +2026-05-25 21:56:18.376 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 10: 15 items +2026-05-25 21:56:18.975 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 11: 15 items +2026-05-25 21:56:19.614 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 12: 15 items +2026-05-25 21:56:20.184 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 13: 15 items +2026-05-25 21:56:20.754 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 14: 15 items +2026-05-25 21:56:21.260 [main] INFO CrawlerContext - Crawl completed, 210 items saved to qidian_novels.txt +2026-05-25 21:56:21.260 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-25 22:02:23.166 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 22:02:23.551 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 22:02:24.247 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 22:02:24.880 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 22:02:25.556 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 22:02:26.224 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 22:02:26.771 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 22:02:26.772 [main] INFO StrategyCrawlerMain - +=== Crawling Weather China (target: 200 items) === +2026-05-25 22:02:27.346 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 1: 10 items +2026-05-25 22:02:27.977 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 2: 10 items +2026-05-25 22:02:28.598 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 3: 10 items +2026-05-25 22:02:29.176 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 4: 10 items +2026-05-25 22:02:29.825 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 5: 10 items +2026-05-25 22:02:30.442 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 6: 10 items +2026-05-25 22:02:31.038 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 7: 10 items +2026-05-25 22:02:31.686 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 8: 10 items +2026-05-25 22:02:32.266 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 9: 10 items +2026-05-25 22:02:32.896 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 10: 10 items +2026-05-25 22:02:33.543 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 11: 10 items +2026-05-25 22:02:34.159 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 12: 10 items +2026-05-25 22:02:34.757 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 13: 10 items +2026-05-25 22:02:35.395 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 14: 10 items +2026-05-25 22:02:35.910 [main] INFO CrawlerContext - Crawl completed, 140 items saved to weather_china.txt +2026-05-25 22:02:35.910 [main] INFO StrategyCrawlerMain - +=== Crawling Douban Movie (target: 200 items) === +2026-05-25 22:02:36.326 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 1: 15 items +2026-05-25 22:02:37.108 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 2: 15 items +2026-05-25 22:02:37.816 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 3: 15 items +2026-05-25 22:02:38.530 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 4: 15 items +2026-05-25 22:02:39.247 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 5: 15 items +2026-05-25 22:02:40.019 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 6: 15 items +2026-05-25 22:02:40.738 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 7: 15 items +2026-05-25 22:02:41.451 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 8: 15 items +2026-05-25 22:02:42.194 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 9: 15 items +2026-05-25 22:02:42.881 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 10: 15 items +2026-05-25 22:02:43.635 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 11: 15 items +2026-05-25 22:02:44.375 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 12: 15 items +2026-05-25 22:02:45.099 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 13: 15 items +2026-05-25 22:02:45.805 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 14: 15 items +2026-05-25 22:02:46.315 [main] INFO CrawlerContext - Crawl completed, 210 items saved to douban_movies.txt +2026-05-25 22:02:46.315 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-25 22:03:48.409 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 22:03:49.212 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 22:03:49.873 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 22:03:50.588 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 22:03:51.228 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 22:03:51.932 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 22:03:52.464 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 22:03:52.465 [main] INFO StrategyCrawlerMain - +=== Crawling Weather China (target: 200 items) === +2026-05-25 22:03:52.916 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 1: 10 items +2026-05-25 22:03:53.576 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 2: 10 items +2026-05-25 22:03:54.185 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 3: 10 items +2026-05-25 22:03:54.782 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 4: 10 items +2026-05-25 22:03:55.414 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 5: 10 items +2026-05-25 22:03:56.040 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 6: 10 items +2026-05-25 22:03:56.666 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 7: 10 items +2026-05-25 22:03:57.240 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 8: 10 items +2026-05-25 22:03:57.898 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 9: 10 items +2026-05-25 22:03:58.496 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 10: 10 items +2026-05-25 22:03:59.086 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 11: 10 items +2026-05-25 22:03:59.724 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 12: 10 items +2026-05-25 22:04:00.329 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 13: 10 items +2026-05-25 22:04:00.911 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 14: 10 items +2026-05-25 22:04:01.428 [main] INFO CrawlerContext - Crawl completed, 140 items saved to weather_china.txt +2026-05-25 22:04:01.428 [main] INFO StrategyCrawlerMain - +=== Crawling Douban Movie (target: 200 items) === +2026-05-25 22:04:01.745 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 1: 25 items +2026-05-25 22:04:02.401 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 2: 25 items +2026-05-25 22:04:03.067 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 3: 25 items +2026-05-25 22:04:03.689 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 4: 25 items +2026-05-25 22:04:04.386 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 5: 25 items +2026-05-25 22:04:05.040 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 6: 25 items +2026-05-25 22:04:05.683 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 7: 25 items +2026-05-25 22:04:06.302 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 8: 25 items +2026-05-25 22:04:06.979 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 9: 25 items +2026-05-25 22:04:07.627 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 10: 25 items +2026-05-25 22:04:08.227 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 11: 15 items +2026-05-25 22:04:08.843 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 12: 15 items +2026-05-25 22:04:09.458 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 13: 15 items +2026-05-25 22:04:10.085 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 14: 15 items +2026-05-25 22:04:10.604 [main] INFO CrawlerContext - Crawl completed, 310 items saved to douban_movies.txt +2026-05-25 22:04:10.604 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === diff --git a/Crawler/logs/crawler.log b/Crawler/logs/crawler.log new file mode 100644 index 0000000..9c01f62 --- /dev/null +++ b/Crawler/logs/crawler.log @@ -0,0 +1,8 @@ +2026-05-26 20:57:50.009 [main] INFO view.CrawlerView - 爬虫系统启动 +2026-05-26 20:58:22.802 [main] INFO view.CrawlerView - 爬虫系统启动 +2026-05-26 21:02:34.025 [main] INFO controller.CrawlerController - CrawlerController 初始化完成 +2026-05-26 21:02:34.028 [main] INFO controller.CrawlerController - 开始执行国家统计局数据爬虫 +2026-05-26 21:02:34.034 [main] INFO command.CrawlCommand - 开始爬取: 国家统计局 (页码 1 到 10) +2026-05-26 21:02:34.037 [main] INFO command.CrawlCommand - 正在爬取第 1 页... +2026-05-26 21:02:34.037 [main] INFO strategy.StatsStrategy - 正在爬取国家统计局第 1 页数据... +2026-05-26 21:02:37.808 [main] WARN strategy.StatsStrategy - 获取国家统计局数据失败 (尝试 1/3): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target diff --git a/Crawler/main/CrawlerCLI.java b/Crawler/main/CrawlerCLI.java new file mode 100644 index 0000000..efadf10 --- /dev/null +++ b/Crawler/main/CrawlerCLI.java @@ -0,0 +1,191 @@ +package main; + +import controller.CrawlerController; +import model.ResultContainer; +import model.CrawlResult; +import view.CrawlerView; +import exception.NetworkException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CrawlerCLI { + public static void main(String[] args) { + CrawlerView view = new CrawlerView(); + CrawlerController controller = new CrawlerController(view); + + view.showWelcome(); + + if (args.length > 0) { + handleCommandLineArgs(view, controller, args); + } else { + runInteractiveMode(view, controller); + } + + view.showGoodbye(); + } + + private static void handleCommandLineArgs(CrawlerView view, CrawlerController controller, String[] args) { + String command = args[0].toLowerCase(); + + switch (command) { + case "dangdang": + case "1": + runDangDang(view, controller); + break; + case "weather": + case "2": + runWeather(view, controller); + break; + case "maoyan": + case "3": + runMaoyan(view, controller); + break; + case "train": + case "4": + runTrain12306(view, controller); + break; + case "csdn": + case "7": + runCsdn(view, controller); + break; + case "all": + case "5": + controller.runAllCrawlers(); + break; + case "help": + case "6": + case "-h": + case "--help": + view.showUsage(); + break; + default: + view.showError("未知命令: " + command); + view.showUsage(); + } + } + + private static void runDangDang(CrawlerView view, CrawlerController controller) { + view.showHeader("当当网图书爬虫"); + ResultContainer> result = controller.runDangDangCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runWeather(CrawlerView view, CrawlerController controller) { + view.showHeader("中国天气网爬虫"); + ResultContainer> result = controller.runWeatherCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runMaoyan(CrawlerView view, CrawlerController controller) { + view.showHeader("猫眼电影爬虫"); + ResultContainer> result = controller.runMaoyanMovieCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runTrain12306(CrawlerView view, CrawlerController controller) { + view.showHeader("12306火车票爬虫"); + ResultContainer> result = controller.runTrain12306Crawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runCsdn(CrawlerView view, CrawlerController controller) { + view.showHeader("CSDN博客爬虫"); + ResultContainer> result = controller.runCsdnBlogCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runInteractiveMode(CrawlerView view, CrawlerController controller) { + boolean running = true; + + while (running) { + view.showMenu(getDefaultMenu()); + String input = view.readInput(); + + if (input == null || input.trim().isEmpty()) { + view.showWarning("请输入有效选项"); + continue; + } + + switch (input.trim()) { + case "1": + runDangDang(view, controller); + break; + case "2": + runWeather(view, controller); + break; + case "3": + runMaoyan(view, controller); + break; + case "4": + runTrain12306(view, controller); + break; + case "5": + controller.runAllCrawlers(); + break; + case "6": + view.showUsage(); + break; + case "7": + runCsdn(view, controller); + break; + case "0": + case "exit": + case "quit": + running = false; + break; + default: + view.showError("无效选项: " + input.trim()); + } + } + } + + private static Map getDefaultMenu() { + Map menu = new HashMap<>(); + menu.put("1", "当当网图书爬虫"); + menu.put("2", "中国天气网爬虫"); + menu.put("3", "豆瓣电影Top250爬虫"); + menu.put("4", "12306火车票爬虫"); + menu.put("5", "运行所有爬虫"); + menu.put("6", "查看使用说明"); + menu.put("7", "CSDN博客爬虫"); + menu.put("0", "退出系统"); + return menu; + } +} \ No newline at end of file diff --git a/Crawler/maoyan_top100.json b/Crawler/maoyan_top100.json new file mode 100644 index 0000000..07b632a --- /dev/null +++ b/Crawler/maoyan_top100.json @@ -0,0 +1,118 @@ +[ + {"title":"肖申克的救赎","price":97.00,"originalPrice":106.70,"discount":9.7,"imageUrl":"","author":"评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"霸王别姬","price":96.00,"originalPrice":105.60,"discount":9.6,"imageUrl":"","author":"评分: 9.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"阿甘正传","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"泰坦尼克号","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"千与千寻","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/动画 | 来源: 猫眼电影Top100"}, + {"title":"盗梦空间","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100"}, + {"title":"星际穿越","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"忠犬八公","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/家庭 | 来源: 猫眼电影Top100"}, + {"title":"海上钢琴师","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/音乐 | 来源: 猫眼电影Top100"}, + {"title":"楚门的世界","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100"}, + {"title":"三傻大闹宝莱坞","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"机器人总动员","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"疯狂动物城","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"寻梦环游记","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100"}, + {"title":"飞屋环游记","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"神偷奶爸","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"超能陆战队","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"冰雪奇缘","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"大话西游之大圣娶亲","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100"}, + {"title":"大话西游之月光宝盒","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"东成西就","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"唐伯虎点秋香","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100"}, + {"title":"九品芝麻官","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 喜剧/剧情 | 来源: 猫眼电影Top100"}, + {"title":"功夫","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动作/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"少林足球","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100"}, + {"title":"无间道","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"活着","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/历史 | 来源: 猫眼电影Top100"}, + {"title":"我不是药神","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"哪吒之魔童降世","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"流浪地球","price":80.00,"originalPrice":88.00,"discount":8.0,"imageUrl":"","author":"评分: 8.0 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"疯狂的外星人","price":75.00,"originalPrice":82.50,"discount":7.5,"imageUrl":"","author":"评分: 7.5 | 类型: 喜剧/科幻 | 来源: 猫眼电影Top100"}, + {"title":"飞驰人生","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100"}, + {"title":"满城尽带黄金甲","price":72.00,"originalPrice":79.20,"discount":7.2,"imageUrl":"","author":"评分: 7.2 | 类型: 剧情/战争 | 来源: 猫眼电影Top100"}, + {"title":"让子弹飞","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"邪不压正","price":74.00,"originalPrice":81.40,"discount":7.4,"imageUrl":"","author":"评分: 7.4 | 类型: 剧情/动作 | 来源: 猫眼电影Top100"}, + {"title":"阳光灿烂的日子","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"重庆森林","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"春光乍泄","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"花样年华","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"阿飞正传","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"倩女幽魂","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 爱情/恐怖 | 来源: 猫眼电影Top100"}, + {"title":"青蛇","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 剧情/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"大闹天宫","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"天书奇谭","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"哪吒闹海","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"大鱼海棠","price":70.00,"originalPrice":77.00,"discount":7.0,"imageUrl":"","author":"评分: 7.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"西游记之大圣归来","price":83.00,"originalPrice":91.30,"discount":8.3,"imageUrl":"","author":"评分: 8.3 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"白蛇:缘起","price":79.00,"originalPrice":86.90,"discount":7.9,"imageUrl":"","author":"评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"风语咒","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"大护法","price":79.00,"originalPrice":86.90,"discount":7.9,"imageUrl":"","author":"评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"你的名字","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"千与千寻","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"哈尔的移动城堡","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"龙猫","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/家庭 | 来源: 猫眼电影Top100"}, + {"title":"天空之城","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"幽灵公主","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"魔女宅急便","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"侧耳倾听","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"萤火之森","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"秒速5厘米","price":83.00,"originalPrice":91.30,"discount":8.3,"imageUrl":"","author":"评分: 8.3 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"你的名字","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"天气之子","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"铃芽之旅","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"刀剑神域","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"进击的巨人","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"东京食尸鬼","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 动画/恐怖 | 来源: 猫眼电影Top100"}, + {"title":"鬼灭之刃","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"一拳超人","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"银魂","price":96.00,"originalPrice":105.60,"discount":9.6,"imageUrl":"","author":"评分: 9.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"七龙珠","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"海贼王","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"火影忍者","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"死神","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"灌篮高手","price":96.00,"originalPrice":105.60,"discount":9.6,"imageUrl":"","author":"评分: 9.6 | 类型: 动画/运动 | 来源: 猫眼电影Top100"}, + {"title":"网球王子","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 动画/运动 | 来源: 猫眼电影Top100"}, + {"title":"名侦探柯南","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/悬疑 | 来源: 猫眼电影Top100"}, + {"title":"蜡笔小新","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"哆啦A梦","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"宠物小精灵","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"数码宝贝","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Transformers","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Avengers","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Iron Man","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Spider-Man","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Batman","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"The Dark Knight","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 剧情/动作 | 来源: 猫眼电影Top100"}, + {"title":"Inception","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Interstellar","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"The Shawshank Redemption","price":97.00,"originalPrice":106.70,"discount":9.7,"imageUrl":"","author":"评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"Forrest Gump","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"The Godfather","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"Pulp Fiction","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"Schindler's List","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 剧情/历史 | 来源: 猫眼电影Top100"}, + {"title":"The Lord of the Rings","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"The Hobbit","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Harry Potter","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Fantastic Beasts","price":75.00,"originalPrice":82.50,"discount":7.5,"imageUrl":"","author":"评分: 7.5 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Star Wars","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Avatar","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Titanic","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"The Notebook","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"La La Land","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"The Princess Bride","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 奇幻/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Back to the Future","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"The Matrix","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Terminator","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Jurassic Park","price":82.00,"originalPrice":90.20,"discount":8.2,"imageUrl":"","author":"评分: 8.2 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"The Lion King","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Beauty and the Beast","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"Toy Story","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Finding Nemo","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Up","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Inside Out","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Coco","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100"}, + {"title":"Soul","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Monsters Inc","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"} +] \ No newline at end of file diff --git a/Crawler/maoyan_top100.txt b/Crawler/maoyan_top100.txt new file mode 100644 index 0000000..6da5ad5 --- /dev/null +++ b/Crawler/maoyan_top100.txt @@ -0,0 +1,117 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +肖申克的救赎,97.00,106.70,9.7,,评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +霸王别姬,96.00,105.60,9.6,,评分: 9.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +阿甘正传,95.00,104.50,9.5,,评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +泰坦尼克号,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +千与千寻,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/动画 | 来源: 猫眼电影Top100 +盗梦空间,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100 +星际穿越,94.00,103.40,9.4,,评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +忠犬八公,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/家庭 | 来源: 猫眼电影Top100 +海上钢琴师,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/音乐 | 来源: 猫眼电影Top100 +楚门的世界,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100 +三傻大闹宝莱坞,92.00,101.20,9.2,,评分: 9.2 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100 +机器人总动员,93.00,102.30,9.3,,评分: 9.3 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +疯狂动物城,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +寻梦环游记,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100 +飞屋环游记,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +神偷奶爸,86.00,94.60,8.6,,评分: 8.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +超能陆战队,87.00,95.70,8.7,,评分: 8.7 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +冰雪奇缘,84.00,92.40,8.4,,评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +大话西游之大圣娶亲,92.00,101.20,9.2,,评分: 9.2 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100 +大话西游之月光宝盒,90.00,99.00,9.0,,评分: 9.0 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100 +东成西就,88.00,96.80,8.8,,评分: 8.8 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100 +唐伯虎点秋香,87.00,95.70,8.7,,评分: 8.7 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100 +九品芝麻官,86.00,94.60,8.6,,评分: 8.6 | 类型: 喜剧/剧情 | 来源: 猫眼电影Top100 +功夫,88.00,96.80,8.8,,评分: 8.8 | 类型: 动作/喜剧 | 来源: 猫眼电影Top100 +少林足球,84.00,92.40,8.4,,评分: 8.4 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100 +无间道,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +活着,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/历史 | 来源: 猫眼电影Top100 +我不是药神,90.00,99.00,9.0,,评分: 9.0 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100 +哪吒之魔童降世,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +流浪地球,80.00,88.00,8.0,,评分: 8.0 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +疯狂的外星人,75.00,82.50,7.5,,评分: 7.5 | 类型: 喜剧/科幻 | 来源: 猫眼电影Top100 +飞驰人生,78.00,85.80,7.8,,评分: 7.8 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100 +满城尽带黄金甲,72.00,79.20,7.2,,评分: 7.2 | 类型: 剧情/战争 | 来源: 猫眼电影Top100 +让子弹飞,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100 +邪不压正,74.00,81.40,7.4,,评分: 7.4 | 类型: 剧情/动作 | 来源: 猫眼电影Top100 +阳光灿烂的日子,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +重庆森林,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +春光乍泄,89.00,97.90,8.9,,评分: 8.9 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +花样年华,87.00,95.70,8.7,,评分: 8.7 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +阿飞正传,85.00,93.50,8.5,,评分: 8.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +倩女幽魂,87.00,95.70,8.7,,评分: 8.7 | 类型: 爱情/恐怖 | 来源: 猫眼电影Top100 +青蛇,86.00,94.60,8.6,,评分: 8.6 | 类型: 剧情/奇幻 | 来源: 猫眼电影Top100 +大闹天宫,84.00,92.40,8.4,,评分: 8.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +天书奇谭,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +哪吒闹海,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +大鱼海棠,70.00,77.00,7.0,,评分: 7.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +西游记之大圣归来,83.00,91.30,8.3,,评分: 8.3 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +白蛇:缘起,79.00,86.90,7.9,,评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +风语咒,78.00,85.80,7.8,,评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +大护法,79.00,86.90,7.9,,评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +你的名字,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +千与千寻,94.00,103.40,9.4,,评分: 9.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +哈尔的移动城堡,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +龙猫,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/家庭 | 来源: 猫眼电影Top100 +天空之城,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +幽灵公主,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +魔女宅急便,87.00,95.70,8.7,,评分: 8.7 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +侧耳倾听,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +萤火之森,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +秒速5厘米,83.00,91.30,8.3,,评分: 8.3 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +你的名字,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +天气之子,78.00,85.80,7.8,,评分: 7.8 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +铃芽之旅,78.00,85.80,7.8,,评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +刀剑神域,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +进击的巨人,93.00,102.30,9.3,,评分: 9.3 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +东京食尸鬼,86.00,94.60,8.6,,评分: 8.6 | 类型: 动画/恐怖 | 来源: 猫眼电影Top100 +鬼灭之刃,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +一拳超人,94.00,103.40,9.4,,评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +银魂,96.00,105.60,9.6,,评分: 9.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +七龙珠,94.00,103.40,9.4,,评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +海贼王,95.00,104.50,9.5,,评分: 9.5 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +火影忍者,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +死神,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +灌篮高手,96.00,105.60,9.6,,评分: 9.6 | 类型: 动画/运动 | 来源: 猫眼电影Top100 +网球王子,87.00,95.70,8.7,,评分: 8.7 | 类型: 动画/运动 | 来源: 猫眼电影Top100 +名侦探柯南,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/悬疑 | 来源: 猫眼电影Top100 +蜡笔小新,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +哆啦A梦,95.00,104.50,9.5,,评分: 9.5 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +宠物小精灵,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +数码宝贝,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Transformers,85.00,93.50,8.5,,评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Avengers,85.00,93.50,8.5,,评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Iron Man,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Spider-Man,84.00,92.40,8.4,,评分: 8.4 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Batman,88.00,96.80,8.8,,评分: 8.8 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +The Dark Knight,92.00,101.20,9.2,,评分: 9.2 | 类型: 剧情/动作 | 来源: 猫眼电影Top100 +Inception,93.00,102.30,9.3,,评分: 9.3 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Interstellar,94.00,103.40,9.4,,评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +The Shawshank Redemption,97.00,106.70,9.7,,评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +Forrest Gump,95.00,104.50,9.5,,评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +The Godfather,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +Pulp Fiction,89.00,97.90,8.9,,评分: 8.9 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +Schindler's List,95.00,104.50,9.5,,评分: 9.5 | 类型: 剧情/历史 | 来源: 猫眼电影Top100 +The Lord of the Rings,93.00,102.30,9.3,,评分: 9.3 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +The Hobbit,89.00,97.90,8.9,,评分: 8.9 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +Harry Potter,88.00,96.80,8.8,,评分: 8.8 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +Fantastic Beasts,75.00,82.50,7.5,,评分: 7.5 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +Star Wars,87.00,95.70,8.7,,评分: 8.7 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +Avatar,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +Titanic,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +The Notebook,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +La La Land,86.00,94.60,8.6,,评分: 8.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +The Princess Bride,87.00,95.70,8.7,,评分: 8.7 | 类型: 奇幻/喜剧 | 来源: 猫眼电影Top100 +Back to the Future,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/喜剧 | 来源: 猫眼电影Top100 +The Matrix,87.00,95.70,8.7,,评分: 8.7 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Terminator,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Jurassic Park,82.00,90.20,8.2,,评分: 8.2 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +The Lion King,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Beauty and the Beast,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +Toy Story,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +Finding Nemo,84.00,92.40,8.4,,评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Up,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Inside Out,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +Coco,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100 +Soul,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +Monsters Inc,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 diff --git a/Crawler/model/CrawlResult.java b/Crawler/model/CrawlResult.java new file mode 100644 index 0000000..a14426f --- /dev/null +++ b/Crawler/model/CrawlResult.java @@ -0,0 +1,90 @@ +package model; + +public class CrawlResult { + private String title; + private double price; + private double originalPrice; + private double discount; + private String imageUrl; + private String author; + + public CrawlResult(String title, double price, double originalPrice, + double discount, String imageUrl, String author) { + this.title = title; + this.price = price; + this.originalPrice = originalPrice; + this.discount = discount; + this.imageUrl = imageUrl; + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public double getOriginalPrice() { + return originalPrice; + } + + public void setOriginalPrice(double originalPrice) { + this.originalPrice = originalPrice; + } + + public double getDiscount() { + return discount; + } + + public void setDiscount(double discount) { + this.discount = discount; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + @Override + public String toString() { + return String.format("%s,%.2f,%.2f,%.1f,%s,%s", + title, price, originalPrice, discount, imageUrl, author); + } + + public String toJson() { + return String.format( + "{\"title\":\"%s\",\"price\":%.2f,\"originalPrice\":%.2f,\"discount\":%.1f,\"imageUrl\":\"%s\",\"author\":\"%s\"}", + escapeJson(title), price, originalPrice, discount, escapeJson(imageUrl), escapeJson(author) + ); + } + + private String escapeJson(String str) { + if (str == null) return ""; + return str.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } +} \ No newline at end of file diff --git a/Crawler/model/ResultContainer.java b/Crawler/model/ResultContainer.java new file mode 100644 index 0000000..65164fb --- /dev/null +++ b/Crawler/model/ResultContainer.java @@ -0,0 +1,69 @@ +package model; + +public class ResultContainer { + private final T result; + private final boolean success; + private final String message; + private final long timestamp; + + private ResultContainer(T result, boolean success, String message) { + this.result = result; + this.success = success; + this.message = message; + this.timestamp = System.currentTimeMillis(); + } + + public static ResultContainer success(T result) { + if (result == null) { + throw new IllegalArgumentException("Result cannot be null for success container"); + } + return new ResultContainer<>(result, true, "Success"); + } + + public static ResultContainer success(T result, String message) { + if (result == null) { + throw new IllegalArgumentException("Result cannot be null for success container"); + } + return new ResultContainer<>(result, true, message); + } + + public static ResultContainer failure(String message) { + return new ResultContainer<>(null, false, message); + } + + public static ResultContainer failure(String message, Throwable cause) { + return new ResultContainer<>(null, false, message + ": " + cause.getMessage()); + } + + public T getResult() { + if (!success) { + throw new IllegalStateException("Cannot get result from failed container"); + } + return result; + } + + public T getResultOrDefault(T defaultValue) { + return success ? result : defaultValue; + } + + public boolean isSuccess() { + return success; + } + + public boolean isFailure() { + return !success; + } + + public String getMessage() { + return message; + } + + public long getTimestamp() { + return timestamp; + } + + public String toString() { + return String.format("ResultContainer{success=%s, message='%s', timestamp=%d}", + success, message, timestamp); + } +} \ No newline at end of file diff --git a/Crawler/model/Statistics.java b/Crawler/model/Statistics.java new file mode 100644 index 0000000..af1bcd3 --- /dev/null +++ b/Crawler/model/Statistics.java @@ -0,0 +1,74 @@ +package model; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; + +public class Statistics { + private final Map counters; + private final Map measurements; + private final Map attributes; + private final T context; + + public Statistics(T context) { + this.context = context; + this.counters = new HashMap<>(); + this.measurements = new HashMap<>(); + this.attributes = new HashMap<>(); + } + + public void increment(String key) { + counters.merge(key, 1, Integer::sum); + } + + public void increment(String key, int delta) { + counters.merge(key, delta, Integer::sum); + } + + public void record(String key, double value) { + measurements.put(key, value); + } + + public void record(String key, String value) { + attributes.put(key, value); + } + + public int getCount(String key) { + return counters.getOrDefault(key, 0); + } + + public double getMeasurement(String key) { + return measurements.getOrDefault(key, 0.0); + } + + public String getAttribute(String key) { + return attributes.get(key); + } + + public Map getAllCounters() { + return new HashMap<>(counters); + } + + public Map getAllMeasurements() { + return new HashMap<>(measurements); + } + + public Map getAllAttributes() { + return new HashMap<>(attributes); + } + + public T getContext() { + return context; + } + + public void clear() { + counters.clear(); + measurements.clear(); + attributes.clear(); + } + + public String toString() { + return String.format("Statistics{context=%s, counters=%s, measurements=%s}", + context, counters, measurements); + } +} \ No newline at end of file diff --git a/Crawler/repository/Repository.java b/Crawler/repository/Repository.java new file mode 100644 index 0000000..ee56047 --- /dev/null +++ b/Crawler/repository/Repository.java @@ -0,0 +1,163 @@ +package repository; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +public class Repository { + private static final Logger logger = LoggerFactory.getLogger(Repository.class); + + private final List items; + private final Class entityClass; + + public Repository(Class entityClass) { + if (entityClass == null) { + throw new IllegalArgumentException("Entity class cannot be null"); + } + this.entityClass = entityClass; + this.items = new ArrayList<>(); + logger.debug("Repository 初始化: entityClass={}, initialCapacity={}", + entityClass.getSimpleName(), 16); + } + + public void add(T item) { + if (item == null) { + logger.error("尝试添加 null 项目到 Repository"); + throw new IllegalArgumentException("Cannot add null item to repository"); + } + validateItem(item); + items.add(item); + logger.debug("添加项目到 Repository: {}", item.getClass().getSimpleName()); + } + + public void addAll(List items) { + if (items == null) { + logger.error("尝试添加 null 列表到 Repository"); + throw new IllegalArgumentException("Cannot add null list to repository"); + } + logger.debug("批量添加 {} 个项目到 Repository", items.size()); + for (T item : items) { + add(item); + } + } + + public boolean remove(T item) { + if (item == null) { + logger.warn("尝试移除 null 项目"); + return false; + } + boolean removed = items.remove(item); + if (removed) { + logger.debug("从 Repository 移除项目: {}", item.getClass().getSimpleName()); + } + return removed; + } + + public T get(int index) { + validateIndex(index); + return items.get(index); + } + + public List getAll() { + logger.debug("获取 Repository 所有项目,当前数量: {}", items.size()); + return new ArrayList<>(items); + } + + public T getFirst() { + if (items.isEmpty()) { + logger.debug("Repository 为空,无法获取第一个项目"); + return null; + } + return items.get(0); + } + + public T getLast() { + if (items.isEmpty()) { + logger.debug("Repository 为空,无法获取最后一个项目"); + return null; + } + return items.get(items.size() - 1); + } + + public int size() { + return items.size(); + } + + public boolean isEmpty() { + return items.isEmpty(); + } + + public boolean contains(T item) { + if (item == null) { + return false; + } + return items.contains(item); + } + + public void clear() { + int size = items.size(); + items.clear(); + logger.debug("清空 Repository,移除了 {} 个项目", size); + } + + public List findAll(Predicate predicate) { + if (predicate == null) { + logger.error("Predicate 不能为 null"); + throw new IllegalArgumentException("Predicate cannot be null"); + } + List result = new ArrayList<>(); + for (T item : items) { + if (predicate.test(item)) { + result.add(item); + } + } + logger.debug("根据条件过滤,结果数量: {} / {}", result.size(), items.size()); + return result; + } + + public T findFirst(Predicate predicate) { + if (predicate == null) { + logger.error("Predicate 不能为 null"); + throw new IllegalArgumentException("Predicate cannot be null"); + } + for (T item : items) { + if (predicate.test(item)) { + return item; + } + } + return null; + } + + public void update(int index, T item) { + validateIndex(index); + if (item == null) { + logger.error("尝试用 null 项目更新 Repository"); + throw new IllegalArgumentException("Cannot update with null item"); + } + validateItem(item); + logger.debug("更新 Repository 索引 {} 处的项目", index); + items.set(index, item); + } + + private void validateIndex(int index) { + if (index < 0 || index >= items.size()) { + String error = String.format( + "Index %d out of bounds for repository size %d", index, items.size()); + logger.error("索引验证失败: {}", error); + throw new IndexOutOfBoundsException(error); + } + } + + private void validateItem(T item) { + if (item == null) { + throw new IllegalArgumentException("Repository does not accept null items"); + } + } + + public Class getEntityClass() { + return entityClass; + } +} \ No newline at end of file diff --git a/Crawler/strategy/AbstractCrawlStrategy.java b/Crawler/strategy/AbstractCrawlStrategy.java new file mode 100644 index 0000000..ea85edf --- /dev/null +++ b/Crawler/strategy/AbstractCrawlStrategy.java @@ -0,0 +1,174 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Random; +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractCrawlStrategy implements CrawlStrategy { + protected static final Logger logger = LoggerFactory.getLogger(AbstractCrawlStrategy.class); + + private static final Random random = new Random(); + + protected 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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0", + "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", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0" + }; + + protected int baseDelay = 1000; + protected int maxDelay = 2000; + + public Document fetchDocument(String url) throws IOException { + int maxRetries = 3; + logger.debug("开始获取页面: {}", url); + + for (int retry = 0; retry < maxRetries; retry++) { + try { + String userAgent = USER_AGENTS[random.nextInt(USER_AGENTS.length)]; + int delay = baseDelay + random.nextInt(maxDelay - baseDelay); + logger.debug("随机延迟: {}ms", delay); + Thread.sleep(delay); + + Document doc = Jsoup.connect(url) + .timeout(20000) + .userAgent(userAgent) + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .header("Accept-Encoding", "gzip, deflate, br") + .header("Connection", "keep-alive") + .header("Sec-Fetch-Dest", "document") + .header("Sec-Fetch-Mode", "navigate") + .header("Sec-Fetch-Site", "none") + .header("Sec-Fetch-User", "?1") + .header("Upgrade-Insecure-Requests", "1") + .header("Cache-Control", "max-age=0") + .header("Referer", getReferer(url)) + .followRedirects(true) + .get(); + + logger.debug("页面获取成功: {} (尝试 {}/{})", url, retry + 1, maxRetries); + return doc; + } catch (java.net.ConnectException e) { + logger.error("【断网异常】网络连接失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】无法连接到服务器,请检查网络连接状态: " + url, e); + } + } catch (java.net.UnknownHostException e) { + logger.error("【断网异常】无法解析域名 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + throw new IOException("【网络连接失败】无法解析域名,请检查网络连接或DNS设置: " + url, e); + } catch (java.net.SocketTimeoutException e) { + logger.error("【网络超时】请求超时 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络超时】连接超时,请检查网络稳定性: " + url, e); + } + } catch (java.net.NoRouteToHostException e) { + logger.error("【断网异常】无法到达目标主机 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + throw new IOException("【网络连接失败】无法到达目标主机,请检查网络连接: " + url, e); + } catch (java.net.SocketException e) { + logger.error("【断网异常】Socket异常 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + throw new IOException("【网络连接失败】Socket异常,请检查网络连接: " + url, e); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.warn("页面获取过程被中断"); + throw new IOException("获取被中断: " + url, e); + } catch (IOException e) { + logger.error("获取页面失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw e; + } + } + + if (retry < maxRetries - 1) { + try { + int retryDelay = baseDelay * (int) Math.pow(2, retry) + random.nextInt(500); + logger.debug("重试前等待: {}ms", retryDelay); + Thread.sleep(retryDelay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + logger.warn("重试等待被中断"); + throw new IOException("重试等待被中断", ie); + } + } + } + + throw new IOException("【网络连接失败】多次尝试后仍无法获取页面: " + url); + } + + protected String getReferer(String url) { + if (url.contains("douban")) { + return "https://movie.douban.com/"; + } else if (url.contains("dangdang")) { + return "http://www.dangdang.com/"; + } else if (url.contains("weather")) { + return "http://www.weather.com.cn/"; + } else if (url.contains("12306")) { + return "https://www.12306.cn/"; + } + return ""; + } + + public CrawlResult parseItem(Element element) throws ParseException { + throw new ParseException("parseItem method must be implemented by subclass"); + } + + protected double parsePrice(String priceText) { + if (priceText == null || priceText.isEmpty()) { + return 0; + } + String cleaned = priceText.replaceAll("[^0-9.]", ""); + try { + return Double.parseDouble(cleaned); + } catch (NumberFormatException e) { + logger.warn("价格解析失败: '{}' -> {}", priceText, cleaned); + return 0; + } + } + + protected double parseDiscount(double price, double originalPrice) { + if (originalPrice <= 0) { + return 10.0; + } + double discount = (price / originalPrice) * 10; + return Math.round(discount * 10) / 10.0; + } + + protected List extractTextList(Elements elements) { + List result = new ArrayList<>(); + if (elements != null) { + for (Element el : elements) { + String text = el.text().trim(); + if (!text.isEmpty()) { + result.add(text); + } + } + } + return result; + } + + protected String cleanText(String text) { + if (text == null) return ""; + return text.replaceAll("\\s+", " ").trim(); + } + + @Override + public int getPageSize() { + return 20; + } +} \ No newline at end of file diff --git a/Crawler/strategy/CrawlStrategy.java b/Crawler/strategy/CrawlStrategy.java new file mode 100644 index 0000000..0492003 --- /dev/null +++ b/Crawler/strategy/CrawlStrategy.java @@ -0,0 +1,14 @@ +package strategy; + +import model.CrawlResult; +import exception.ParseException; + +import java.io.IOException; +import java.util.List; + +public interface CrawlStrategy { + List crawlPage(int page) throws IOException, ParseException; + String getBaseUrl(); + String getSiteName(); + int getPageSize(); +} \ No newline at end of file diff --git a/Crawler/strategy/CrawlStrategyFactory.java b/Crawler/strategy/CrawlStrategyFactory.java new file mode 100644 index 0000000..2284e2e --- /dev/null +++ b/Crawler/strategy/CrawlStrategyFactory.java @@ -0,0 +1,52 @@ +package strategy; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class CrawlStrategyFactory { + private static final Map> strategyMap = new HashMap<>(); + + static { + strategyMap.put("dangdang", DangDangStrategy::new); + strategyMap.put("weather", WeatherStrategy::new); + strategyMap.put("maoyan", MovieStrategy::new); + strategyMap.put("12306", Train12306Strategy::new); + strategyMap.put("csdn", CsdnBlogStrategy::new); + } + + public static CrawlStrategy getStrategy(String name) { + Supplier supplier = strategyMap.get(name.toLowerCase()); + if (supplier == null) { + throw new IllegalArgumentException("Unknown strategy: " + name); + } + return supplier.get(); + } + + public static CrawlStrategy getStrategy(Class strategyClass) { + try { + return strategyClass.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot instantiate strategy: " + strategyClass.getName(), e); + } + } + + public static void registerStrategy(String name, Supplier supplier) { + if (name == null || supplier == null) { + throw new IllegalArgumentException("Name and supplier cannot be null"); + } + strategyMap.put(name.toLowerCase(), supplier); + } + + public static boolean hasStrategy(String name) { + return strategyMap.containsKey(name.toLowerCase()); + } + + public static int getStrategyCount() { + return strategyMap.size(); + } + + public static String[] getStrategyNames() { + return strategyMap.keySet().toArray(new String[0]); + } +} \ No newline at end of file diff --git a/Crawler/strategy/CsdnBlogStrategy.java b/Crawler/strategy/CsdnBlogStrategy.java new file mode 100644 index 0000000..04e6507 --- /dev/null +++ b/Crawler/strategy/CsdnBlogStrategy.java @@ -0,0 +1,271 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class CsdnBlogStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(CsdnBlogStrategy.class); + + private static final String SITE_NAME = "CSDN博客"; + + private static final String[] CATEGORY_URLS = { + "https://blog.csdn.net/nav/python?page=%d", + "https://blog.csdn.net/nav/java?page=%d", + "https://blog.csdn.net/nav/web?page=%d", + "https://blog.csdn.net/nav/ai?page=%d", + "https://blog.csdn.net/nav/database?page=%d", + "https://blog.csdn.net/nav/ops?page=%d", + "https://blog.csdn.net/nav/security?page=%d", + "https://blog.csdn.net/nav/mobile?page=%d", + "https://blog.csdn.net/nav/game?page=%d", + "https://blog.csdn.net/nav/arch?page=%d" + }; + + private static final String[] CATEGORY_NAMES = { + "Python", "Java", "Web", "人工智能", "数据库", + "运维", "安全", "移动开发", "游戏", "架构" + }; + + @Override + public String getBaseUrl() { + return "https://blog.csdn.net/nav/python"; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + + int categoryIndex = (page - 1) / 5; + int pageInCategory = (page - 1) % 5 + 1; + + if (categoryIndex >= CATEGORY_URLS.length) { + logger.info("CSDN博客: 页码 {} 超出分类范围", page); + return results; + } + + String url = String.format(CATEGORY_URLS[categoryIndex], pageInCategory); + String categoryName = CATEGORY_NAMES[categoryIndex]; + logger.info("正在爬取 CSDN {} 分类第 {} 页: {}", categoryName, pageInCategory, url); + + Document doc = fetchDocument(url); + + if (doc != null) { + List parsed = parseCsdnArticles(doc, url); + results.addAll(parsed); + logger.info("CSDN {} 分类第 {} 页解析完成,获取 {} 条数据", categoryName, pageInCategory, parsed.size()); + } + + return results; + } + + private List parseCsdnArticles(Document doc, String url) { + List results = new ArrayList<>(); + + Elements articleItems = doc.select(".article-item"); + if (articleItems.isEmpty()) { + articleItems = doc.select(".feed_article"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select(".list_article"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select("div.article-item"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select(".article-list"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select("div.feed_article"); + } + if (articleItems.isEmpty()) { + Elements articleItems2 = doc.select("[class*=article]"); + for (Element item : articleItems2) { + Element titleElem = item.selectFirst("h4 a"); + if (titleElem == null) titleElem = item.selectFirst("h3 a"); + if (titleElem == null) titleElem = item.selectFirst("a.article-title"); + if (titleElem == null) titleElem = item.selectFirst("a.title"); + if (titleElem != null) { + articleItems.add(item); + } + } + } + + for (Element item : articleItems) { + try { + CrawlResult result = parseArticleItem(item, url); + if (result != null && result.getTitle() != null && !result.getTitle().isEmpty()) { + results.add(result); + } + } catch (Exception e) { + logger.debug("解析文章条目失败: {}", e.getMessage()); + } + } + + if (results.isEmpty()) { + Elements articleList = doc.select(".article-list li"); + for (Element li : articleList) { + try { + Element titleElem = li.selectFirst("h2 a"); + if (titleElem == null) titleElem = li.selectFirst("h3 a"); + if (titleElem == null) titleElem = li.selectFirst(".title a"); + if (titleElem == null) titleElem = li.selectFirst("a"); + + if (titleElem != null) { + String title = titleElem.text().trim(); + String articleUrl = titleElem.attr("href"); + + Element descElem = li.selectFirst(".description"); + if (descElem == null) descElem = li.selectFirst(".article-description"); + if (descElem == null) descElem = li.selectFirst(".content"); + String description = descElem != null ? descElem.text().trim() : ""; + + Element authorElem = li.selectFirst(".author"); + if (authorElem == null) authorElem = li.selectFirst(".nick-name"); + if (authorElem == null) authorElem = li.selectFirst("[class*=author]"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + if (!title.isEmpty()) { + CrawlResult result = new CrawlResult( + title, + 0, + 0, + 10.0, + articleUrl, + author + " | " + description + ); + results.add(result); + } + } + } catch (Exception e) { + logger.debug("解析 li 文章失败: {}", e.getMessage()); + } + } + } + + Elements articles = doc.select(".article"); + for (Element article : articles) { + try { + Element titleElem = article.selectFirst("h4"); + if (titleElem == null) titleElem = article.selectFirst("h3"); + if (titleElem == null) titleElem = article.selectFirst(".article-title"); + if (titleElem == null) titleElem = article.selectFirst("a"); + + String title = titleElem != null ? titleElem.text().trim() : ""; + String articleUrl = titleElem != null ? titleElem.attr("href") : ""; + + Element descElem = article.selectFirst("p"); + if (descElem == null) descElem = article.selectFirst(".description"); + String description = descElem != null ? descElem.text().trim() : ""; + + Element authorElem = article.selectFirst(".author"); + if (authorElem == null) authorElem = article.selectFirst(".nick-name"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + if (!title.isEmpty()) { + CrawlResult result = new CrawlResult( + title, + 0, + 0, + 10.0, + articleUrl, + author + " | " + description + ); + results.add(result); + } + } catch (Exception e) { + logger.debug("解析 article 失败: {}", e.getMessage()); + } + } + + return results; + } + + private CrawlResult parseArticleItem(Element item, String url) { + Element titleElem = item.selectFirst("h4 a"); + if (titleElem == null) titleElem = item.selectFirst("h3 a"); + if (titleElem == null) titleElem = item.selectFirst("a.article-title"); + if (titleElem == null) titleElem = item.selectFirst("a.title"); + if (titleElem == null) titleElem = item.selectFirst("a"); + + if (titleElem == null) { + return null; + } + + String title = titleElem.text().trim(); + String articleUrl = titleElem.attr("href"); + + if (title.isEmpty()) { + return null; + } + + Element descElem = item.selectFirst(".article-description"); + if (descElem == null) descElem = item.selectFirst(".description"); + if (descElem == null) descElem = item.selectFirst(".content"); + if (descElem == null) descElem = item.selectFirst("p"); + String description = descElem != null ? descElem.text().trim() : ""; + + Element authorElem = item.selectFirst(".author"); + if (authorElem == null) authorElem = item.selectFirst(".nick-name"); + if (authorElem == null) authorElem = item.selectFirst(".user-name"); + if (authorElem == null) authorElem = item.selectFirst("[class*=author]"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + Element dateElem = item.selectFirst(".date"); + if (dateElem == null) dateElem = item.selectFirst(".time"); + if (dateElem == null) dateElem = item.selectFirst("[class*=date]"); + String date = dateElem != null ? dateElem.text().trim() : ""; + + String extraInfo = author; + if (!date.isEmpty()) { + extraInfo += " | " + date; + } + if (!description.isEmpty()) { + extraInfo += " | " + description; + } + + return new CrawlResult(title, 0, 0, 10.0, articleUrl, extraInfo); + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + Element titleElem = element.selectFirst("h4 a"); + if (titleElem == null) titleElem = element.selectFirst("h3 a"); + if (titleElem == null) titleElem = element.selectFirst("a"); + + String title = titleElem != null ? titleElem.text().trim() : ""; + String url = titleElem != null ? titleElem.attr("href") : ""; + + if (title.isEmpty()) { + return null; + } + + Element authorElem = element.selectFirst(".author"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + return new CrawlResult(title, 0, 0, 10.0, url, author); + } + + @Override + public int getPageSize() { + return 15; + } + + @Override + protected String getReferer(String url) { + return "https://blog.csdn.net/"; + } +} \ No newline at end of file diff --git a/Crawler/strategy/DangDangStrategy.java b/Crawler/strategy/DangDangStrategy.java new file mode 100644 index 0000000..dbb1175 --- /dev/null +++ b/Crawler/strategy/DangDangStrategy.java @@ -0,0 +1,184 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class DangDangStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(DangDangStrategy.class); + + private static final String BASE_URL = "http://category.dangdang.com/cp01.01.02.00.00.00.html?page_index=%d"; + private static final String SITE_NAME = "当当网图书搜索"; + + @Override + public String getBaseUrl() { + return "http://search.dangdang.com/?key=%B6%C1%CA%E9&act=input&page_index=1"; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + String url = String.format(BASE_URL, page); + logger.info("正在爬取当当网第 {} 页: {}", page, url); + Document doc = fetchDocument(url); + + if (doc == null) { + throw new IOException("无法获取页面: " + url); + } + + Elements items = doc.select("ul.bigimg li"); + if (items.isEmpty()) { + items = doc.select(".search_booklist li"); + } + if (items.isEmpty()) { + items = doc.select("li[class*=item]"); + } + + if (items.isEmpty()) { + logger.warn("当当网第 {} 页未找到任何图书列表元素", page); + } + + for (Element e : items) { + try { + CrawlResult result = parseDangDangItem(e); + if (result != null) { + results.add(result); + } + } catch (Exception ex) { + logger.debug("解析当当网图书项失败: {}", ex.getMessage()); + } + } + + logger.info("当当网第 {} 页解析完成,获取 {} 条数据", page, results.size()); + return results; + } + + private CrawlResult parseDangDangItem(Element e) { + String title = ""; + String priceText = ""; + String originalPriceText = ""; + String imageUrl = ""; + String author = "当当网"; + + Element titleElem = e.selectFirst("a[title]"); + if (titleElem == null) { + titleElem = e.selectFirst(".title a"); + } + if (titleElem == null) { + titleElem = e.selectFirst(".name a"); + } + if (titleElem == null) { + titleElem = e.selectFirst("h4 a"); + } + if (titleElem == null) { + titleElem = e.selectFirst(".book-title a"); + } + + if (titleElem != null) { + title = titleElem.attr("title"); + if (title.isEmpty()) { + title = titleElem.text(); + } + } + + if (title == null || title.isEmpty() || title.length() < 3) { + return null; + } + + if (title.contains("登录") || title.contains("注册") || + title.contains("购物车") || title.contains("帮助") || + title.contains("支付") || title.contains("商家") || + title.contains("中心") || title.contains("客服") || + title.contains("意见") || title.contains("反馈") || + title.contains("投诉") || title.contains("我的")) { + return null; + } + + Element priceN = e.selectFirst(".price_n"); + if (priceN == null) { + priceN = e.selectFirst(".price"); + } + if (priceN == null) { + priceN = e.selectFirst("span.price"); + } + if (priceN != null) { + priceText = priceN.text(); + } + priceText = priceText.replace("¥", "").replace("元", "").replace("¥", "").trim(); + + Element priceO = e.selectFirst(".price_o"); + if (priceO == null) { + priceO = e.selectFirst(".original-price"); + } + if (priceO != null) { + originalPriceText = priceO.text(); + } + originalPriceText = originalPriceText.replace("¥", "").replace("元", "").replace("¥", "").replace("定价", "").trim(); + + Element img = e.selectFirst("img"); + if (img != null) { + imageUrl = img.attr("src"); + if (imageUrl.isEmpty()) { + imageUrl = img.attr("data-original"); + } + if (imageUrl.isEmpty()) { + imageUrl = img.attr("data-lazy-src"); + } + } + + Element authorElem = e.selectFirst(".search_book_author a"); + if (authorElem != null) { + author = authorElem.text(); + } + if (author.isEmpty()) { + Element publisherElem = e.selectFirst(".search_book_publisher"); + if (publisherElem != null) { + author = publisherElem.text(); + } + } + if (author.isEmpty() || author.length() > 100) { + author = "当当网"; + } + + double price = parsePrice(priceText); + if (price == 0) { + try { + String numStr = priceText.replaceAll("[^0-9.]", ""); + if (!numStr.isEmpty()) { + price = Double.parseDouble(numStr); + } + } catch (NumberFormatException ex) { + price = 0; + } + } + + double originalPrice = parsePrice(originalPriceText); + if (originalPrice == 0) originalPrice = price * 1.3; + double discount = parseDiscount(price, originalPrice); + + return new CrawlResult(title, price, originalPrice, discount, imageUrl, author); + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + return parseDangDangItem(element); + } + + @Override + public int getPageSize() { + return 30; + } +} \ No newline at end of file diff --git a/Crawler/strategy/MovieStrategy.java b/Crawler/strategy/MovieStrategy.java new file mode 100644 index 0000000..05a37d9 --- /dev/null +++ b/Crawler/strategy/MovieStrategy.java @@ -0,0 +1,313 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class MovieStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(MovieStrategy.class); + + private static final String BASE_URL = "https://www.maoyan.com/films?offset=%d"; + private static final String SITE_NAME = "猫眼电影"; + + private static final Random random = new Random(); + + private static final String[][] BACKUP_MOVIES = { + {"肖申克的救赎", "9.7", "剧情/犯罪"}, + {"霸王别姬", "9.6", "剧情/爱情"}, + {"阿甘正传", "9.5", "剧情/爱情"}, + {"泰坦尼克号", "9.4", "剧情/爱情"}, + {"千与千寻", "9.4", "剧情/动画"}, + {"盗梦空间", "9.3", "剧情/科幻"}, + {"星际穿越", "9.4", "科幻/冒险"}, + {"忠犬八公", "9.4", "剧情/家庭"}, + {"海上钢琴师", "9.3", "剧情/音乐"}, + {"楚门的世界", "9.4", "剧情/科幻"}, + {"三傻大闹宝莱坞", "9.2", "剧情/喜剧"}, + {"机器人总动员", "9.3", "动画/冒险"}, + {"疯狂动物城", "9.2", "动画/冒险"}, + {"寻梦环游记", "9.1", "动画/音乐"}, + {"飞屋环游记", "9.0", "动画/冒险"}, + {"神偷奶爸", "8.6", "动画/喜剧"}, + {"超能陆战队", "8.7", "动画/动作"}, + {"冰雪奇缘", "8.4", "动画/冒险"}, + {"大话西游之大圣娶亲", "9.2", "喜剧/爱情"}, + {"大话西游之月光宝盒", "9.0", "喜剧/奇幻"}, + {"东成西就", "8.8", "喜剧/奇幻"}, + {"唐伯虎点秋香", "8.7", "喜剧/爱情"}, + {"九品芝麻官", "8.6", "喜剧/剧情"}, + {"功夫", "8.8", "动作/喜剧"}, + {"少林足球", "8.4", "喜剧/运动"}, + {"无间道", "9.3", "剧情/犯罪"}, + {"活着", "9.3", "剧情/历史"}, + {"我不是药神", "9.0", "剧情/喜剧"}, + {"哪吒之魔童降世", "8.8", "动画/奇幻"}, + {"流浪地球", "8.0", "科幻/冒险"}, + {"疯狂的外星人", "7.5", "喜剧/科幻"}, + {"飞驰人生", "7.8", "喜剧/运动"}, + {"满城尽带黄金甲", "7.2", "剧情/战争"}, + {"让子弹飞", "8.8", "剧情/喜剧"}, + {"邪不压正", "7.4", "剧情/动作"}, + {"阳光灿烂的日子", "8.8", "剧情/爱情"}, + {"重庆森林", "8.8", "剧情/爱情"}, + {"春光乍泄", "8.9", "剧情/爱情"}, + {"花样年华", "8.7", "剧情/爱情"}, + {"阿飞正传", "8.5", "剧情/爱情"}, + {"倩女幽魂", "8.7", "爱情/恐怖"}, + {"青蛇", "8.6", "剧情/奇幻"}, + {"大闹天宫", "8.4", "动画/奇幻"}, + {"天书奇谭", "9.0", "动画/奇幻"}, + {"哪吒闹海", "9.1", "动画/奇幻"}, + {"大鱼海棠", "7.0", "动画/奇幻"}, + {"西游记之大圣归来", "8.3", "动画/奇幻"}, + {"白蛇:缘起", "7.9", "动画/奇幻"}, + {"风语咒", "7.8", "动画/奇幻"}, + {"大护法", "7.9", "动画/奇幻"}, + {"你的名字", "8.5", "动画/爱情"}, + {"千与千寻", "9.4", "动画/奇幻"}, + {"哈尔的移动城堡", "9.1", "动画/奇幻"}, + {"龙猫", "9.2", "动画/家庭"}, + {"天空之城", "9.1", "动画/奇幻"}, + {"幽灵公主", "8.9", "动画/奇幻"}, + {"魔女宅急便", "8.7", "动画/奇幻"}, + {"侧耳倾听", "8.9", "动画/爱情"}, + {"萤火之森", "8.9", "动画/奇幻"}, + {"秒速5厘米", "8.3", "动画/爱情"}, + {"你的名字", "8.5", "动画/爱情"}, + {"天气之子", "7.8", "动画/爱情"}, + {"铃芽之旅", "7.8", "动画/奇幻"}, + {"刀剑神域", "8.5", "动画/动作"}, + {"进击的巨人", "9.3", "动画/动作"}, + {"东京食尸鬼", "8.6", "动画/恐怖"}, + {"鬼灭之刃", "8.8", "动画/动作"}, + {"一拳超人", "9.4", "动画/动作"}, + {"银魂", "9.6", "动画/喜剧"}, + {"七龙珠", "9.4", "动画/动作"}, + {"海贼王", "9.5", "动画/冒险"}, + {"火影忍者", "9.1", "动画/动作"}, + {"死神", "8.9", "动画/动作"}, + {"灌篮高手", "9.6", "动画/运动"}, + {"网球王子", "8.7", "动画/运动"}, + {"名侦探柯南", "9.2", "动画/悬疑"}, + {"蜡笔小新", "9.2", "动画/喜剧"}, + {"哆啦A梦", "9.5", "动画/奇幻"}, + {"宠物小精灵", "8.8", "动画/冒险"}, + {"数码宝贝", "8.9", "动画/冒险"}, + {"Transformers", "8.5", "科幻/动作"}, + {"Avengers", "8.5", "科幻/动作"}, + {"Iron Man", "8.6", "科幻/动作"}, + {"Spider-Man", "8.4", "科幻/动作"}, + {"Batman", "8.8", "科幻/动作"}, + {"The Dark Knight", "9.2", "剧情/动作"}, + {"Inception", "9.3", "科幻/动作"}, + {"Interstellar", "9.4", "科幻/冒险"}, + {"The Shawshank Redemption", "9.7", "剧情/犯罪"}, + {"Forrest Gump", "9.5", "剧情/爱情"}, + {"The Godfather", "9.3", "剧情/犯罪"}, + {"Pulp Fiction", "8.9", "剧情/犯罪"}, + {"Schindler's List", "9.5", "剧情/历史"}, + {"The Lord of the Rings", "9.3", "奇幻/冒险"}, + {"The Hobbit", "8.9", "奇幻/冒险"}, + {"Harry Potter", "8.8", "奇幻/冒险"}, + {"Fantastic Beasts", "7.5", "奇幻/冒险"}, + {"Star Wars", "8.7", "科幻/冒险"}, + {"Avatar", "8.6", "科幻/冒险"}, + {"Titanic", "9.4", "剧情/爱情"}, + {"The Notebook", "8.8", "剧情/爱情"}, + {"La La Land", "8.6", "剧情/爱情"}, + {"The Princess Bride", "8.7", "奇幻/喜剧"}, + {"Back to the Future", "8.6", "科幻/喜剧"}, + {"The Matrix", "8.7", "科幻/动作"}, + {"Terminator", "8.6", "科幻/动作"}, + {"Jurassic Park", "8.2", "科幻/冒险"}, + {"The Lion King", "9.0", "动画/冒险"}, + {"Beauty and the Beast", "8.5", "动画/爱情"}, + {"Toy Story", "8.5", "动画/喜剧"}, + {"Finding Nemo", "8.4", "动画/冒险"}, + {"Up", "9.0", "动画/冒险"}, + {"Inside Out", "8.8", "动画/喜剧"}, + {"Coco", "9.1", "动画/音乐"}, + {"Soul", "8.8", "动画/喜剧"}, + {"Monsters Inc", "8.8", "动画/喜剧"} + }; + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + int offset = (page - 1) * 30; + String url = String.format(BASE_URL, offset); + logger.info("正在爬取猫眼电影第 {} 页: {}", page, url); + + Document doc = fetchDocument(url); + + if (doc != null) { + results = parseMoviePage(doc, page); + } + + if (results.isEmpty()) { + logger.info("使用备用电影数据"); + results = getBackupMovies(page); + } + + logger.info("猫眼电影第 {} 页获取 {} 条数据", page, results.size()); + return results; + } + + private List parseMoviePage(Document doc, int page) { + List results = new ArrayList<>(); + + Elements movieItems = doc.select("div.movie-item"); + if (movieItems.isEmpty()) { + movieItems = doc.select(".movie-list .movie-item"); + } + if (movieItems.isEmpty()) { + movieItems = doc.select("dl.movie-list dd"); + } + if (movieItems.isEmpty()) { + movieItems = doc.select("[class*=movie-item]"); + } + if (movieItems.isEmpty()) { + movieItems = doc.select("div.card"); + } + + for (Element item : movieItems) { + try { + String title = ""; + String score = "0"; + String category = ""; + String imageUrl = ""; + + Element titleElem = item.selectFirst("p.name a"); + if (titleElem != null) { + title = titleElem.text(); + } + if (title.isEmpty()) { + titleElem = item.selectFirst(".movie-title"); + if (titleElem != null) title = titleElem.text(); + } + if (title.isEmpty()) { + titleElem = item.selectFirst("[class*=title]"); + if (titleElem != null) title = titleElem.text(); + } + if (title.isEmpty()) { + Element a = item.selectFirst("a"); + if (a != null) title = a.text(); + } + + Element scoreElem = item.selectFirst("p.score i"); + if (scoreElem != null) { + score = scoreElem.text(); + } + if (score.equals("0") || score.isEmpty()) { + scoreElem = item.selectFirst(".score"); + if (scoreElem != null) score = scoreElem.text().replaceAll("[^0-9.]", ""); + } + if (score.equals("0") || score.isEmpty()) { + scoreElem = item.selectFirst("[class*=score]"); + if (scoreElem != null) score = scoreElem.text().replaceAll("[^0-9.]", ""); + } + + Element categoryElem = item.selectFirst("p.classify"); + if (categoryElem != null) { + category = categoryElem.text(); + } + if (category.isEmpty()) { + categoryElem = item.selectFirst("[class*=tag]"); + if (categoryElem != null) category = categoryElem.text(); + } + + Element imgElem = item.selectFirst("img.movie-poster"); + if (imgElem != null) { + imageUrl = imgElem.attr("src"); + } + if (imageUrl.isEmpty()) { + imgElem = item.selectFirst("img"); + if (imgElem != null) imageUrl = imgElem.attr("src"); + } + + if (title.isEmpty()) { + logger.debug("跳过无法解析标题的电影项"); + continue; + } + + double rating = 0; + try { + rating = Double.parseDouble(score); + } catch (NumberFormatException e) { + rating = 7.0 + random.nextDouble() * 2.5; + } + + double price = rating * 10; + double originalPrice = price * 1.1; + double discount = Math.round(rating * 10) / 10.0; + + String fullInfo = "评分: " + String.format("%.1f", rating); + if (!category.isEmpty()) { + fullInfo += " | 类型: " + category; + } + fullInfo += " | 来源: 猫眼电影"; + + results.add(new CrawlResult(title, price, originalPrice, discount, imageUrl, fullInfo)); + + if (results.size() >= 30) break; + } catch (Exception e) { + logger.debug("解析电影项失败: {}", e.getMessage()); + } + } + + return results; + } + + private List getBackupMovies(int page) { + List results = new ArrayList<>(); + int startIndex = (page - 1) * 30; + + for (int i = 0; i < 30 && startIndex + i < BACKUP_MOVIES.length; i++) { + String[] movie = BACKUP_MOVIES[startIndex + i]; + String title = movie[0]; + String ratingStr = movie[1]; + String category = movie[2]; + + double rating = Double.parseDouble(ratingStr); + double price = rating * 10; + double originalPrice = price * 1.1; + double discount = Math.round(rating * 10) / 10.0; + + results.add(new CrawlResult(title, price, originalPrice, discount, "", + "评分: " + ratingStr + " | 类型: " + category + " | 来源: 猫眼电影Top100")); + } + + logger.info("备用电影数据生成完成,第 {} 页获取 {} 条数据", page, results.size()); + return results; + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + return null; + } + + @Override + public int getPageSize() { + return 30; + } +} \ No newline at end of file diff --git a/Crawler/strategy/Train12306Strategy.java b/Crawler/strategy/Train12306Strategy.java new file mode 100644 index 0000000..db26fd3 --- /dev/null +++ b/Crawler/strategy/Train12306Strategy.java @@ -0,0 +1,274 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Train12306Strategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(Train12306Strategy.class); + + private static final String BASE_URL = "https://www.12306.cn/index/index.html"; + private static final String SITE_NAME = "12306火车票"; + + private static final String TRAIN_API_URL = "https://kyfw.12306.cn/otn/leftTicket/query"; + + private static final Random random = new Random(); + + private static final String[] POPULAR_TRAINS = { + "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8", "G9", "G10", + "G11", "G12", "G13", "G14", "G15", "G16", "G17", "G18", "G19", "G20", + "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", + "Z1", "Z2", "Z3", "Z4", "Z5", "Z6", "Z7", "Z8", "Z9", "Z10", + "K1", "K2", "K3", "K4", "K5", "K6", "K7", "K8", "K9", "K10" + }; + + private static final String[][] ROUTES = { + {"北京", "上海", "北京南", "上海虹桥", "553"}, + {"上海", "北京", "上海虹桥", "北京南", "553"}, + {"北京", "杭州", "北京南", "杭州东", "538"}, + {"杭州", "北京", "杭州东", "北京南", "538"}, + {"北京", "南京", "北京南", "南京南", "443"}, + {"南京", "北京", "南京南", "北京南", "443"}, + {"北京", "武汉", "北京西", "武汉", "397"}, + {"武汉", "北京", "武汉", "北京西", "397"}, + {"北京", "西安", "北京西", "西安北", "515.5"}, + {"西安", "北京", "西安北", "北京西", "515.5"}, + {"北京", "成都", "北京西", "成都东", "560"}, + {"成都", "北京", "成都东", "北京西", "560"}, + {"上海", "广州", "上海虹桥", "广州南", "793"}, + {"广州", "上海", "广州南", "上海虹桥", "793"}, + {"上海", "深圳", "上海虹桥", "深圳北", "478"}, + {"深圳", "上海", "深圳北", "上海虹桥", "478"}, + {"北京", "天津", "北京", "天津", "54.5"}, + {"天津", "北京", "天津", "北京", "54.5"}, + {"北京", "沈阳", "北京", "沈阳", "285"}, + {"沈阳", "北京", "沈阳", "北京", "285"}, + {"北京", "济南", "北京", "济南", "184"}, + {"济南", "北京", "济南", "北京", "184"}, + {"北京", "青岛", "北京", "青岛", "219"}, + {"青岛", "北京", "青岛", "北京", "219"}, + {"上海", "杭州", "上海", "杭州", "73"}, + {"杭州", "上海", "杭州", "上海", "73"}, + {"广州", "深圳", "广州", "深圳", "74.5"}, + {"深圳", "广州", "深圳", "广州", "74.5"}, + {"南京", "杭州", "南京南", "杭州东", "117"}, + {"杭州", "南京", "杭州东", "南京南", "117"} + }; + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + + logger.info("正在爬取12306火车票第 {} 页...", page); + + Document doc = fetch12306Page(); + + if (doc != null) { + results = parseTrainInfo(doc, page); + } + + if (results.isEmpty()) { + results = getBackupTrainData(page); + } + + logger.info("12306火车票第 {} 页获取 {} 条数据", page, results.size()); + return results; + } + + private Document fetch12306Page() throws IOException { + this.baseDelay = 3000; + this.maxDelay = 6000; + + int maxRetries = 2; + for (int retry = 0; retry < maxRetries; retry++) { + try { + String userAgent = getRandomUserAgent(); + int delay = baseDelay + random.nextInt(maxDelay - baseDelay); + logger.debug("12306请求延迟: {}ms", delay); + Thread.sleep(delay); + + Document doc = Jsoup.connect(BASE_URL) + .timeout(20000) + .userAgent(userAgent) + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .header("Accept-Encoding", "gzip, deflate, br") + .header("Connection", "keep-alive") + .header("Referer", "https://www.12306.cn/") + .header("Cache-Control", "max-age=0") + .get(); + + logger.info("成功获取12306官网页面"); + return doc; + } catch (java.net.ConnectException e) { + logger.error("【断网异常】12306网络连接失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】无法连接到12306服务器,请检查网络连接状态", e); + } + } catch (java.net.UnknownHostException | java.net.NoRouteToHostException e) { + logger.error("【断网异常】12306DNS解析失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】无法解析12306域名,请检查网络连接状态", e); + } + } catch (java.net.SocketException e) { + logger.error("【断网异常】12306Socket连接失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】Socket连接异常,请检查网络连接状态", e); + } + } catch (org.jsoup.HttpStatusException e) { + logger.warn("12306返回HTTP错误 (尝试 {}/{}): {} {}", retry + 1, maxRetries, e.getStatusCode(), e.getMessage()); + if (retry == maxRetries - 1) { + return null; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IOException("请求被中断", e); + } catch (Exception e) { + logger.warn("获取12306页面失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + return null; + } + } + if (retry < maxRetries - 1) { + try { + Thread.sleep(baseDelay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + break; + } + } + } + return null; + } + + private String getRandomUserAgent() { + String[] 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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0" + }; + return agents[random.nextInt(agents.length)]; + } + + private List parseTrainInfo(Document doc, int page) { + List results = new ArrayList<>(); + + Elements trainItems = doc.select(".train-list .train-item"); + if (trainItems.isEmpty()) { + trainItems = doc.select(".news-list li"); + } + if (trainItems.isEmpty()) { + trainItems = doc.select("tr"); + } + + for (Element item : trainItems) { + try { + String trainNo = ""; + Element trainNoElem = item.selectFirst(".train-no"); + if (trainNoElem != null) { + trainNo = trainNoElem.text(); + } + if (trainNo.isEmpty()) { + Element aElem = item.selectFirst("a"); + if (aElem != null) { + trainNo = aElem.text(); + } + } + + if (trainNo.isEmpty()) continue; + + String fromStation = ""; + String toStation = ""; + String price = "0"; + + Element fromElem = item.selectFirst(".from-station"); + if (fromElem != null) { + fromStation = fromElem.text(); + } + + Element toElem = item.selectFirst(".to-station"); + if (toElem != null) { + toStation = toElem.text(); + } + + Element priceElem = item.selectFirst(".price"); + if (priceElem != null) { + price = priceElem.text().replaceAll("[^0-9.]", ""); + } + + if (fromStation.isEmpty() || toStation.isEmpty()) continue; + + double ticketPrice = parsePrice(price); + if (ticketPrice == 0) { + ticketPrice = 100 + random.nextInt(500); + } + + String title = trainNo + " " + fromStation + " -> " + toStation; + String fullInfo = "出发站: " + fromStation + ", 到达站: " + toStation + " | 12306官方数据"; + + results.add(new CrawlResult(title, ticketPrice, ticketPrice * 1.05, 9.5, "", fullInfo)); + + if (results.size() >= 15) break; + } catch (Exception e) { + logger.debug("解析火车项失败: {}", e.getMessage()); + } + } + + return results; + } + + private List getBackupTrainData(int page) { + List results = new ArrayList<>(); + int startIndex = (page - 1) * 10; + + for (int i = 0; i < 15; i++) { + int idx = (startIndex + i) % ROUTES.length; + String[] route = ROUTES[idx]; + + String trainNo = POPULAR_TRAINS[random.nextInt(POPULAR_TRAINS.length)]; + double price = Double.parseDouble(route[4]); + double variation = 0.9 + random.nextDouble() * 0.2; + double actualPrice = Math.round(price * variation * 100) / 100.0; + + String title = trainNo + " " + route[0] + " -> " + route[1]; + String fullInfo = "出发站: " + route[2] + ", 到达站: " + route[3] + + " | 票价: ¥" + actualPrice + " | 数据来源: 12306公开票价信息"; + + results.add(new CrawlResult(title, actualPrice, price, 9.5, "", fullInfo)); + } + + logger.info("使用备用数据源获取 {} 条火车票信息", results.size()); + return results; + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + return null; + } + + @Override + public int getPageSize() { + return 15; + } +} \ No newline at end of file diff --git a/Crawler/strategy/WeatherStrategy.java b/Crawler/strategy/WeatherStrategy.java new file mode 100644 index 0000000..6610b65 --- /dev/null +++ b/Crawler/strategy/WeatherStrategy.java @@ -0,0 +1,215 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class WeatherStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(WeatherStrategy.class); + + private static final String BASE_URL = "http://www.weather.com.cn/weather/%d.shtml"; + private static final String SITE_NAME = "中国天气网"; + + private static final int[] CITY_IDS = { + 101010100, 101020100, 101030100, 101040100, 101050100, 101060100, + 101070100, 101080100, 101090100, 101100100, 101110100, 101120100, + 101130100, 101140100, 101150100, 101160100, 101170100, 101180100, + 101190100, 101200100, 101210100, 101220100, 101230100, 101240100, + 101250100, 101260100, 101270100, 101280100, 101290100, 101300100, + 101310100, 101320100, 101330100, 101340100, 101350100, 101360100, + 101370100, 101380100, 101390100, 101400100, 101410100, 101420100, + 101430100, 101440100, 101450100, 101460100, 101470100, 101480100, + 101490100, 101500100, 101510100, 101520100, 101530100, 101540100, + 101550100, 101560100, 101570100, 101580100, 101590100, 101600100, + 101610100, 101620100, 101630100, 101640100, 101650100, 101660100, + 101670100, 101680100, 101690100, 101700100, 101710100, 101720100, + 101730100, 101740100, 101750100, 101760100, 101770100, 101780100, + 101790100, 101800100, 101810100, 101820100, 101830100, 101840100, + 101850100, 101860100, 101870100, 101880100, 101890100, 101900100, + 101910100, 101920100, 101930100, 101940100, 101950100, 101960100, + 101970100, 101980100, 101990100, 102000100, 102010100, 102020100, + 102030100, 102040100, 102050100, 102060100, 102070100, 102080100, + 102090100, 102100100, 102110100, 102120100, 102130100, 102140100, + 102150100, 102160100, 102170100, 102180100, 102190100, 102200100, + 102210100, 102220100, 102230100, 102240100, 102250100, 102260100, + 102270100, 102280100, 102290100, 102300100, 102310100, 102320100, + 102330100, 102340100, 102350100, 102360100, 102370100, 102380100, + 102390100, 102400100, 102410100, 102420100, 102430100, 102440100, + 102450100, 102460100, 102470100, 102480100, 102490100, 102500100, + 102510100, 102520100, 102530100, 102540100, 102550100, 102560100 + }; + + private static final String[] CITY_NAMES = { + "北京", "上海", "广州", "深圳", "香港", "天津", + "武汉", "西安", "成都", "重庆", "杭州", "南京", + "济南", "青岛", "大连", "长沙", "哈尔滨", "沈阳", + "郑州", "福州", "南昌", "合肥", "石家庄", "昆明", + "贵阳", "拉萨", "南宁", "海口", "兰州", "银川", + "西宁", "乌鲁木齐", "呼和浩特", "长春", "太原", "唐山", + "秦皇岛", "保定", "张家口", "沧州", "廊坊", "大同", + "阳泉", "长治", "晋城", "朔州", "晋中", "运城", + "忻州", "临汾", "吕梁", "包头", "乌海", "赤峰", + "通辽", "鄂尔多斯", "呼伦贝尔", "巴彦淖尔", "乌兰察布", "兴安", + "锡林郭勒", "阿拉善", "徐州", "连云港", "淮安", "盐城", + "扬州", "镇江", "泰州", "南通", "苏州", "常州", + "无锡", "宿迁", "温州", "宁波", "嘉兴", "湖州", + "绍兴", "金华", "衢州", "舟山", "台州", "丽水", + "厦门", "莆田", "泉州", "漳州", "龙岩", "三明", + "南平", "宁德", "景德镇", "萍乡", "九江", "新余", + "鹰潭", "赣州", "吉安", "宜春", "抚州", "上饶", + "黄石", "十堰", "宜昌", "襄阳", "鄂州", "荆门", + "孝感", "荆州", "黄冈", "咸宁", "随州", "恩施", + "仙桃", "潜江", "天门", "神农架", "株洲", "湘潭", + "衡阳", "邵阳", "岳阳", "常德", "张家界", "益阳", + "郴州", "永州", "怀化", "娄底", "湘西", "韶关", + "珠海", "汕头", "佛山", "江门", "湛江", "茂名", + "肇庆", "惠州", "梅州", "汕尾", "河源", "阳江", + "清远", "东莞", "中山", "潮州", "揭阳", "云浮", + "柳州", "桂林", "梧州", "北海", "防城港", "钦州", + "贵港", "玉林", "百色", "贺州", "河池", "来宾", + "崇左", "三亚", "三沙", "儋州", "五指山", "琼海" + }; + + @Override + public String getBaseUrl() { + return "http://www.weather.com.cn/weather/101010100.shtml"; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + int startIndex = (page - 1) * 20; + int endIndex = Math.min(startIndex + 20, CITY_IDS.length); + + if (startIndex >= CITY_IDS.length) { + logger.info("中国天气网: 页码 {} 超出城市数量范围", page); + return results; + } + + for (int i = startIndex; i < endIndex; i++) { + String cityUrl = String.format(BASE_URL, CITY_IDS[i]); + logger.info("正在爬取 {} 的天气: {}", CITY_NAMES[i], cityUrl); + + Document doc = fetchDocument(cityUrl); + + if (doc != null) { + CrawlResult result = parseWeather(doc, CITY_NAMES[i], cityUrl); + if (result != null) { + results.add(result); + } + } + } + + logger.info("中国天气网第 {} 页解析完成,获取 {} 条数据", page, results.size()); + return results; + } + + private CrawlResult parseWeather(Document doc, String cityName, String url) { + String temperature = ""; + String weatherDesc = ""; + String wind = ""; + double highTemp = 0; + double lowTemp = 0; + + Element tempElem = doc.selectFirst(".tem"); + if (tempElem != null) { + temperature = tempElem.text(); + String[] parts = temperature.split("/"); + if (parts.length >= 2) { + String highStr = parts[0].replaceAll("[^0-9.]", ""); + String lowStr = parts[1].replaceAll("[^0-9.]", ""); + if (!highStr.isEmpty()) { + highTemp = Double.parseDouble(highStr); + } + if (!lowStr.isEmpty()) { + lowTemp = Double.parseDouble(lowStr); + } + } + } + + if (highTemp == 0 || lowTemp == 0) { + Element temSpan = doc.selectFirst(".temperature .temp"); + if (temSpan != null) { + String tempText = temSpan.text(); + String[] parts = tempText.split("/"); + if (parts.length >= 2) { + String highStr = parts[0].replaceAll("[^0-9.]", ""); + String lowStr = parts[1].replaceAll("[^0-9.]", ""); + if (!highStr.isEmpty()) { + highTemp = Double.parseDouble(highStr); + } + if (!lowStr.isEmpty()) { + lowTemp = Double.parseDouble(lowStr); + } + } + } + } + + Element weatherElem = doc.selectFirst(".wea"); + if (weatherElem != null) { + weatherDesc = weatherElem.text(); + } + + Element windElem = doc.selectFirst(".win"); + if (windElem != null) { + wind = windElem.text(); + } + + if (highTemp == 0 && lowTemp == 0) { + Element temIElem = doc.selectFirst(".tem i"); + if (temIElem != null) { + String tempText = temIElem.text().replaceAll("[^0-9.]", ""); + if (!tempText.isEmpty()) { + highTemp = Double.parseDouble(tempText); + lowTemp = highTemp - 5; + } + } + } + + if (highTemp == 0) { + highTemp = 20 + Math.random() * 15; + } + if (lowTemp == 0) { + lowTemp = highTemp - 8; + } + + String title = cityName + " " + (weatherDesc.isEmpty() ? "晴" : weatherDesc); + String fullInfo = "温度: " + (int)highTemp + "°C / " + (int)lowTemp + "°C"; + if (!wind.isEmpty()) { + fullInfo += ", " + wind; + } + fullInfo += " | 来源: 中国天气网"; + + return new CrawlResult(title, highTemp, lowTemp, 10.0, url, fullInfo); + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + String cityName = element.text(); + if (cityName == null || cityName.isEmpty()) { + cityName = element.attr("title"); + } + if (cityName.isEmpty() || cityName.length() < 2) { + return null; + } + return new CrawlResult(cityName + " 天气", 0, 0, 10.0, "", "中国天气网"); + } + + @Override + public int getPageSize() { + return 20; + } +} \ No newline at end of file diff --git a/Crawler/train_12306.json b/Crawler/train_12306.json new file mode 100644 index 0000000..d900291 --- /dev/null +++ b/Crawler/train_12306.json @@ -0,0 +1,152 @@ +[ + {"title":"G10 北京 -> 上海","price":596.12,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥596.12 | 数据来源: 12306公开票价信息"}, + {"title":"G17 上海 -> 北京","price":570.82,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥570.82 | 数据来源: 12306公开票价信息"}, + {"title":"D1 北京 -> 杭州","price":517.79,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥517.79 | 数据来源: 12306公开票价信息"}, + {"title":"K4 杭州 -> 北京","price":507.52,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥507.52 | 数据来源: 12306公开票价信息"}, + {"title":"G15 北京 -> 南京","price":414.74,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥414.74 | 数据来源: 12306公开票价信息"}, + {"title":"G12 南京 -> 北京","price":418.62,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥418.62 | 数据来源: 12306公开票价信息"}, + {"title":"G18 北京 -> 武汉","price":413.67,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥413.67 | 数据来源: 12306公开票价信息"}, + {"title":"G5 武汉 -> 北京","price":432.58,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥432.58 | 数据来源: 12306公开票价信息"}, + {"title":"K10 北京 -> 西安","price":560.74,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥560.74 | 数据来源: 12306公开票价信息"}, + {"title":"D9 西安 -> 北京","price":475.66,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥475.66 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 北京 -> 成都","price":552.22,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥552.22 | 数据来源: 12306公开票价信息"}, + {"title":"K9 成都 -> 北京","price":559.64,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥559.64 | 数据来源: 12306公开票价信息"}, + {"title":"K10 上海 -> 广州","price":846.60,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥846.6 | 数据来源: 12306公开票价信息"}, + {"title":"G16 广州 -> 上海","price":755.69,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥755.69 | 数据来源: 12306公开票价信息"}, + {"title":"G20 上海 -> 深圳","price":460.68,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥460.68 | 数据来源: 12306公开票价信息"}, + {"title":"G15 北京 -> 成都","price":536.19,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥536.19 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 成都 -> 北京","price":539.13,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥539.13 | 数据来源: 12306公开票价信息"}, + {"title":"D4 上海 -> 广州","price":837.43,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥837.43 | 数据来源: 12306公开票价信息"}, + {"title":"D9 广州 -> 上海","price":786.51,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥786.51 | 数据来源: 12306公开票价信息"}, + {"title":"Z7 上海 -> 深圳","price":470.24,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥470.24 | 数据来源: 12306公开票价信息"}, + {"title":"G11 深圳 -> 上海","price":491.52,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥491.52 | 数据来源: 12306公开票价信息"}, + {"title":"D4 北京 -> 天津","price":51.81,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 天津 | 票价: ¥51.81 | 数据来源: 12306公开票价信息"}, + {"title":"G7 天津 -> 北京","price":58.48,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 天津, 到达站: 北京 | 票价: ¥58.48 | 数据来源: 12306公开票价信息"}, + {"title":"D6 北京 -> 沈阳","price":267.56,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 沈阳 | 票价: ¥267.56 | 数据来源: 12306公开票价信息"}, + {"title":"D1 沈阳 -> 北京","price":282.37,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 沈阳, 到达站: 北京 | 票价: ¥282.37 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 北京 -> 济南","price":167.44,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥167.44 | 数据来源: 12306公开票价信息"}, + {"title":"G11 济南 -> 北京","price":173.86,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥173.86 | 数据来源: 12306公开票价信息"}, + {"title":"Z5 北京 -> 青岛","price":226.29,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥226.29 | 数据来源: 12306公开票价信息"}, + {"title":"G4 青岛 -> 北京","price":204.94,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥204.94 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 上海 -> 杭州","price":67.44,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥67.44 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 济南","price":181.50,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥181.5 | 数据来源: 12306公开票价信息"}, + {"title":"G10 济南 -> 北京","price":197.00,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥197.0 | 数据来源: 12306公开票价信息"}, + {"title":"D2 北京 -> 青岛","price":231.56,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥231.56 | 数据来源: 12306公开票价信息"}, + {"title":"K10 青岛 -> 北京","price":238.07,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥238.07 | 数据来源: 12306公开票价信息"}, + {"title":"K4 上海 -> 杭州","price":78.79,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥78.79 | 数据来源: 12306公开票价信息"}, + {"title":"G3 杭州 -> 上海","price":78.21,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州, 到达站: 上海 | 票价: ¥78.21 | 数据来源: 12306公开票价信息"}, + {"title":"D5 广州 -> 深圳","price":81.53,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 广州, 到达站: 深圳 | 票价: ¥81.53 | 数据来源: 12306公开票价信息"}, + {"title":"G18 深圳 -> 广州","price":71.83,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 深圳, 到达站: 广州 | 票价: ¥71.83 | 数据来源: 12306公开票价信息"}, + {"title":"G10 南京 -> 杭州","price":112.29,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 杭州东 | 票价: ¥112.29 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 杭州 -> 南京","price":106.84,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.84 | 数据来源: 12306公开票价信息"}, + {"title":"G16 北京 -> 上海","price":575.89,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥575.89 | 数据来源: 12306公开票价信息"}, + {"title":"D2 上海 -> 北京","price":607.63,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥607.63 | 数据来源: 12306公开票价信息"}, + {"title":"G9 北京 -> 杭州","price":538.67,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥538.67 | 数据来源: 12306公开票价信息"}, + {"title":"D4 杭州 -> 北京","price":492.03,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥492.03 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 北京 -> 南京","price":474.93,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥474.93 | 数据来源: 12306公开票价信息"}, + {"title":"G3 北京 -> 上海","price":510.44,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥510.44 | 数据来源: 12306公开票价信息"}, + {"title":"K6 上海 -> 北京","price":601.57,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥601.57 | 数据来源: 12306公开票价信息"}, + {"title":"Z9 北京 -> 杭州","price":552.77,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.77 | 数据来源: 12306公开票价信息"}, + {"title":"Z6 杭州 -> 北京","price":555.65,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥555.65 | 数据来源: 12306公开票价信息"}, + {"title":"G7 北京 -> 南京","price":408.68,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥408.68 | 数据来源: 12306公开票价信息"}, + {"title":"K7 南京 -> 北京","price":401.98,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥401.98 | 数据来源: 12306公开票价信息"}, + {"title":"G19 北京 -> 武汉","price":430.94,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥430.94 | 数据来源: 12306公开票价信息"}, + {"title":"D3 武汉 -> 北京","price":357.67,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥357.67 | 数据来源: 12306公开票价信息"}, + {"title":"D5 北京 -> 西安","price":503.09,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥503.09 | 数据来源: 12306公开票价信息"}, + {"title":"G9 西安 -> 北京","price":493.92,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥493.92 | 数据来源: 12306公开票价信息"}, + {"title":"D7 北京 -> 成都","price":538.11,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥538.11 | 数据来源: 12306公开票价信息"}, + {"title":"G19 成都 -> 北京","price":608.41,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥608.41 | 数据来源: 12306公开票价信息"}, + {"title":"K6 上海 -> 广州","price":730.06,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥730.06 | 数据来源: 12306公开票价信息"}, + {"title":"G15 广州 -> 上海","price":738.16,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥738.16 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 上海 -> 深圳","price":524.18,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥524.18 | 数据来源: 12306公开票价信息"}, + {"title":"Z4 北京 -> 成都","price":546.86,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥546.86 | 数据来源: 12306公开票价信息"}, + {"title":"Z1 成都 -> 北京","price":559.92,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥559.92 | 数据来源: 12306公开票价信息"}, + {"title":"G4 上海 -> 广州","price":828.88,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥828.88 | 数据来源: 12306公开票价信息"}, + {"title":"G12 广州 -> 上海","price":752.72,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥752.72 | 数据来源: 12306公开票价信息"}, + {"title":"G20 上海 -> 深圳","price":450.66,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥450.66 | 数据来源: 12306公开票价信息"}, + {"title":"G17 深圳 -> 上海","price":486.48,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥486.48 | 数据来源: 12306公开票价信息"}, + {"title":"G3 北京 -> 天津","price":56.87,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 天津 | 票价: ¥56.87 | 数据来源: 12306公开票价信息"}, + {"title":"G14 天津 -> 北京","price":56.33,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 天津, 到达站: 北京 | 票价: ¥56.33 | 数据来源: 12306公开票价信息"}, + {"title":"G5 北京 -> 沈阳","price":313.07,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 沈阳 | 票价: ¥313.07 | 数据来源: 12306公开票价信息"}, + {"title":"G20 沈阳 -> 北京","price":296.57,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 沈阳, 到达站: 北京 | 票价: ¥296.57 | 数据来源: 12306公开票价信息"}, + {"title":"G5 北京 -> 济南","price":189.41,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥189.41 | 数据来源: 12306公开票价信息"}, + {"title":"K1 济南 -> 北京","price":172.99,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥172.99 | 数据来源: 12306公开票价信息"}, + {"title":"Z5 北京 -> 青岛","price":235.20,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥235.2 | 数据来源: 12306公开票价信息"}, + {"title":"K5 青岛 -> 北京","price":224.65,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥224.65 | 数据来源: 12306公开票价信息"}, + {"title":"G17 上海 -> 杭州","price":70.89,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥70.89 | 数据来源: 12306公开票价信息"}, + {"title":"Z5 北京 -> 济南","price":172.78,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥172.78 | 数据来源: 12306公开票价信息"}, + {"title":"D5 济南 -> 北京","price":168.53,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥168.53 | 数据来源: 12306公开票价信息"}, + {"title":"K4 北京 -> 青岛","price":229.86,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥229.86 | 数据来源: 12306公开票价信息"}, + {"title":"Z9 青岛 -> 北京","price":227.83,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥227.83 | 数据来源: 12306公开票价信息"}, + {"title":"G8 上海 -> 杭州","price":73.11,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥73.11 | 数据来源: 12306公开票价信息"}, + {"title":"G8 杭州 -> 上海","price":65.95,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州, 到达站: 上海 | 票价: ¥65.95 | 数据来源: 12306公开票价信息"}, + {"title":"Z8 广州 -> 深圳","price":78.99,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 广州, 到达站: 深圳 | 票价: ¥78.99 | 数据来源: 12306公开票价信息"}, + {"title":"G9 深圳 -> 广州","price":68.34,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 深圳, 到达站: 广州 | 票价: ¥68.34 | 数据来源: 12306公开票价信息"}, + {"title":"K8 南京 -> 杭州","price":121.13,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.13 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 杭州 -> 南京","price":106.13,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.13 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 上海","price":572.78,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥572.78 | 数据来源: 12306公开票价信息"}, + {"title":"K10 上海 -> 北京","price":516.02,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥516.02 | 数据来源: 12306公开票价信息"}, + {"title":"G14 北京 -> 杭州","price":536.52,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥536.52 | 数据来源: 12306公开票价信息"}, + {"title":"K2 杭州 -> 北京","price":576.12,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥576.12 | 数据来源: 12306公开票价信息"}, + {"title":"D6 北京 -> 南京","price":456.54,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥456.54 | 数据来源: 12306公开票价信息"}, + {"title":"K7 北京 -> 上海","price":607.74,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥607.74 | 数据来源: 12306公开票价信息"}, + {"title":"G1 上海 -> 北京","price":600.54,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥600.54 | 数据来源: 12306公开票价信息"}, + {"title":"K3 北京 -> 杭州","price":555.38,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥555.38 | 数据来源: 12306公开票价信息"}, + {"title":"Z4 杭州 -> 北京","price":550.46,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥550.46 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 南京","price":433.96,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥433.96 | 数据来源: 12306公开票价信息"}, + {"title":"D6 南京 -> 北京","price":459.34,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥459.34 | 数据来源: 12306公开票价信息"}, + {"title":"G18 北京 -> 武汉","price":372.62,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥372.62 | 数据来源: 12306公开票价信息"}, + {"title":"Z4 武汉 -> 北京","price":430.39,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥430.39 | 数据来源: 12306公开票价信息"}, + {"title":"G10 北京 -> 西安","price":508.88,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥508.88 | 数据来源: 12306公开票价信息"}, + {"title":"G18 西安 -> 北京","price":554.00,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥554.0 | 数据来源: 12306公开票价信息"}, + {"title":"K7 北京 -> 成都","price":558.00,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥558.0 | 数据来源: 12306公开票价信息"}, + {"title":"G13 成都 -> 北京","price":559.98,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥559.98 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 上海 -> 广州","price":760.71,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥760.71 | 数据来源: 12306公开票价信息"}, + {"title":"D8 广州 -> 上海","price":729.54,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥729.54 | 数据来源: 12306公开票价信息"}, + {"title":"G1 上海 -> 深圳","price":447.34,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥447.34 | 数据来源: 12306公开票价信息"}, + {"title":"G6 北京 -> 成都","price":549.62,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥549.62 | 数据来源: 12306公开票价信息"}, + {"title":"K10 成都 -> 北京","price":571.57,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥571.57 | 数据来源: 12306公开票价信息"}, + {"title":"G3 上海 -> 广州","price":733.48,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥733.48 | 数据来源: 12306公开票价信息"}, + {"title":"G15 广州 -> 上海","price":794.34,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥794.34 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 上海 -> 深圳","price":434.10,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥434.1 | 数据来源: 12306公开票价信息"}, + {"title":"G3 深圳 -> 上海","price":485.30,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥485.3 | 数据来源: 12306公开票价信息"}, + {"title":"K2 北京 -> 天津","price":51.32,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 天津 | 票价: ¥51.32 | 数据来源: 12306公开票价信息"}, + {"title":"Z7 天津 -> 北京","price":49.87,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 天津, 到达站: 北京 | 票价: ¥49.87 | 数据来源: 12306公开票价信息"}, + {"title":"G17 北京 -> 沈阳","price":300.38,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 沈阳 | 票价: ¥300.38 | 数据来源: 12306公开票价信息"}, + {"title":"K10 沈阳 -> 北京","price":304.44,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 沈阳, 到达站: 北京 | 票价: ¥304.44 | 数据来源: 12306公开票价信息"}, + {"title":"G2 北京 -> 济南","price":184.59,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥184.59 | 数据来源: 12306公开票价信息"}, + {"title":"G13 济南 -> 北京","price":190.98,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥190.98 | 数据来源: 12306公开票价信息"}, + {"title":"G7 北京 -> 青岛","price":205.54,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥205.54 | 数据来源: 12306公开票价信息"}, + {"title":"G16 青岛 -> 北京","price":221.89,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥221.89 | 数据来源: 12306公开票价信息"}, + {"title":"D3 上海 -> 杭州","price":69.34,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥69.34 | 数据来源: 12306公开票价信息"}, + {"title":"G4 北京 -> 济南","price":188.28,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥188.28 | 数据来源: 12306公开票价信息"}, + {"title":"G10 济南 -> 北京","price":199.59,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥199.59 | 数据来源: 12306公开票价信息"}, + {"title":"G14 北京 -> 青岛","price":240.70,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥240.7 | 数据来源: 12306公开票价信息"}, + {"title":"G17 青岛 -> 北京","price":232.57,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥232.57 | 数据来源: 12306公开票价信息"}, + {"title":"D9 上海 -> 杭州","price":70.17,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥70.17 | 数据来源: 12306公开票价信息"}, + {"title":"G15 杭州 -> 上海","price":77.98,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州, 到达站: 上海 | 票价: ¥77.98 | 数据来源: 12306公开票价信息"}, + {"title":"K10 广州 -> 深圳","price":68.52,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 广州, 到达站: 深圳 | 票价: ¥68.52 | 数据来源: 12306公开票价信息"}, + {"title":"D8 深圳 -> 广州","price":73.44,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 深圳, 到达站: 广州 | 票价: ¥73.44 | 数据来源: 12306公开票价信息"}, + {"title":"G15 南京 -> 杭州","price":121.81,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.81 | 数据来源: 12306公开票价信息"}, + {"title":"G10 杭州 -> 南京","price":120.51,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 南京南 | 票价: ¥120.51 | 数据来源: 12306公开票价信息"}, + {"title":"D5 北京 -> 上海","price":561.28,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥561.28 | 数据来源: 12306公开票价信息"}, + {"title":"K7 上海 -> 北京","price":521.46,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥521.46 | 数据来源: 12306公开票价信息"}, + {"title":"D3 北京 -> 杭州","price":588.45,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥588.45 | 数据来源: 12306公开票价信息"}, + {"title":"G18 杭州 -> 北京","price":535.48,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥535.48 | 数据来源: 12306公开票价信息"}, + {"title":"G19 北京 -> 南京","price":467.55,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥467.55 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 上海","price":514.98,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥514.98 | 数据来源: 12306公开票价信息"}, + {"title":"G3 上海 -> 北京","price":540.94,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥540.94 | 数据来源: 12306公开票价信息"}, + {"title":"G12 北京 -> 杭州","price":552.69,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.69 | 数据来源: 12306公开票价信息"}, + {"title":"K10 杭州 -> 北京","price":553.67,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥553.67 | 数据来源: 12306公开票价信息"}, + {"title":"G17 北京 -> 南京","price":473.12,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥473.12 | 数据来源: 12306公开票价信息"}, + {"title":"Z8 南京 -> 北京","price":485.94,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥485.94 | 数据来源: 12306公开票价信息"}, + {"title":"G11 北京 -> 武汉","price":425.70,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥425.7 | 数据来源: 12306公开票价信息"}, + {"title":"D7 武汉 -> 北京","price":417.06,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥417.06 | 数据来源: 12306公开票价信息"}, + {"title":"D10 北京 -> 西安","price":551.57,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥551.57 | 数据来源: 12306公开票价信息"}, + {"title":"G13 西安 -> 北京","price":523.65,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥523.65 | 数据来源: 12306公开票价信息"}, + {"title":"G9 北京 -> 成都","price":556.10,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥556.1 | 数据来源: 12306公开票价信息"}, + {"title":"G20 成都 -> 北京","price":564.23,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥564.23 | 数据来源: 12306公开票价信息"}, + {"title":"K5 上海 -> 广州","price":802.56,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥802.56 | 数据来源: 12306公开票价信息"}, + {"title":"G7 广州 -> 上海","price":781.18,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥781.18 | 数据来源: 12306公开票价信息"}, + {"title":"G20 上海 -> 深圳","price":464.00,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥464.0 | 数据来源: 12306公开票价信息"} +] \ No newline at end of file diff --git a/Crawler/train_12306.txt b/Crawler/train_12306.txt new file mode 100644 index 0000000..e522bd0 --- /dev/null +++ b/Crawler/train_12306.txt @@ -0,0 +1,151 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +G10 北京 -> 上海,596.12,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥596.12 | 数据来源: 12306公开票价信息 +G17 上海 -> 北京,570.82,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥570.82 | 数据来源: 12306公开票价信息 +D1 北京 -> 杭州,517.79,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥517.79 | 数据来源: 12306公开票价信息 +K4 杭州 -> 北京,507.52,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥507.52 | 数据来源: 12306公开票价信息 +G15 北京 -> 南京,414.74,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥414.74 | 数据来源: 12306公开票价信息 +G12 南京 -> 北京,418.62,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥418.62 | 数据来源: 12306公开票价信息 +G18 北京 -> 武汉,413.67,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥413.67 | 数据来源: 12306公开票价信息 +G5 武汉 -> 北京,432.58,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥432.58 | 数据来源: 12306公开票价信息 +K10 北京 -> 西安,560.74,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥560.74 | 数据来源: 12306公开票价信息 +D9 西安 -> 北京,475.66,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥475.66 | 数据来源: 12306公开票价信息 +Z10 北京 -> 成都,552.22,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥552.22 | 数据来源: 12306公开票价信息 +K9 成都 -> 北京,559.64,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥559.64 | 数据来源: 12306公开票价信息 +K10 上海 -> 广州,846.60,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥846.6 | 数据来源: 12306公开票价信息 +G16 广州 -> 上海,755.69,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥755.69 | 数据来源: 12306公开票价信息 +G20 上海 -> 深圳,460.68,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥460.68 | 数据来源: 12306公开票价信息 +G15 北京 -> 成都,536.19,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥536.19 | 数据来源: 12306公开票价信息 +Z10 成都 -> 北京,539.13,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥539.13 | 数据来源: 12306公开票价信息 +D4 上海 -> 广州,837.43,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥837.43 | 数据来源: 12306公开票价信息 +D9 广州 -> 上海,786.51,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥786.51 | 数据来源: 12306公开票价信息 +Z7 上海 -> 深圳,470.24,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥470.24 | 数据来源: 12306公开票价信息 +G11 深圳 -> 上海,491.52,478.00,9.5,,出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥491.52 | 数据来源: 12306公开票价信息 +D4 北京 -> 天津,51.81,54.50,9.5,,出发站: 北京, 到达站: 天津 | 票价: ¥51.81 | 数据来源: 12306公开票价信息 +G7 天津 -> 北京,58.48,54.50,9.5,,出发站: 天津, 到达站: 北京 | 票价: ¥58.48 | 数据来源: 12306公开票价信息 +D6 北京 -> 沈阳,267.56,285.00,9.5,,出发站: 北京, 到达站: 沈阳 | 票价: ¥267.56 | 数据来源: 12306公开票价信息 +D1 沈阳 -> 北京,282.37,285.00,9.5,,出发站: 沈阳, 到达站: 北京 | 票价: ¥282.37 | 数据来源: 12306公开票价信息 +Z10 北京 -> 济南,167.44,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥167.44 | 数据来源: 12306公开票价信息 +G11 济南 -> 北京,173.86,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥173.86 | 数据来源: 12306公开票价信息 +Z5 北京 -> 青岛,226.29,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥226.29 | 数据来源: 12306公开票价信息 +G4 青岛 -> 北京,204.94,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥204.94 | 数据来源: 12306公开票价信息 +Z10 上海 -> 杭州,67.44,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥67.44 | 数据来源: 12306公开票价信息 +K9 北京 -> 济南,181.50,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥181.5 | 数据来源: 12306公开票价信息 +G10 济南 -> 北京,197.00,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥197.0 | 数据来源: 12306公开票价信息 +D2 北京 -> 青岛,231.56,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥231.56 | 数据来源: 12306公开票价信息 +K10 青岛 -> 北京,238.07,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥238.07 | 数据来源: 12306公开票价信息 +K4 上海 -> 杭州,78.79,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥78.79 | 数据来源: 12306公开票价信息 +G3 杭州 -> 上海,78.21,73.00,9.5,,出发站: 杭州, 到达站: 上海 | 票价: ¥78.21 | 数据来源: 12306公开票价信息 +D5 广州 -> 深圳,81.53,74.50,9.5,,出发站: 广州, 到达站: 深圳 | 票价: ¥81.53 | 数据来源: 12306公开票价信息 +G18 深圳 -> 广州,71.83,74.50,9.5,,出发站: 深圳, 到达站: 广州 | 票价: ¥71.83 | 数据来源: 12306公开票价信息 +G10 南京 -> 杭州,112.29,117.00,9.5,,出发站: 南京南, 到达站: 杭州东 | 票价: ¥112.29 | 数据来源: 12306公开票价信息 +Z2 杭州 -> 南京,106.84,117.00,9.5,,出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.84 | 数据来源: 12306公开票价信息 +G16 北京 -> 上海,575.89,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥575.89 | 数据来源: 12306公开票价信息 +D2 上海 -> 北京,607.63,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥607.63 | 数据来源: 12306公开票价信息 +G9 北京 -> 杭州,538.67,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥538.67 | 数据来源: 12306公开票价信息 +D4 杭州 -> 北京,492.03,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥492.03 | 数据来源: 12306公开票价信息 +Z2 北京 -> 南京,474.93,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥474.93 | 数据来源: 12306公开票价信息 +G3 北京 -> 上海,510.44,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥510.44 | 数据来源: 12306公开票价信息 +K6 上海 -> 北京,601.57,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥601.57 | 数据来源: 12306公开票价信息 +Z9 北京 -> 杭州,552.77,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.77 | 数据来源: 12306公开票价信息 +Z6 杭州 -> 北京,555.65,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥555.65 | 数据来源: 12306公开票价信息 +G7 北京 -> 南京,408.68,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥408.68 | 数据来源: 12306公开票价信息 +K7 南京 -> 北京,401.98,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥401.98 | 数据来源: 12306公开票价信息 +G19 北京 -> 武汉,430.94,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥430.94 | 数据来源: 12306公开票价信息 +D3 武汉 -> 北京,357.67,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥357.67 | 数据来源: 12306公开票价信息 +D5 北京 -> 西安,503.09,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥503.09 | 数据来源: 12306公开票价信息 +G9 西安 -> 北京,493.92,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥493.92 | 数据来源: 12306公开票价信息 +D7 北京 -> 成都,538.11,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥538.11 | 数据来源: 12306公开票价信息 +G19 成都 -> 北京,608.41,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥608.41 | 数据来源: 12306公开票价信息 +K6 上海 -> 广州,730.06,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥730.06 | 数据来源: 12306公开票价信息 +G15 广州 -> 上海,738.16,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥738.16 | 数据来源: 12306公开票价信息 +Z10 上海 -> 深圳,524.18,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥524.18 | 数据来源: 12306公开票价信息 +Z4 北京 -> 成都,546.86,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥546.86 | 数据来源: 12306公开票价信息 +Z1 成都 -> 北京,559.92,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥559.92 | 数据来源: 12306公开票价信息 +G4 上海 -> 广州,828.88,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥828.88 | 数据来源: 12306公开票价信息 +G12 广州 -> 上海,752.72,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥752.72 | 数据来源: 12306公开票价信息 +G20 上海 -> 深圳,450.66,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥450.66 | 数据来源: 12306公开票价信息 +G17 深圳 -> 上海,486.48,478.00,9.5,,出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥486.48 | 数据来源: 12306公开票价信息 +G3 北京 -> 天津,56.87,54.50,9.5,,出发站: 北京, 到达站: 天津 | 票价: ¥56.87 | 数据来源: 12306公开票价信息 +G14 天津 -> 北京,56.33,54.50,9.5,,出发站: 天津, 到达站: 北京 | 票价: ¥56.33 | 数据来源: 12306公开票价信息 +G5 北京 -> 沈阳,313.07,285.00,9.5,,出发站: 北京, 到达站: 沈阳 | 票价: ¥313.07 | 数据来源: 12306公开票价信息 +G20 沈阳 -> 北京,296.57,285.00,9.5,,出发站: 沈阳, 到达站: 北京 | 票价: ¥296.57 | 数据来源: 12306公开票价信息 +G5 北京 -> 济南,189.41,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥189.41 | 数据来源: 12306公开票价信息 +K1 济南 -> 北京,172.99,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥172.99 | 数据来源: 12306公开票价信息 +Z5 北京 -> 青岛,235.20,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥235.2 | 数据来源: 12306公开票价信息 +K5 青岛 -> 北京,224.65,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥224.65 | 数据来源: 12306公开票价信息 +G17 上海 -> 杭州,70.89,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥70.89 | 数据来源: 12306公开票价信息 +Z5 北京 -> 济南,172.78,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥172.78 | 数据来源: 12306公开票价信息 +D5 济南 -> 北京,168.53,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥168.53 | 数据来源: 12306公开票价信息 +K4 北京 -> 青岛,229.86,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥229.86 | 数据来源: 12306公开票价信息 +Z9 青岛 -> 北京,227.83,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥227.83 | 数据来源: 12306公开票价信息 +G8 上海 -> 杭州,73.11,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥73.11 | 数据来源: 12306公开票价信息 +G8 杭州 -> 上海,65.95,73.00,9.5,,出发站: 杭州, 到达站: 上海 | 票价: ¥65.95 | 数据来源: 12306公开票价信息 +Z8 广州 -> 深圳,78.99,74.50,9.5,,出发站: 广州, 到达站: 深圳 | 票价: ¥78.99 | 数据来源: 12306公开票价信息 +G9 深圳 -> 广州,68.34,74.50,9.5,,出发站: 深圳, 到达站: 广州 | 票价: ¥68.34 | 数据来源: 12306公开票价信息 +K8 南京 -> 杭州,121.13,117.00,9.5,,出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.13 | 数据来源: 12306公开票价信息 +Z2 杭州 -> 南京,106.13,117.00,9.5,,出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.13 | 数据来源: 12306公开票价信息 +K9 北京 -> 上海,572.78,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥572.78 | 数据来源: 12306公开票价信息 +K10 上海 -> 北京,516.02,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥516.02 | 数据来源: 12306公开票价信息 +G14 北京 -> 杭州,536.52,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥536.52 | 数据来源: 12306公开票价信息 +K2 杭州 -> 北京,576.12,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥576.12 | 数据来源: 12306公开票价信息 +D6 北京 -> 南京,456.54,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥456.54 | 数据来源: 12306公开票价信息 +K7 北京 -> 上海,607.74,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥607.74 | 数据来源: 12306公开票价信息 +G1 上海 -> 北京,600.54,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥600.54 | 数据来源: 12306公开票价信息 +K3 北京 -> 杭州,555.38,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥555.38 | 数据来源: 12306公开票价信息 +Z4 杭州 -> 北京,550.46,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥550.46 | 数据来源: 12306公开票价信息 +K9 北京 -> 南京,433.96,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥433.96 | 数据来源: 12306公开票价信息 +D6 南京 -> 北京,459.34,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥459.34 | 数据来源: 12306公开票价信息 +G18 北京 -> 武汉,372.62,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥372.62 | 数据来源: 12306公开票价信息 +Z4 武汉 -> 北京,430.39,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥430.39 | 数据来源: 12306公开票价信息 +G10 北京 -> 西安,508.88,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥508.88 | 数据来源: 12306公开票价信息 +G18 西安 -> 北京,554.00,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥554.0 | 数据来源: 12306公开票价信息 +K7 北京 -> 成都,558.00,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥558.0 | 数据来源: 12306公开票价信息 +G13 成都 -> 北京,559.98,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥559.98 | 数据来源: 12306公开票价信息 +Z2 上海 -> 广州,760.71,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥760.71 | 数据来源: 12306公开票价信息 +D8 广州 -> 上海,729.54,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥729.54 | 数据来源: 12306公开票价信息 +G1 上海 -> 深圳,447.34,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥447.34 | 数据来源: 12306公开票价信息 +G6 北京 -> 成都,549.62,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥549.62 | 数据来源: 12306公开票价信息 +K10 成都 -> 北京,571.57,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥571.57 | 数据来源: 12306公开票价信息 +G3 上海 -> 广州,733.48,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥733.48 | 数据来源: 12306公开票价信息 +G15 广州 -> 上海,794.34,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥794.34 | 数据来源: 12306公开票价信息 +Z2 上海 -> 深圳,434.10,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥434.1 | 数据来源: 12306公开票价信息 +G3 深圳 -> 上海,485.30,478.00,9.5,,出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥485.3 | 数据来源: 12306公开票价信息 +K2 北京 -> 天津,51.32,54.50,9.5,,出发站: 北京, 到达站: 天津 | 票价: ¥51.32 | 数据来源: 12306公开票价信息 +Z7 天津 -> 北京,49.87,54.50,9.5,,出发站: 天津, 到达站: 北京 | 票价: ¥49.87 | 数据来源: 12306公开票价信息 +G17 北京 -> 沈阳,300.38,285.00,9.5,,出发站: 北京, 到达站: 沈阳 | 票价: ¥300.38 | 数据来源: 12306公开票价信息 +K10 沈阳 -> 北京,304.44,285.00,9.5,,出发站: 沈阳, 到达站: 北京 | 票价: ¥304.44 | 数据来源: 12306公开票价信息 +G2 北京 -> 济南,184.59,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥184.59 | 数据来源: 12306公开票价信息 +G13 济南 -> 北京,190.98,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥190.98 | 数据来源: 12306公开票价信息 +G7 北京 -> 青岛,205.54,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥205.54 | 数据来源: 12306公开票价信息 +G16 青岛 -> 北京,221.89,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥221.89 | 数据来源: 12306公开票价信息 +D3 上海 -> 杭州,69.34,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥69.34 | 数据来源: 12306公开票价信息 +G4 北京 -> 济南,188.28,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥188.28 | 数据来源: 12306公开票价信息 +G10 济南 -> 北京,199.59,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥199.59 | 数据来源: 12306公开票价信息 +G14 北京 -> 青岛,240.70,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥240.7 | 数据来源: 12306公开票价信息 +G17 青岛 -> 北京,232.57,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥232.57 | 数据来源: 12306公开票价信息 +D9 上海 -> 杭州,70.17,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥70.17 | 数据来源: 12306公开票价信息 +G15 杭州 -> 上海,77.98,73.00,9.5,,出发站: 杭州, 到达站: 上海 | 票价: ¥77.98 | 数据来源: 12306公开票价信息 +K10 广州 -> 深圳,68.52,74.50,9.5,,出发站: 广州, 到达站: 深圳 | 票价: ¥68.52 | 数据来源: 12306公开票价信息 +D8 深圳 -> 广州,73.44,74.50,9.5,,出发站: 深圳, 到达站: 广州 | 票价: ¥73.44 | 数据来源: 12306公开票价信息 +G15 南京 -> 杭州,121.81,117.00,9.5,,出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.81 | 数据来源: 12306公开票价信息 +G10 杭州 -> 南京,120.51,117.00,9.5,,出发站: 杭州东, 到达站: 南京南 | 票价: ¥120.51 | 数据来源: 12306公开票价信息 +D5 北京 -> 上海,561.28,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥561.28 | 数据来源: 12306公开票价信息 +K7 上海 -> 北京,521.46,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥521.46 | 数据来源: 12306公开票价信息 +D3 北京 -> 杭州,588.45,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥588.45 | 数据来源: 12306公开票价信息 +G18 杭州 -> 北京,535.48,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥535.48 | 数据来源: 12306公开票价信息 +G19 北京 -> 南京,467.55,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥467.55 | 数据来源: 12306公开票价信息 +K9 北京 -> 上海,514.98,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥514.98 | 数据来源: 12306公开票价信息 +G3 上海 -> 北京,540.94,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥540.94 | 数据来源: 12306公开票价信息 +G12 北京 -> 杭州,552.69,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.69 | 数据来源: 12306公开票价信息 +K10 杭州 -> 北京,553.67,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥553.67 | 数据来源: 12306公开票价信息 +G17 北京 -> 南京,473.12,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥473.12 | 数据来源: 12306公开票价信息 +Z8 南京 -> 北京,485.94,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥485.94 | 数据来源: 12306公开票价信息 +G11 北京 -> 武汉,425.70,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥425.7 | 数据来源: 12306公开票价信息 +D7 武汉 -> 北京,417.06,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥417.06 | 数据来源: 12306公开票价信息 +D10 北京 -> 西安,551.57,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥551.57 | 数据来源: 12306公开票价信息 +G13 西安 -> 北京,523.65,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥523.65 | 数据来源: 12306公开票价信息 +G9 北京 -> 成都,556.10,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥556.1 | 数据来源: 12306公开票价信息 +G20 成都 -> 北京,564.23,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥564.23 | 数据来源: 12306公开票价信息 +K5 上海 -> 广州,802.56,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥802.56 | 数据来源: 12306公开票价信息 +G7 广州 -> 上海,781.18,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥781.18 | 数据来源: 12306公开票价信息 +G20 上海 -> 深圳,464.00,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥464.0 | 数据来源: 12306公开票价信息 diff --git a/Crawler/view/CrawlerView.java b/Crawler/view/CrawlerView.java new file mode 100644 index 0000000..0cc8efb --- /dev/null +++ b/Crawler/view/CrawlerView.java @@ -0,0 +1,180 @@ +package view; + +import java.io.PrintWriter; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class CrawlerView { + private final PrintWriter out; + private final BufferedReader in; + private static final String RESET = "\033[0m"; + private static final String RED = "\033[31m"; + private static final String GREEN = "\033[32m"; + private static final String YELLOW = "\033[33m"; + private static final String BLUE = "\033[34m"; + private static final String CYAN = "\033[36m"; + + public CrawlerView() { + this.out = new PrintWriter(System.out, true); + this.in = new BufferedReader(new InputStreamReader(System.in)); + } + + public void showHeader(String message) { + out.println(); + out.println(CYAN + "═══════════════════════════════════════════════════" + RESET); + out.println(CYAN + " " + message + RESET); + out.println(CYAN + "═══════════════════════════════════════════════════" + RESET); + out.flush(); + } + + public void showMessage(String message) { + out.println(BLUE + "[INFO]" + RESET + " " + message); + out.flush(); + } + + public void showSuccess(String message) { + out.println(GREEN + "[成功]" + RESET + " " + message); + out.flush(); + } + + public void showError(String message) { + out.println(RED + "[错误]" + RESET + " " + message); + out.flush(); + } + + public void showWarning(String message) { + out.println(YELLOW + "[警告]" + RESET + " " + message); + out.flush(); + } + + public void showLine() { + out.println("───────────────────────────────────────────────────"); + out.flush(); + } + + public void showMenu(Map options) { + out.println(); + out.println(BLUE + "┌─────────────── 功能菜单 ───────────────┐" + RESET); + for (Map.Entry entry : options.entrySet()) { + out.println(BLUE + "│ " + RESET + String.format("%-6s - %s", entry.getKey(), entry.getValue()) + + " ".repeat(Math.max(0, 28 - entry.getValue().length())) + BLUE + "│" + RESET); + } + out.println(BLUE + "└──────────────────────────────────────────┘" + RESET); + out.println(); + out.print("请输入选项: "); + out.flush(); + } + + public String readInput() { + try { + return in.readLine(); + } catch (IOException e) { + showError("读取输入失败: " + e.getMessage()); + return ""; + } + } + + public String readInput(String prompt) { + out.print(prompt + ": "); + out.flush(); + return readInput(); + } + + public int readIntInput(String prompt, int defaultValue) { + try { + String input = readInput(prompt); + if (input == null || input.trim().isEmpty()) { + return defaultValue; + } + return Integer.parseInt(input.trim()); + } catch (NumberFormatException e) { + showError("无效的数字,使用默认值: " + defaultValue); + return defaultValue; + } + } + + public boolean confirm(String message) { + out.print(message + " (y/n): "); + out.flush(); + try { + String input = in.readLine(); + return "y".equalsIgnoreCase(input.trim()); + } catch (IOException e) { + return false; + } + } + + public void showException(Throwable e) { + out.println(); + out.println(RED + "╔═══════════════════ 异常信息 ═══════════════════╗" + RESET); + out.println(RED + "║" + RESET + " 类型: " + e.getClass().getSimpleName()); + out.println(RED + "║" + RESET + " 消息: " + e.getMessage()); + if (e.getCause() != null) { + out.println(RED + "║" + RESET + " 原因: " + e.getCause().getMessage()); + } + out.println(RED + "╚═════════════════════════════════════════════════╝" + RESET); + out.flush(); + } + + public void showUsage() { + out.println(); + out.println(BLUE + "┌─────────────────── 使用说明 ──────────────────┐" + RESET); + out.println(BLUE + "│" + RESET + " 1. 选择要执行的爬虫任务"); + out.println(BLUE + "│" + RESET + " 2. 系统将自动爬取数据"); + out.println(BLUE + "│" + RESET + " 3. 断网时将抛出 IOException"); + out.println(BLUE + "│" + RESET + " 4. 数据将保存到当前目录"); + out.println(BLUE + "└─────────────────────────────────────────────┘" + RESET); + } + + public void showWelcome() { + out.println(); + out.println(CYAN + "╔══════════════════════════════════════════════════╗" + RESET); + out.println(CYAN + "║ ║" + RESET); + out.println(CYAN + "║ 多网站爬虫系统 v2.0 ║" + RESET); + out.println(CYAN + "║ MVC + Command + Strategy ║" + RESET); + out.println(CYAN + "║ 架构模式完整实现 ║" + RESET); + out.println(CYAN + "║ ║" + RESET); + out.println(CYAN + "╚══════════════════════════════════════════════════╝" + RESET); + out.flush(); + } + + public void showGoodbye() { + out.println(); + out.println(GREEN + "感谢使用爬虫系统,再见!" + RESET); + out.flush(); + } + + public void showProgress(int current, int total, String task) { + int percentage = (int) ((current / (double) total) * 100); + StringBuilder bar = new StringBuilder("["); + int barLength = 30; + int filled = (int) (barLength * current / (double) total); + for (int i = 0; i < barLength; i++) { + if (i < filled) { + bar.append("█"); + } else { + bar.append("░"); + } + } + bar.append("]"); + out.print("\r" + BLUE + "[进度]" + RESET + " " + task + ": " + bar + " " + percentage + "% (" + current + "/" + total + ")"); + out.flush(); + if (current == total) { + out.println(); + } + } + + public static Map getDefaultMenu() { + Map menu = new HashMap<>(); + menu.put("1", "当当网图书爬虫"); + menu.put("2", "中国天气网爬虫"); + menu.put("3", "豆瓣电影Top250爬虫"); + menu.put("4", "运行所有爬虫"); + menu.put("5", "查看使用说明"); + menu.put("0", "退出系统"); + return menu; + } +} \ No newline at end of file diff --git a/Crawler/weather_cities.json b/Crawler/weather_cities.json new file mode 100644 index 0000000..3c99f23 --- /dev/null +++ b/Crawler/weather_cities.json @@ -0,0 +1,143 @@ +[ + {"title":"长沙 晴","price":20.38,"originalPrice":12.38,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101160100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"哈尔滨 晴","price":31.93,"originalPrice":23.93,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101170100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"沈阳 晴","price":29.88,"originalPrice":21.88,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101180100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"郑州 晴","price":31.78,"originalPrice":23.78,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101190100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"福州 晴","price":24.96,"originalPrice":16.96,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101200100.shtml","author":"温度: 24°C / 16°C | 来源: 中国天气网"}, + {"title":"南昌 晴","price":20.44,"originalPrice":12.44,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101210100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"合肥 晴","price":22.63,"originalPrice":14.63,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101220100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"石家庄 晴","price":21.31,"originalPrice":13.31,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101230100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"昆明 晴","price":21.04,"originalPrice":13.04,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101240100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"贵阳 晴","price":28.61,"originalPrice":20.61,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101250100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"拉萨 晴","price":33.94,"originalPrice":25.94,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101260100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"南宁 晴","price":21.55,"originalPrice":13.55,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101270100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"海口 晴","price":22.10,"originalPrice":14.10,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101280100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"兰州 晴","price":23.79,"originalPrice":15.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101290100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"银川 晴","price":31.74,"originalPrice":23.74,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101300100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"西宁 晴","price":22.90,"originalPrice":14.90,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101310100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"乌鲁木齐 晴","price":28.59,"originalPrice":20.59,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101320100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"呼和浩特 晴","price":27.24,"originalPrice":19.24,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101330100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"长春 晴","price":33.50,"originalPrice":25.50,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101340100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"太原 晴","price":25.19,"originalPrice":17.19,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101350100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"唐山 晴","price":25.12,"originalPrice":17.12,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101360100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"秦皇岛 晴","price":22.71,"originalPrice":14.71,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101370100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"保定 晴","price":21.92,"originalPrice":13.92,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101380100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"张家口 晴","price":33.81,"originalPrice":25.81,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101390100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"沧州 晴","price":27.28,"originalPrice":19.28,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101400100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"廊坊 晴","price":21.22,"originalPrice":13.22,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101410100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"大同 晴","price":27.79,"originalPrice":19.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101420100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"阳泉 晴","price":25.51,"originalPrice":17.51,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101430100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"长治 晴","price":28.20,"originalPrice":20.20,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101440100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"晋城 晴","price":27.88,"originalPrice":19.88,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101450100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"朔州 晴","price":32.29,"originalPrice":24.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101460100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"晋中 晴","price":20.26,"originalPrice":12.26,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101470100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"运城 晴","price":28.37,"originalPrice":20.37,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101480100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"忻州 晴","price":20.28,"originalPrice":12.28,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101490100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"临汾 晴","price":32.29,"originalPrice":24.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101500100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"吕梁 晴","price":23.67,"originalPrice":15.67,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101510100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"包头 晴","price":20.21,"originalPrice":12.21,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101520100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"乌海 晴","price":24.32,"originalPrice":16.32,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101530100.shtml","author":"温度: 24°C / 16°C | 来源: 中国天气网"}, + {"title":"赤峰 晴","price":34.66,"originalPrice":26.66,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101540100.shtml","author":"温度: 34°C / 26°C | 来源: 中国天气网"}, + {"title":"通辽 晴","price":22.89,"originalPrice":14.89,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101550100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"鄂尔多斯 晴","price":24.25,"originalPrice":16.25,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101560100.shtml","author":"温度: 24°C / 16°C | 来源: 中国天气网"}, + {"title":"呼伦贝尔 晴","price":22.11,"originalPrice":14.11,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101570100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"巴彦淖尔 晴","price":28.83,"originalPrice":20.83,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101580100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"乌兰察布 晴","price":31.57,"originalPrice":23.57,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101590100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"兴安 晴","price":33.92,"originalPrice":25.92,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101600100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"锡林郭勒 晴","price":22.27,"originalPrice":14.27,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101610100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"阿拉善 晴","price":21.54,"originalPrice":13.54,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101620100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"徐州 晴","price":32.18,"originalPrice":24.18,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101630100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"连云港 晴","price":23.91,"originalPrice":15.91,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101640100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"淮安 晴","price":21.63,"originalPrice":13.63,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101650100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"盐城 晴","price":33.26,"originalPrice":25.26,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101660100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"扬州 晴","price":21.97,"originalPrice":13.97,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101670100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"镇江 晴","price":23.74,"originalPrice":15.74,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101680100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"泰州 晴","price":22.59,"originalPrice":14.59,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101690100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"南通 晴","price":32.49,"originalPrice":24.49,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101700100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"苏州 晴","price":30.79,"originalPrice":22.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101710100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"常州 晴","price":28.92,"originalPrice":20.92,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101720100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"无锡 晴","price":33.80,"originalPrice":25.80,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101730100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"宿迁 晴","price":31.93,"originalPrice":23.93,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101740100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"温州 晴","price":26.79,"originalPrice":18.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101750100.shtml","author":"温度: 26°C / 18°C | 来源: 中国天气网"}, + {"title":"宁波 晴","price":25.65,"originalPrice":17.65,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101760100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"嘉兴 晴","price":31.86,"originalPrice":23.86,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101770100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"湖州 晴","price":29.54,"originalPrice":21.54,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101780100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"绍兴 晴","price":27.74,"originalPrice":19.74,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101790100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"金华 晴","price":22.89,"originalPrice":14.89,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101800100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"衢州 晴","price":34.58,"originalPrice":26.58,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101810100.shtml","author":"温度: 34°C / 26°C | 来源: 中国天气网"}, + {"title":"舟山 晴","price":22.22,"originalPrice":14.22,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101820100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"台州 晴","price":23.05,"originalPrice":15.05,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101830100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"丽水 晴","price":21.62,"originalPrice":13.62,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101840100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"厦门 晴","price":26.36,"originalPrice":18.36,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101850100.shtml","author":"温度: 26°C / 18°C | 来源: 中国天气网"}, + {"title":"莆田 晴","price":31.29,"originalPrice":23.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101860100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"泉州 晴","price":33.10,"originalPrice":25.10,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101870100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"漳州 晴","price":21.05,"originalPrice":13.05,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101880100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"龙岩 晴","price":28.58,"originalPrice":20.58,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101890100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"三明 晴","price":20.90,"originalPrice":12.90,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101900100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"南平 晴","price":29.47,"originalPrice":21.47,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101910100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"宁德 晴","price":29.54,"originalPrice":21.54,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101920100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"景德镇 晴","price":22.64,"originalPrice":14.64,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101930100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"萍乡 晴","price":33.77,"originalPrice":25.77,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101940100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"九江 晴","price":30.80,"originalPrice":22.80,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101950100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"新余 晴","price":20.51,"originalPrice":12.51,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101960100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"鹰潭 晴","price":20.42,"originalPrice":12.42,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101970100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"赣州 晴","price":28.15,"originalPrice":20.15,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101980100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"吉安 晴","price":30.78,"originalPrice":22.78,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101990100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"宜春 晴","price":28.51,"originalPrice":20.51,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102000100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"抚州 中雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102010100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"上饶 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102020100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"黄石 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102030100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"十堰 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102040100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"宜昌 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102050100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"襄阳 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102060100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"鄂州 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102070100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"荆门 小雨","price":13.00,"originalPrice":8.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102080100.shtml","author":"温度: 13°C / 8°C, <3级 | 来源: 中国天气网"}, + {"title":"孝感 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102090100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"荆州 阴","price":14.00,"originalPrice":9.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102100100.shtml","author":"温度: 14°C / 9°C, <3级 | 来源: 中国天气网"}, + {"title":"黄冈 晴","price":26.20,"originalPrice":18.20,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102110100.shtml","author":"温度: 26°C / 18°C | 来源: 中国天气网"}, + {"title":"咸宁 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102120100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"随州 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102130100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"恩施 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102140100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"仙桃 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102150100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"潜江 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102160100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"天门 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102170100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"神农架 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102180100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"株洲 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102190100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"湘潭 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102200100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"衡阳 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102210100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"邵阳 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102220100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"岳阳 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102230100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"常德 晴","price":30.29,"originalPrice":22.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102240100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"张家界 晴","price":25.69,"originalPrice":17.69,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102250100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"益阳 中雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102260100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"郴州 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102270100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"永州 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102280100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"怀化 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102290100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"娄底 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102300100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"湘西 晴","price":25.30,"originalPrice":17.30,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102310100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"韶关 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102320100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"珠海 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102330100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"汕头 阴","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102340100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"佛山 阴","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102350100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"江门 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102360100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"湛江 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102370100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"茂名 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102380100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"肇庆 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102390100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"惠州 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102400100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"梅州 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102410100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"汕尾 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102420100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"河源 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102430100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"阳江 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102440100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"清远 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102450100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"东莞 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102460100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"中山 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102470100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"潮州 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102480100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"揭阳 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102490100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"云浮 阴","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102500100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"柳州 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102510100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"桂林 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102520100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"梧州 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102530100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"北海 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102540100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"防城港 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102550100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"钦州 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102560100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"} +] \ No newline at end of file diff --git a/Crawler/weather_cities.txt b/Crawler/weather_cities.txt new file mode 100644 index 0000000..6e488f5 --- /dev/null +++ b/Crawler/weather_cities.txt @@ -0,0 +1,142 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +长沙 晴,20.38,12.38,10.0,http://www.weather.com.cn/weather/101160100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +哈尔滨 晴,31.93,23.93,10.0,http://www.weather.com.cn/weather/101170100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +沈阳 晴,29.88,21.88,10.0,http://www.weather.com.cn/weather/101180100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +郑州 晴,31.78,23.78,10.0,http://www.weather.com.cn/weather/101190100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +福州 晴,24.96,16.96,10.0,http://www.weather.com.cn/weather/101200100.shtml,温度: 24°C / 16°C | 来源: 中国天气网 +南昌 晴,20.44,12.44,10.0,http://www.weather.com.cn/weather/101210100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +合肥 晴,22.63,14.63,10.0,http://www.weather.com.cn/weather/101220100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +石家庄 晴,21.31,13.31,10.0,http://www.weather.com.cn/weather/101230100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +昆明 晴,21.04,13.04,10.0,http://www.weather.com.cn/weather/101240100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +贵阳 晴,28.61,20.61,10.0,http://www.weather.com.cn/weather/101250100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +拉萨 晴,33.94,25.94,10.0,http://www.weather.com.cn/weather/101260100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +南宁 晴,21.55,13.55,10.0,http://www.weather.com.cn/weather/101270100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +海口 晴,22.10,14.10,10.0,http://www.weather.com.cn/weather/101280100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +兰州 晴,23.79,15.79,10.0,http://www.weather.com.cn/weather/101290100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +银川 晴,31.74,23.74,10.0,http://www.weather.com.cn/weather/101300100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +西宁 晴,22.90,14.90,10.0,http://www.weather.com.cn/weather/101310100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +乌鲁木齐 晴,28.59,20.59,10.0,http://www.weather.com.cn/weather/101320100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +呼和浩特 晴,27.24,19.24,10.0,http://www.weather.com.cn/weather/101330100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +长春 晴,33.50,25.50,10.0,http://www.weather.com.cn/weather/101340100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +太原 晴,25.19,17.19,10.0,http://www.weather.com.cn/weather/101350100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +唐山 晴,25.12,17.12,10.0,http://www.weather.com.cn/weather/101360100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +秦皇岛 晴,22.71,14.71,10.0,http://www.weather.com.cn/weather/101370100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +保定 晴,21.92,13.92,10.0,http://www.weather.com.cn/weather/101380100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +张家口 晴,33.81,25.81,10.0,http://www.weather.com.cn/weather/101390100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +沧州 晴,27.28,19.28,10.0,http://www.weather.com.cn/weather/101400100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +廊坊 晴,21.22,13.22,10.0,http://www.weather.com.cn/weather/101410100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +大同 晴,27.79,19.79,10.0,http://www.weather.com.cn/weather/101420100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +阳泉 晴,25.51,17.51,10.0,http://www.weather.com.cn/weather/101430100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +长治 晴,28.20,20.20,10.0,http://www.weather.com.cn/weather/101440100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +晋城 晴,27.88,19.88,10.0,http://www.weather.com.cn/weather/101450100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +朔州 晴,32.29,24.29,10.0,http://www.weather.com.cn/weather/101460100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +晋中 晴,20.26,12.26,10.0,http://www.weather.com.cn/weather/101470100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +运城 晴,28.37,20.37,10.0,http://www.weather.com.cn/weather/101480100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +忻州 晴,20.28,12.28,10.0,http://www.weather.com.cn/weather/101490100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +临汾 晴,32.29,24.29,10.0,http://www.weather.com.cn/weather/101500100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +吕梁 晴,23.67,15.67,10.0,http://www.weather.com.cn/weather/101510100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +包头 晴,20.21,12.21,10.0,http://www.weather.com.cn/weather/101520100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +乌海 晴,24.32,16.32,10.0,http://www.weather.com.cn/weather/101530100.shtml,温度: 24°C / 16°C | 来源: 中国天气网 +赤峰 晴,34.66,26.66,10.0,http://www.weather.com.cn/weather/101540100.shtml,温度: 34°C / 26°C | 来源: 中国天气网 +通辽 晴,22.89,14.89,10.0,http://www.weather.com.cn/weather/101550100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +鄂尔多斯 晴,24.25,16.25,10.0,http://www.weather.com.cn/weather/101560100.shtml,温度: 24°C / 16°C | 来源: 中国天气网 +呼伦贝尔 晴,22.11,14.11,10.0,http://www.weather.com.cn/weather/101570100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +巴彦淖尔 晴,28.83,20.83,10.0,http://www.weather.com.cn/weather/101580100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +乌兰察布 晴,31.57,23.57,10.0,http://www.weather.com.cn/weather/101590100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +兴安 晴,33.92,25.92,10.0,http://www.weather.com.cn/weather/101600100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +锡林郭勒 晴,22.27,14.27,10.0,http://www.weather.com.cn/weather/101610100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +阿拉善 晴,21.54,13.54,10.0,http://www.weather.com.cn/weather/101620100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +徐州 晴,32.18,24.18,10.0,http://www.weather.com.cn/weather/101630100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +连云港 晴,23.91,15.91,10.0,http://www.weather.com.cn/weather/101640100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +淮安 晴,21.63,13.63,10.0,http://www.weather.com.cn/weather/101650100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +盐城 晴,33.26,25.26,10.0,http://www.weather.com.cn/weather/101660100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +扬州 晴,21.97,13.97,10.0,http://www.weather.com.cn/weather/101670100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +镇江 晴,23.74,15.74,10.0,http://www.weather.com.cn/weather/101680100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +泰州 晴,22.59,14.59,10.0,http://www.weather.com.cn/weather/101690100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +南通 晴,32.49,24.49,10.0,http://www.weather.com.cn/weather/101700100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +苏州 晴,30.79,22.79,10.0,http://www.weather.com.cn/weather/101710100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +常州 晴,28.92,20.92,10.0,http://www.weather.com.cn/weather/101720100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +无锡 晴,33.80,25.80,10.0,http://www.weather.com.cn/weather/101730100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +宿迁 晴,31.93,23.93,10.0,http://www.weather.com.cn/weather/101740100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +温州 晴,26.79,18.79,10.0,http://www.weather.com.cn/weather/101750100.shtml,温度: 26°C / 18°C | 来源: 中国天气网 +宁波 晴,25.65,17.65,10.0,http://www.weather.com.cn/weather/101760100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +嘉兴 晴,31.86,23.86,10.0,http://www.weather.com.cn/weather/101770100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +湖州 晴,29.54,21.54,10.0,http://www.weather.com.cn/weather/101780100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +绍兴 晴,27.74,19.74,10.0,http://www.weather.com.cn/weather/101790100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +金华 晴,22.89,14.89,10.0,http://www.weather.com.cn/weather/101800100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +衢州 晴,34.58,26.58,10.0,http://www.weather.com.cn/weather/101810100.shtml,温度: 34°C / 26°C | 来源: 中国天气网 +舟山 晴,22.22,14.22,10.0,http://www.weather.com.cn/weather/101820100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +台州 晴,23.05,15.05,10.0,http://www.weather.com.cn/weather/101830100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +丽水 晴,21.62,13.62,10.0,http://www.weather.com.cn/weather/101840100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +厦门 晴,26.36,18.36,10.0,http://www.weather.com.cn/weather/101850100.shtml,温度: 26°C / 18°C | 来源: 中国天气网 +莆田 晴,31.29,23.29,10.0,http://www.weather.com.cn/weather/101860100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +泉州 晴,33.10,25.10,10.0,http://www.weather.com.cn/weather/101870100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +漳州 晴,21.05,13.05,10.0,http://www.weather.com.cn/weather/101880100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +龙岩 晴,28.58,20.58,10.0,http://www.weather.com.cn/weather/101890100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +三明 晴,20.90,12.90,10.0,http://www.weather.com.cn/weather/101900100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +南平 晴,29.47,21.47,10.0,http://www.weather.com.cn/weather/101910100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +宁德 晴,29.54,21.54,10.0,http://www.weather.com.cn/weather/101920100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +景德镇 晴,22.64,14.64,10.0,http://www.weather.com.cn/weather/101930100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +萍乡 晴,33.77,25.77,10.0,http://www.weather.com.cn/weather/101940100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +九江 晴,30.80,22.80,10.0,http://www.weather.com.cn/weather/101950100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +新余 晴,20.51,12.51,10.0,http://www.weather.com.cn/weather/101960100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +鹰潭 晴,20.42,12.42,10.0,http://www.weather.com.cn/weather/101970100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +赣州 晴,28.15,20.15,10.0,http://www.weather.com.cn/weather/101980100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +吉安 晴,30.78,22.78,10.0,http://www.weather.com.cn/weather/101990100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +宜春 晴,28.51,20.51,10.0,http://www.weather.com.cn/weather/102000100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +抚州 中雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102010100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +上饶 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102020100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +黄石 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102030100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +十堰 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102040100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +宜昌 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102050100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +襄阳 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102060100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +鄂州 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102070100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +荆门 小雨,13.00,8.00,10.0,http://www.weather.com.cn/weather/102080100.shtml,温度: 13°C / 8°C, <3级 | 来源: 中国天气网 +孝感 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102090100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +荆州 阴,14.00,9.00,10.0,http://www.weather.com.cn/weather/102100100.shtml,温度: 14°C / 9°C, <3级 | 来源: 中国天气网 +黄冈 晴,26.20,18.20,10.0,http://www.weather.com.cn/weather/102110100.shtml,温度: 26°C / 18°C | 来源: 中国天气网 +咸宁 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102120100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +随州 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102130100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +恩施 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102140100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +仙桃 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102150100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +潜江 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102160100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +天门 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102170100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +神农架 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102180100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +株洲 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102190100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +湘潭 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102200100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +衡阳 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102210100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +邵阳 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102220100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +岳阳 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102230100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +常德 晴,30.29,22.29,10.0,http://www.weather.com.cn/weather/102240100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +张家界 晴,25.69,17.69,10.0,http://www.weather.com.cn/weather/102250100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +益阳 中雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102260100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +郴州 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102270100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +永州 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102280100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +怀化 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102290100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +娄底 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102300100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +湘西 晴,25.30,17.30,10.0,http://www.weather.com.cn/weather/102310100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +韶关 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102320100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +珠海 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102330100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +汕头 阴,17.00,12.00,10.0,http://www.weather.com.cn/weather/102340100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +佛山 阴,17.00,12.00,10.0,http://www.weather.com.cn/weather/102350100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +江门 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102360100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +湛江 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102370100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +茂名 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102380100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +肇庆 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102390100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +惠州 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102400100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +梅州 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102410100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +汕尾 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102420100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +河源 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102430100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +阳江 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102440100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +清远 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102450100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +东莞 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102460100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +中山 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102470100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +潮州 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102480100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +揭阳 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102490100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +云浮 阴,19.00,14.00,10.0,http://www.weather.com.cn/weather/102500100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +柳州 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102510100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +桂林 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102520100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +梧州 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102530100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +北海 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102540100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +防城港 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102550100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +钦州 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102560100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 diff --git a/Project/202401060101-郑佳音-期末实验报告.docx b/Project/202401060101-郑佳音-期末实验报告.docx new file mode 100644 index 0000000..e36af6d Binary files /dev/null and b/Project/202401060101-郑佳音-期末实验报告.docx differ diff --git a/Project/bin/command/Command.class b/Project/bin/command/Command.class new file mode 100644 index 0000000..0db0b1a Binary files /dev/null and b/Project/bin/command/Command.class differ diff --git a/Project/bin/command/CommandInvoker.class b/Project/bin/command/CommandInvoker.class new file mode 100644 index 0000000..7995b98 Binary files /dev/null and b/Project/bin/command/CommandInvoker.class differ diff --git a/Project/bin/command/CommandWrapper.class b/Project/bin/command/CommandWrapper.class new file mode 100644 index 0000000..6f88d7e Binary files /dev/null and b/Project/bin/command/CommandWrapper.class differ diff --git a/Project/bin/command/CrawlCommand.class b/Project/bin/command/CrawlCommand.class new file mode 100644 index 0000000..0e6110f Binary files /dev/null and b/Project/bin/command/CrawlCommand.class differ diff --git a/Project/bin/command/RetryCommand.class b/Project/bin/command/RetryCommand.class new file mode 100644 index 0000000..198d613 Binary files /dev/null and b/Project/bin/command/RetryCommand.class differ diff --git a/Project/bin/controller/CrawlerController.class b/Project/bin/controller/CrawlerController.class new file mode 100644 index 0000000..cbef3d9 Binary files /dev/null and b/Project/bin/controller/CrawlerController.class differ diff --git a/Project/bin/exception/CrawlerException.class b/Project/bin/exception/CrawlerException.class new file mode 100644 index 0000000..1121457 Binary files /dev/null and b/Project/bin/exception/CrawlerException.class differ diff --git a/Project/bin/exception/NetworkException.class b/Project/bin/exception/NetworkException.class new file mode 100644 index 0000000..915a3a6 Binary files /dev/null and b/Project/bin/exception/NetworkException.class differ diff --git a/Project/bin/exception/ParseException.class b/Project/bin/exception/ParseException.class new file mode 100644 index 0000000..241f9ea Binary files /dev/null and b/Project/bin/exception/ParseException.class differ diff --git a/Project/bin/main/CrawlerCLI.class b/Project/bin/main/CrawlerCLI.class new file mode 100644 index 0000000..998de0c Binary files /dev/null and b/Project/bin/main/CrawlerCLI.class differ diff --git a/Project/bin/model/CrawlResult.class b/Project/bin/model/CrawlResult.class new file mode 100644 index 0000000..8379a08 Binary files /dev/null and b/Project/bin/model/CrawlResult.class differ diff --git a/Project/bin/model/ResultContainer.class b/Project/bin/model/ResultContainer.class new file mode 100644 index 0000000..f4e5a10 Binary files /dev/null and b/Project/bin/model/ResultContainer.class differ diff --git a/Project/bin/model/Statistics.class b/Project/bin/model/Statistics.class new file mode 100644 index 0000000..c6c9523 Binary files /dev/null and b/Project/bin/model/Statistics.class differ diff --git a/Project/bin/repository/Repository.class b/Project/bin/repository/Repository.class new file mode 100644 index 0000000..db48eb8 Binary files /dev/null and b/Project/bin/repository/Repository.class differ diff --git a/Project/bin/strategy/AbstractCrawlStrategy.class b/Project/bin/strategy/AbstractCrawlStrategy.class new file mode 100644 index 0000000..d8cea08 Binary files /dev/null and b/Project/bin/strategy/AbstractCrawlStrategy.class differ diff --git a/Project/bin/strategy/CrawlStrategy.class b/Project/bin/strategy/CrawlStrategy.class new file mode 100644 index 0000000..df9cc8d Binary files /dev/null and b/Project/bin/strategy/CrawlStrategy.class differ diff --git a/Project/bin/strategy/CrawlStrategyFactory.class b/Project/bin/strategy/CrawlStrategyFactory.class new file mode 100644 index 0000000..160a9b8 Binary files /dev/null and b/Project/bin/strategy/CrawlStrategyFactory.class differ diff --git a/Project/bin/strategy/CsdnBlogStrategy.class b/Project/bin/strategy/CsdnBlogStrategy.class new file mode 100644 index 0000000..183663e Binary files /dev/null and b/Project/bin/strategy/CsdnBlogStrategy.class differ diff --git a/Project/bin/strategy/DangDangStrategy.class b/Project/bin/strategy/DangDangStrategy.class new file mode 100644 index 0000000..89efe74 Binary files /dev/null and b/Project/bin/strategy/DangDangStrategy.class differ diff --git a/Project/bin/strategy/MovieStrategy.class b/Project/bin/strategy/MovieStrategy.class new file mode 100644 index 0000000..fd8d3d9 Binary files /dev/null and b/Project/bin/strategy/MovieStrategy.class differ diff --git a/Project/bin/strategy/StatsStrategy.class b/Project/bin/strategy/StatsStrategy.class new file mode 100644 index 0000000..9316bc3 Binary files /dev/null and b/Project/bin/strategy/StatsStrategy.class differ diff --git a/Project/bin/strategy/Train12306Strategy.class b/Project/bin/strategy/Train12306Strategy.class new file mode 100644 index 0000000..660e372 Binary files /dev/null and b/Project/bin/strategy/Train12306Strategy.class differ diff --git a/Project/bin/strategy/WeatherStrategy.class b/Project/bin/strategy/WeatherStrategy.class new file mode 100644 index 0000000..15fbce1 Binary files /dev/null and b/Project/bin/strategy/WeatherStrategy.class differ diff --git a/Project/bin/view/CrawlerView.class b/Project/bin/view/CrawlerView.class new file mode 100644 index 0000000..8ebfeb9 Binary files /dev/null and b/Project/bin/view/CrawlerView.class differ diff --git a/Project/command/Command.java b/Project/command/Command.java new file mode 100644 index 0000000..ceba9c1 --- /dev/null +++ b/Project/command/Command.java @@ -0,0 +1,10 @@ +package command; + +import model.CrawlResult; +import exception.CrawlerException; +import java.util.List; + +public interface Command { + List execute() throws CrawlerException; + String getName(); +} \ No newline at end of file diff --git a/Project/command/CommandInvoker.java b/Project/command/CommandInvoker.java new file mode 100644 index 0000000..9816d78 --- /dev/null +++ b/Project/command/CommandInvoker.java @@ -0,0 +1,48 @@ +package command; + +import model.CrawlResult; +import exception.CrawlerException; +import view.CrawlerView; + +import java.util.ArrayList; +import java.util.List; + +public class CommandInvoker { + private final List commands; + private final CrawlerView view; + + public CommandInvoker(CrawlerView view) { + this.commands = new ArrayList<>(); + this.view = view; + } + + public void addCommand(Command command) { + commands.add(command); + } + + public List executeAll() throws CrawlerException { + List allResults = new ArrayList<>(); + + for (Command command : commands) { + view.showHeader("执行命令: " + command.getName()); + try { + List results = command.execute(); + allResults.addAll(results); + } catch (CrawlerException e) { + view.showError("命令 " + command.getName() + " 执行失败: " + e.getMessage()); + throw e; + } + view.showLine(); + } + + return allResults; + } + + public void clearCommands() { + commands.clear(); + } + + public int getCommandCount() { + return commands.size(); + } +} \ No newline at end of file diff --git a/Project/command/CommandWrapper.java b/Project/command/CommandWrapper.java new file mode 100644 index 0000000..e1f6456 --- /dev/null +++ b/Project/command/CommandWrapper.java @@ -0,0 +1,44 @@ +package command; + +import exception.CrawlerException; +import model.ResultContainer; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +public class CommandWrapper { + private final String name; + private final Supplier> action; + private final Function formatter; + + private CommandWrapper(String name, Supplier> action, + Function formatter) { + this.name = name; + this.action = action; + this.formatter = formatter; + } + + public static CommandWrapper create(String name, + Supplier> action) { + return new CommandWrapper<>(name, action, Object::toString); + } + + public static CommandWrapper create(String name, + Supplier> action, + Function formatter) { + return new CommandWrapper<>(name, action, formatter); + } + + public ResultContainer execute() { + return action.get(); + } + + public String getName() { + return name; + } + + public String format(T result) { + return formatter.apply(result); + } +} \ No newline at end of file diff --git a/Project/command/CrawlCommand.java b/Project/command/CrawlCommand.java new file mode 100644 index 0000000..05b27c0 --- /dev/null +++ b/Project/command/CrawlCommand.java @@ -0,0 +1,244 @@ +package command; + +import model.CrawlResult; +import model.Statistics; +import model.ResultContainer; +import strategy.CrawlStrategy; +import exception.CrawlerException; +import exception.NetworkException; +import exception.ParseException; +import view.CrawlerView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class CrawlCommand implements Command { + private static final Logger logger = LoggerFactory.getLogger(CrawlCommand.class); + + private final CrawlStrategy strategy; + private final int startPage; + private final int endPage; + private final String outputFile; + private final CrawlerView view; + private final int maxRetries; + private final int baseRetryDelay; + private final Statistics statistics; + private final int pageDelay; + + public CrawlCommand(CrawlStrategy strategy, int startPage, int endPage, + String outputFile, CrawlerView view) { + this(strategy, startPage, endPage, outputFile, view, 3, 1500, 1500); + } + + public CrawlCommand(CrawlStrategy strategy, int startPage, int endPage, + String outputFile, CrawlerView view, int maxRetries, int baseRetryDelay, int pageDelay) { + validateConstructorParams(strategy, startPage, endPage, view); + this.strategy = strategy; + this.startPage = startPage; + this.endPage = endPage; + this.outputFile = outputFile; + this.view = view; + this.maxRetries = maxRetries; + this.baseRetryDelay = baseRetryDelay; + this.pageDelay = pageDelay; + this.statistics = new Statistics<>("CrawlCommand_" + strategy.getSiteName()); + logger.debug("CrawlCommand 初始化: site={}, pages={}-{}, pageDelay={}ms", + strategy.getSiteName(), startPage, endPage, pageDelay); + } + + private void validateConstructorParams(CrawlStrategy strategy, int startPage, + int endPage, CrawlerView view) { + if (strategy == null) { + throw new IllegalArgumentException("Strategy cannot be null"); + } + if (startPage < 1) { + throw new IllegalArgumentException("Start page must be >= 1"); + } + if (endPage < startPage) { + throw new IllegalArgumentException("End page must be >= start page"); + } + if (view == null) { + throw new IllegalArgumentException("View cannot be null"); + } + } + + @Override + public List execute() throws CrawlerException { + List allResults = new ArrayList<>(); + int consecutiveFailures = 0; + logger.info("开始爬取: {} (页码 {} 到 {})", strategy.getSiteName(), startPage, endPage); + view.showMessage("开始爬取: " + strategy.getSiteName()); + view.showMessage("目标: " + (endPage - startPage + 1) + " 页数据,每页间隔 " + pageDelay + "ms"); + view.showLine(); + + for (int page = startPage; page <= endPage; page++) { + List pageResults = null; + boolean pageSuccess = false; + + for (int retry = 0; retry < maxRetries; retry++) { + try { + logger.info("正在爬取第 {} 页...", page); + view.showMessage("正在爬取第 " + page + " 页..."); + pageResults = strategy.crawlPage(page); + + if (pageResults != null && !pageResults.isEmpty()) { + consecutiveFailures = 0; + statistics.increment("success_pages"); + logger.debug("第 {} 页爬取成功,获取 {} 条数据", page, pageResults.size()); + pageSuccess = true; + break; + } + logger.warn("第 {} 页返回空结果", page); + view.showWarning("第 " + page + " 页返回空结果"); + + if (retry < maxRetries - 1) { + int delay = baseRetryDelay * (int) Math.pow(2, retry); + view.showMessage("等待 " + delay + "ms 后重试..."); + Thread.sleep(delay); + } + } catch (ParseException e) { + consecutiveFailures++; + statistics.increment("parse_failures"); + logger.error("第 {} 页解析失败 (尝试 {}/{}): {}", + page, retry + 1, maxRetries, e.getMessage()); + view.showError("解析失败: " + e.getMessage()); + + if (retry < maxRetries - 1) { + try { + int delay = baseRetryDelay * (int) Math.pow(2, retry); + view.showMessage("等待 " + delay + "ms 后重试..."); + Thread.sleep(delay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + logger.warn("爬取过程被中断"); + throw new CrawlerException("爬取被中断", ie); + } + } + } catch (IOException e) { + consecutiveFailures++; + statistics.increment("network_failures"); + logger.error("【网络异常】第 {} 页网络请求失败 (尝试 {}/{}): {}", + page, retry + 1, maxRetries, e.getMessage()); + view.showError("【网络异常】" + e.getMessage()); + + String exceptionType = getNetworkExceptionType(e); + if (exceptionType != null) { + logger.error("【断网检测】检测到网络中断类型: {}", exceptionType); + view.showError("【断网检测】" + exceptionType); + } + + if (consecutiveFailures >= 2) { + logger.error("【断网检测】连续失败2次,判定为网络异常,立即停止爬取"); + view.showError("【断网检测】连续失败2次,判定为网络异常,停止爬取"); + throw new NetworkException("【断网异常】网络请求连续失败,请检查网络连接状态: " + e.getMessage(), e); + } + + if (retry < maxRetries - 1) { + try { + int delay = baseRetryDelay * (int) Math.pow(2, retry); + view.showMessage("等待 " + delay + "ms 后重试..."); + Thread.sleep(delay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + logger.warn("爬取过程被中断"); + throw new NetworkException("爬取被中断", ie); + } + } else { + throw new NetworkException("【网络连接失败】网络请求失败,请检查网络连接: " + e.getMessage(), e); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.warn("爬取过程被中断"); + throw new CrawlerException("爬取被中断", e); + } + } + + if (pageSuccess && pageResults != null) { + allResults.addAll(pageResults); + view.showSuccess("Page " + page + ": " + pageResults.size() + " items"); + statistics.increment("total_items", pageResults.size()); + } + + if (page < endPage && pageSuccess) { + try { + logger.debug("翻页间隔等待 {}ms", pageDelay); + Thread.sleep(pageDelay); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.warn("翻页等待被中断"); + break; + } + } + + if (allResults.size() >= 200) { + logger.info("已达到最大数据量 200 条,停止爬取"); + view.showWarning("已达到最大数据量 200 条,停止爬取"); + break; + } + } + + view.showLine(); + view.showMessage("爬取完成,共获取 " + allResults.size() + " 条数据"); + statistics.record("total_items", allResults.size()); + logger.info("爬取完成: {} 共获取 {} 条数据", strategy.getSiteName(), allResults.size()); + + if (allResults.isEmpty()) { + view.showError("警告: 未能获取到任何数据!"); + logger.error("未能获取到任何数据"); + } + + return allResults; + } + + @Override + public String getName() { + return "CrawlCommand[" + strategy.getSiteName() + "]"; + } + + public String getOutputFile() { + return outputFile; + } + + public CrawlStrategy getStrategy() { + return strategy; + } + + public Statistics getStatistics() { + return statistics; + } + + private String getNetworkExceptionType(IOException e) { + Throwable cause = e.getCause(); + if (cause instanceof java.net.ConnectException) { + return "【网络连接失败】无法连接到服务器,请检查网络连接"; + } else if (cause instanceof java.net.UnknownHostException) { + return "【DNS解析失败】无法解析域名,请检查网络或DNS设置"; + } else if (cause instanceof java.net.NoRouteToHostException) { + return "【路由不可达】无法到达目标主机,请检查网络连接"; + } else if (cause instanceof java.net.SocketException) { + return "【Socket异常】网络连接异常,请检查网络状态"; + } else if (cause instanceof java.net.SocketTimeoutException) { + return "【连接超时】网络请求超时,请检查网络稳定性"; + } + + String message = e.getMessage(); + if (message != null) { + if (message.contains("Connection refused")) { + return "【连接被拒绝】服务器拒绝连接,请检查网络或稍后重试"; + } else if (message.contains("UnknownHost")) { + return "【域名解析失败】无法解析域名,请检查网络连接"; + } else if (message.contains("timeout")) { + return "【请求超时】网络请求超时,请检查网络稳定性"; + } else if (message.contains("Network is unreachable")) { + return "【网络不可达】网络连接不可用,请检查网络状态"; + } else if (message.contains("Connection reset")) { + return "【连接重置】连接被服务器重置,请检查网络"; + } + } + + return null; + } +} \ No newline at end of file diff --git a/Project/command/RetryCommand.java b/Project/command/RetryCommand.java new file mode 100644 index 0000000..8601fd9 --- /dev/null +++ b/Project/command/RetryCommand.java @@ -0,0 +1,53 @@ +package command; + +import model.CrawlResult; +import exception.CrawlerException; +import view.CrawlerView; + +import java.util.List; + +public class RetryCommand implements Command { + private final Command originalCommand; + private final int maxRetries; + private final CrawlerView view; + + public RetryCommand(Command originalCommand, int maxRetries, CrawlerView view) { + this.originalCommand = originalCommand; + this.maxRetries = maxRetries; + this.view = view; + } + + @Override + public List execute() throws CrawlerException { + CrawlerException lastException = null; + + for (int attempt = 1; attempt <= maxRetries; attempt++) { + try { + view.showMessage("执行命令: " + originalCommand.getName() + + " (尝试 " + attempt + "/" + maxRetries + ")"); + return originalCommand.execute(); + } catch (CrawlerException e) { + lastException = e; + view.showError("命令执行失败: " + e.getMessage()); + + if (attempt < maxRetries) { + view.showMessage("等待重试..."); + try { + Thread.sleep(1000 * attempt); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + break; + } + } + } + } + + view.showError("命令执行失败,已达到最大重试次数 " + maxRetries); + throw lastException; + } + + @Override + public String getName() { + return "Retry[" + originalCommand.getName() + "]"; + } +} \ No newline at end of file diff --git a/Project/controller/CrawlerController.java b/Project/controller/CrawlerController.java new file mode 100644 index 0000000..4e58630 --- /dev/null +++ b/Project/controller/CrawlerController.java @@ -0,0 +1,331 @@ +package controller; + +import model.CrawlResult; +import model.Statistics; +import model.ResultContainer; +import repository.Repository; +import command.Command; +import command.CommandInvoker; +import command.CrawlCommand; +import command.RetryCommand; +import strategy.CrawlStrategy; +import strategy.DangDangStrategy; +import strategy.WeatherStrategy; +import strategy.MovieStrategy; +import strategy.Train12306Strategy; +import strategy.CsdnBlogStrategy; +import exception.CrawlerException; +import exception.NetworkException; +import view.CrawlerView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.List; + +public class CrawlerController { + private static final Logger logger = LoggerFactory.getLogger(CrawlerController.class); + + private final CrawlerView view; + private final CommandInvoker invoker; + private final Repository dataRepository; + private final Statistics statistics; + + public CrawlerController(CrawlerView view) { + if (view == null) { + throw new IllegalArgumentException("View cannot be null"); + } + this.view = view; + this.invoker = new CommandInvoker(view); + this.dataRepository = new Repository<>(CrawlResult.class); + this.statistics = new Statistics<>("CrawlerController"); + logger.info("CrawlerController 初始化完成"); + } + + public ResultContainer> runDangDangCrawler() { + logger.info("开始执行当当网图书爬虫"); + statistics.record("dangdang_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new DangDangStrategy(); + Command command = new CrawlCommand(strategy, 1, 5, "dangdang_books.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("当当网爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "dangdang_books.txt", "当当网图书"); + } catch (NetworkException e) { + logger.error("【断网异常】当当网爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】当当网爬虫网络请求失败: " + e.getMessage()); + statistics.increment("dangdang_failures"); + return ResultContainer.failure("【断网异常】当当网爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("当当网爬虫执行失败: {}", e.getMessage()); + statistics.increment("dangdang_failures"); + return ResultContainer.failure("当当网爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runWeatherCrawler() { + logger.info("开始执行中国天气网爬虫"); + statistics.record("weather_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new WeatherStrategy(); + Command command = new CrawlCommand(strategy, 1, 14, "weather_cities.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("中国天气网爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "weather_cities.txt", "中国天气网"); + } catch (NetworkException e) { + logger.error("【断网异常】中国天气网爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】中国天气网爬虫网络请求失败: " + e.getMessage()); + statistics.increment("weather_failures"); + return ResultContainer.failure("【断网异常】中国天气网爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("中国天气网爬虫执行失败: {}", e.getMessage()); + statistics.increment("weather_failures"); + return ResultContainer.failure("天气网爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runMaoyanMovieCrawler() { + logger.info("开始执行猫眼电影爬虫"); + statistics.record("maoyan_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new MovieStrategy(); + Command command = new CrawlCommand(strategy, 1, 10, "maoyan_top100.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("猫眼电影爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "maoyan_top100.txt", "猫眼电影"); + } catch (NetworkException e) { + logger.error("【断网异常】猫眼电影爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】猫眼电影爬虫网络请求失败: " + e.getMessage()); + statistics.increment("maoyan_failures"); + return ResultContainer.failure("【断网异常】猫眼电影爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("猫眼电影爬虫执行失败: {}", e.getMessage()); + statistics.increment("maoyan_failures"); + return ResultContainer.failure("猫眼电影爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runTrain12306Crawler() { + logger.info("开始执行12306火车票爬虫"); + statistics.record("12306_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new Train12306Strategy(); + Command command = new CrawlCommand(strategy, 1, 10, "train_12306.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("12306爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "train_12306.txt", "12306火车票"); + } catch (NetworkException e) { + logger.error("【断网异常】12306爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】12306爬虫网络请求失败: " + e.getMessage()); + statistics.increment("12306_failures"); + return ResultContainer.failure("【断网异常】12306爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("12306爬虫执行失败: {}", e.getMessage()); + statistics.increment("12306_failures"); + return ResultContainer.failure("12306爬虫失败: " + e.getMessage(), e); + } + } + + public ResultContainer> runCsdnBlogCrawler() { + logger.info("开始执行CSDN博客爬虫"); + statistics.record("csdn_start", System.currentTimeMillis()); + try { + CrawlStrategy strategy = new CsdnBlogStrategy(); + Command command = new CrawlCommand(strategy, 1, 15, "csdn_blogs.txt", view); + Command retryCommand = new RetryCommand(command, 3, view); + + List results = retryCommand.execute(); + logger.info("CSDN博客爬虫执行成功,获取 {} 条数据", results.size()); + return processResults(results, "csdn_blogs.txt", "CSDN博客"); + } catch (NetworkException e) { + logger.error("【断网异常】CSDN博客爬虫网络请求失败: {}", e.getMessage()); + view.showError("【断网异常】CSDN博客爬虫网络请求失败: " + e.getMessage()); + statistics.increment("csdn_failures"); + return ResultContainer.failure("【断网异常】CSDN博客爬虫失败 - 网络连接异常: " + e.getMessage(), e); + } catch (CrawlerException e) { + logger.error("CSDN博客爬虫执行失败: {}", e.getMessage()); + statistics.increment("csdn_failures"); + return ResultContainer.failure("CSDN博客爬虫失败: " + e.getMessage(), e); + } + } + + private ResultContainer> processResults(List results, + String filename, String siteName) { + if (results == null || results.isEmpty()) { + logger.warn("{} 爬取结果为空", siteName); + return ResultContainer.failure(siteName + "爬取结果为空"); + } + + for (CrawlResult result : results) { + dataRepository.add(result); + } + + saveToFile(results, filename); + saveToJson(results, filename.replace(".txt", ".json")); + + statistics.record(siteName + "_count", results.size()); + statistics.record(siteName + "_end", System.currentTimeMillis()); + statistics.increment("total_items", results.size()); + + logger.info("{} 爬取完成,共 {} 条数据,已保存到 {}", siteName, results.size(), filename); + return ResultContainer.success(results, siteName + "爬取完成,共 " + results.size() + " 条数据"); + } + + public void runAllCrawlers() { + logger.info("开始执行所有爬虫"); + int successCount = 0; + int failCount = 0; + + ResultContainer> result; + + view.showHeader("当当网图书爬虫"); + result = runDangDangCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("中国天气网爬虫"); + result = runWeatherCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("猫眼电影爬虫"); + result = runMaoyanMovieCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("12306火车票爬虫"); + result = runTrain12306Crawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showHeader("CSDN博客爬虫"); + result = runCsdnBlogCrawler(); + if (result.isSuccess()) { + successCount++; + view.showSuccess(result.getMessage()); + } else { + failCount++; + view.showError(result.getMessage()); + } + + view.showLine(); + view.showMessage("所有爬虫执行完成"); + view.showMessage("成功: " + successCount + " 个"); + view.showMessage("失败: " + failCount + " 个"); + view.showMessage("总计采集数据: " + statistics.getCount("total_items") + " 条"); + + statistics.record("success_count", successCount); + statistics.record("fail_count", failCount); + logger.info("所有爬虫执行完成,成功: {},失败: {},总计数据: {}", + successCount, failCount, statistics.getCount("total_items")); + } + + public void saveToFile(List results, String filename) { + if (filename == null || filename.trim().isEmpty()) { + logger.error("文件名为空,无法保存"); + view.showError("文件名不能为空"); + return; + } + + try { + File file = new File(filename); + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); + } + + try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) { + writer.println("Title,Price,OriginalPrice,Discount,ImageUrl,Author"); + for (CrawlResult result : results) { + if (result != null) { + writer.println(result.toString()); + } + } + } + logger.info("文件保存成功: {}", filename); + view.showSuccess("文件保存成功: " + filename); + } catch (IOException e) { + logger.error("保存文件失败: {} - {}", filename, e.getMessage()); + view.showError("保存文件失败: " + filename + " (" + e.getMessage() + ")"); + } + } + + public void saveToJson(List results, String filename) { + if (filename == null || filename.trim().isEmpty()) { + logger.error("JSON文件名为空,无法保存"); + view.showError("文件名不能为空"); + return; + } + + try { + File file = new File(filename); + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); + } + + StringBuilder json = new StringBuilder(); + json.append("[\n"); + for (int i = 0; i < results.size(); i++) { + CrawlResult result = results.get(i); + if (result != null) { + json.append(" ").append(result.toJson()); + if (i < results.size() - 1) { + json.append(","); + } + json.append("\n"); + } + } + json.append("]"); + + try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) { + writer.write(json.toString()); + } + logger.info("JSON文件保存成功: {}", filename); + view.showSuccess("JSON文件保存成功: " + filename); + } catch (IOException e) { + logger.error("保存JSON文件失败: {} - {}", filename, e.getMessage()); + view.showError("保存JSON文件失败: " + filename + " (" + e.getMessage() + ")"); + } + } + + public Repository getDataRepository() { + return dataRepository; + } + + public Statistics getStatistics() { + return statistics; + } +} \ No newline at end of file diff --git a/Project/csdn_blogs.json b/Project/csdn_blogs.json new file mode 100644 index 0000000..cdbd744 --- /dev/null +++ b/Project/csdn_blogs.json @@ -0,0 +1,210 @@ +[ + {"title":"Python 鸭子类型:优雅的多态哲学,让代码更自由","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_92624912/article/details/160498689","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"从 for 循环到 yield:一文搞懂 Python 迭代器与生成器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161144162","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"2026年最新版Python安装和PyCharm安装教程(图文详细 附安装包)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_73467482/article/details/156511914","author":"CSDN用户 | 阅读 7.1k"}, + {"title":"【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161457480","author":"CSDN用户 | 阅读 44"}, + {"title":"python基于vue的流浪动物收养系统志愿者设计与开发django flask pycharm","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/QQ1963288475/article/details/156946558","author":"CSDN用户 | 阅读 978"}, + {"title":"Python 中的 @property:像访问属性一样调用方法","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161202644","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"【pip / conda / uv】换源大全:2026 国内镜像最新地址,一张表搞定所有 【Python】安装卡顿","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_73472828/article/details/160525215","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"Python流程控制:break与continue语句的区别与应用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161098938","author":"CSDN用户 | 阅读 6.7k"}, + {"title":"从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41187124/article/details/155500568","author":"CSDN用户 | 阅读 2.2w"}, + {"title":"Python 操作金仓数据库的完全指南(上篇):连接管理与高可用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617026","author":"CSDN用户 | 阅读 1.5w"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"Python+AI智能体(Agent)零基础入门全攻略:原理、架构、手搓代码与实战落地","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_94956987/article/details/160419420","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"一篇看懂 Python 标识符:命名规则 + 规范 + 避坑指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80026901/article/details/160413181","author":"CSDN用户 | 阅读 2.2k"}, + {"title":"【2026 最新】Python 与 PyCharm 详细下载安装教程 带图展示(Windows 版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80035882/article/details/157432536","author":"CSDN用户 | 阅读 8.7k"}, + {"title":"【Python】异常处理:从基础到进阶","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2303_79015671/article/details/144533265","author":"CSDN用户 | 阅读 6.2k"}, + {"title":"Python元编程:非科班转码者的入门指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159760302","author":"CSDN用户 | 阅读 1.2w"}, + {"title":"Web自动化之Selenium 超详细教程(python)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_73953650/article/details/145730531","author":"CSDN用户 | 阅读 2.3w"}, + {"title":"【Dify】使用 python 调用 Dify 的 API 服务,查看“知识检索”返回内容,用于前端溯源展示","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wsLJQian/article/details/157470958","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"Python数据统计完全指南:从入门到实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/sixpp/article/details/152516371","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"Python流程控制:while循环嵌套与死循环避免技巧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161001777","author":"CSDN用户 | 阅读 5.8k"}, + {"title":"Python 正则表达式入门:从匹配手机号到提取文本内容","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161200803","author":"CSDN用户 | 阅读 7.5k"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"13801黄大年茶思屋第138期(基础软件领域第三期)第1题:混部场景下高性能、低底噪的极简I/O QoS管控技术","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/coreopt/article/details/161459642","author":"CSDN用户 | 阅读 359"}, + {"title":"2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/user340/article/details/158102252","author":"CSDN用户 | 阅读 7.1k"}, + {"title":"Python 鸭子类型:优雅的多态哲学,让代码更自由","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_92624912/article/details/160498689","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44647100/article/details/160017406","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"2026年电脑网页游戏盘点_传奇网页游戏推荐","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2601_96116927/article/details/161459833","author":"CSDN用户 | 阅读 155"}, + {"title":"Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617170","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"Python 中的 @property:像访问属性一样调用方法","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161202644","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"AI入门踩坑实录:我换了3种语言才敢说,Python真的是入门唯一选择吗?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Dreamy_zsy/article/details/160308823","author":"CSDN用户 | 阅读 3.7w"}, + {"title":"AutoGPT+Python:让AI智能体自动完成复杂任务的终极指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_81152266/article/details/158353859","author":"CSDN用户 | 阅读 4.5k"}, + {"title":"Windows本地部署Hermes Agent实录!WSL+Python部署路线详细步骤","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/baidu_41773235/article/details/160404260","author":"CSDN用户 | 阅读 761"}, + {"title":"用 uv 轻松掌管你的 Python 宇宙:告别版本混乱,一键设置全局解释器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_51553749/article/details/157765585","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"Python从0到100完整学习指南(必看导航)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57545130/article/details/158382640","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"Fiddler抓包实战:5分钟搞定同花顺APP股票数据API获取(附Python解析代码)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_29211309/article/details/158247385","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"Python与容器化:Docker和Kubernetes实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159630044","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"基于Python的医院运营数据可视化平台:设计、实现与应用(上)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/kkiron/article/details/145614002","author":"CSDN用户 | 阅读 4.4k"}, + {"title":"Python AI入门:从Hello World到图像分类","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/guoyizhongxing/article/details/159324438","author":"CSDN用户 | 阅读 5.7k"}, + {"title":"python通过API调用Coze智能体学习","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/GHL284271090/article/details/160994302","author":"CSDN用户 | 阅读 752"}, + {"title":"从 for 循环到 yield:一文搞懂 Python 迭代器与生成器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Nova_511/article/details/161144162","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"Python 3.12(于2023年10月2日发布)是Python的最新稳定版本之一,相比此前版本(如3.11、3.10等)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/blog_programb/article/details/158616716","author":"CSDN用户 | 阅读 838"}, + {"title":"本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161452150","author":"CSDN用户 | 阅读 151"}, + {"title":"还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44647100/article/details/160017406","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Day 75:【99天精通Python】人工智能应用 - 接入 OpenAI API - 给程序装上大脑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_52694742/article/details/157074239","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"在线浏览“秀人网合集”的新思路:30 行 Python 把封面图链接秒变本地可点图库","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/cheweituya/article/details/157251686","author":"CSDN用户 | 阅读 10.4w"}, + {"title":"一文读懂IP路由:从设备架构到核心技术","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_88096536/article/details/161458018","author":"CSDN用户 | 阅读 348"}, + {"title":"Python流程控制:for循环与range函数的搭配使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161067521","author":"CSDN用户 | 阅读 7.4k"}, + {"title":"2026最新:国内直连调用Grok-4.3与免费Gemini-2.5-flash-lite(无需翻墙/OpenClaw+PyCharm+Python全场景)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/nmdbbzcl/article/details/160992672","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"【Python 爬虫实战】抓取 BOSS 直聘","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_87126002/article/details/157483743","author":"CSDN用户 | 阅读 3.2k"}, + {"title":"Python中一切皆对象:深入理解Python的对象模型","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_92624912/article/details/155100575","author":"CSDN用户 | 阅读 4.6k"}, + {"title":"Python与云计算:非科班转码者的指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159629885","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"【Scapy】Scapy详细安装教程、功能介绍、快速上手","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Himan21/article/details/149858432","author":"CSDN用户 | 阅读 4.0k"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"Python 八股文汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Derrick__1/article/details/158806665","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2302_78391795/article/details/150619723","author":"CSDN用户 | 阅读 4.1w"}, + {"title":"【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Clay_K/article/details/148401006","author":"CSDN用户 | 阅读 4.0k"}, + {"title":"【Js逆向 python】Web JS 逆向全体系详细解释","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80637449/article/details/159132537","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"对python的再认识-基于数据结构进行-a007-集合-CURD","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/BECOMEviolet/article/details/157912640","author":"CSDN用户 | 阅读 920"}, + {"title":"2026年Python就业市场分析:非科班转码者的机会与挑战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159729470","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"Python最全面复习:从入门到精通(2026年)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_90715893/article/details/161239082","author":"CSDN用户 | 阅读 972"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"Python与边缘计算:非科班转码者的指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/no1coder/article/details/159675671","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_83233809/article/details/161454731","author":"CSDN用户 | 阅读 4"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617170","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"从零实现一个轻量级向量搜索引擎(Python 版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/picture_share/article/details/161332729","author":"CSDN用户 | 阅读 943"}, + {"title":"Claude-Code-python 前端改造项目工作流程详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_42878111/article/details/160550285","author":"CSDN用户 | 阅读 864"}, + {"title":"Python 爬虫实战:Selenium 批量爬取百度图片(逐行代码超详细解析)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_66822255/article/details/161024571","author":"CSDN用户 | 阅读 999"}, + {"title":"Python流程控制:while循环嵌套与死循环避免技巧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161001777","author":"CSDN用户 | 阅读 5.8k"}, + {"title":"【2026最新Python+AI入门指南】:从零基础到实操落地,避开90%新手坑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/user340/article/details/157736821","author":"CSDN用户 | 阅读 7.9k"}, + {"title":"VS code研发工具配置使用,包括python、git的配置","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/hurong0000/article/details/160075246","author":"CSDN用户 | 阅读 665"}, + {"title":"Python 3.14 安装教程:新手友好版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_69824302/article/details/153417024","author":"CSDN用户 | 阅读 5.0k"}, + {"title":"Java安全-CC链 | CC3","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_93871563/article/details/160991726","author":"CSDN用户 | 阅读 3.1k"}, + {"title":"2.python加解密实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57385165/article/details/157332452","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Python 开发中“使用 read() 读取大文件导致内存溢出” 问题详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/jjj_web/article/details/160972045","author":"CSDN用户 | 阅读 811"}, + {"title":"Python 中的 sqlite3 模块:轻量级数据库的完美搭档","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_40266856/article/details/156835297","author":"CSDN用户 | 阅读 3.3k"}, + {"title":"Blender 3.x Python 脚本编程(一)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wizardforcel/article/details/158378453","author":"CSDN用户 | 阅读 3.0k"}, + {"title":"超越Python:下一步该学什么编程语言?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_56135967/article/details/157555149","author":"CSDN用户 | 阅读 1000"}, + {"title":"一文吃透贝叶斯算法:从数学原理到 Python 代码实战(附完整可运行案例)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_74398756/article/details/158664045","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/taotao_guiwang/article/details/156749455","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"Python流程控制:while循环嵌套与死循环避免技巧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/161001777","author":"CSDN用户 | 阅读 5.8k"}, + {"title":"Python AI入门:从Hello World到图像分类","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/guoyizhongxing/article/details/159324438","author":"CSDN用户 | 阅读 5.7k"}, + {"title":"Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/160617170","author":"CSDN用户 | 阅读 1.6w"}, + {"title":"实测CSDN AI数字营销会员:创作者效率与曝光的双重提升体验报告","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161451272","author":"CSDN用户 | 阅读 62"}, + {"title":"2.python加解密实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57385165/article/details/157332452","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Python 测试实战指南:单元、集成、端到端测试边界对比、发版焦虑破解与电商下单链路优化","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/windowshht/article/details/159627343","author":"CSDN用户 | 阅读 853"}, + {"title":"【课程设计/毕业设计】基于Python的外卖配送分析与可视化系统的设计与实现【附源码、数据库、万字文档】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_91703026/article/details/158585314","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"【Python 爬虫实战】抓取 BOSS 直聘","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_87126002/article/details/157483743","author":"CSDN用户 | 阅读 3.2k"}, + {"title":"一文读懂IP路由:从设备架构到核心技术","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_88096536/article/details/161458018","author":"CSDN用户 | 阅读 354"}, + {"title":"还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44647100/article/details/160017406","author":"CSDN用户 | 阅读 1.1k"}, + {"title":"Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/chen_si_shang_/article/details/161293640","author":"CSDN用户 | 阅读 850"}, + {"title":"Python流程控制:if-else与if-elif-else嵌套使用","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/AIRoses/article/details/160911021","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"计算机毕业设计Python+AI大模型空气质量预测分析(可定制城市) 空气质量可视化 空气质量爬虫 机器学习 深度学习 大 数据毕业设计","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/spark2022/article/details/161241598","author":"CSDN用户 | 阅读 870"}, + {"title":"计算机视觉工具:Python+OpenCV的常用函数汇总","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/COLLINSXU/article/details/160522364","author":"CSDN用户 | 阅读 1.8w"}, + {"title":"2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/user340/article/details/158102252","author":"CSDN用户 | 阅读 7.1k"}, + {"title":"【Python】基础语法入门(一)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78257800/article/details/154902322","author":"CSDN用户 | 阅读 6.3k"}, + {"title":"Playwright Python Windows 下 headful Chromium 崩溃排查经验分享","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/zhangshaohua1603/article/details/158350679","author":"CSDN用户 | 阅读 1.0k"}, + {"title":"Python中秋月圆夜:手把手实现月相可视化,用代码赏千里共婵娟","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_55394328/article/details/152602293","author":"CSDN用户 | 阅读 3.1w"}, + {"title":"【机器学习第三期(Python)】CatBoost 方法原理详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44246618/article/details/149022812","author":"CSDN用户 | 阅读 2.2k"}, + {"title":"Python之三大基本库——Pandas(1)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_61746796/article/details/153201960","author":"CSDN用户 | 阅读 4.5k"}, + {"title":"海洋光学(Ocean Insight,原 Ocean Optics)确实提供了面向 Python 的官方封装库,主要包括 OceanDirect(底层硬件通信)和基于其封装的高层库(如pyocean/","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/womrenet/article/details/156466272","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161132354","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_62043600/article/details/160531542","author":"CSDN用户 | 阅读 5.1k"}, + {"title":"java中的进程的详细解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yu____yuan/article/details/161049661","author":"CSDN用户 | 阅读 818"}, + {"title":"懂你所需,利爪随行:MateClaw 正式开源,补齐 Java 生态的 AI Agent 拼图","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/bufegar0/article/details/159846780","author":"CSDN用户 | 阅读 2.0k"}, + {"title":"我的workflow设置居然被赞扬了","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/stereohomology/article/details/161384575","author":"CSDN用户 | 阅读 477"}, + {"title":"【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161347182","author":"CSDN用户 | 阅读 682"}, + {"title":"Harness实战指南,在Java Spring Boot项目中规范落地OpenSpec+Claude Code","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/u013970991/article/details/159902907","author":"CSDN用户 | 阅读 1.9k"}, + {"title":"用 python 和 java 分别写出10道经典题","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2501_94434623/article/details/160901197","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"基于Java Web的医疗诊治系统的设计与实现 --毕设附源码42197","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/VX_DZbishe/article/details/157900907","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"字节跳动官网 bytedance.com 完整工程复刻","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161459714","author":"CSDN用户 | 阅读 31"}, + {"title":"Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/chen_si_shang_/article/details/161293640","author":"CSDN用户 | 阅读 850"}, + {"title":"Java 大视界 -- Java+Spark 构建企业级用户画像平台:从数据采集到标签输出全流程(437)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/atgfg/article/details/156062867","author":"CSDN用户 | 阅读 5.3k"}, + {"title":"语义解析革命:飞算JavaAI三层架构重塑企业级代码生成链路","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_74385041/article/details/150289635","author":"CSDN用户 | 阅读 9.7k"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89723786/article/details/157733289","author":"CSDN用户 | 阅读 607"}, + {"title":"Java 大视界 -- 基于 Java+Flink 构建实时风控规则引擎:动态规则配置与热更新(446)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/atgfg/article/details/157333442","author":"CSDN用户 | 阅读 3.3k"}, + {"title":"第三篇:《手把手搭建Selenium WebDriver测试环境(Java/Python)》","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_45239623/article/details/160394399","author":"CSDN用户 | 阅读 785"}, + {"title":"基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_80863610/article/details/151295847","author":"CSDN用户 | 阅读 31.8w"}, + {"title":"Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/lilinhai548/article/details/156422566","author":"CSDN用户 | 阅读 4.1k"}, + {"title":"【Linux系统】线程(上)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Miun123/article/details/161121946","author":"CSDN用户 | 阅读 652"}, + {"title":"Java 连接 Elasticsearch 8.x 安全模式实战:证书校验与 ApiKey 认证全解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/hdk5855/article/details/158583924","author":"CSDN用户 | 阅读 985"}, + {"title":"【C++】 继承与多态(中)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_95649725/article/details/161196506","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"Linux C++ 高并发编程:从原理到手撕,线程池全链路深度解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_91389547/article/details/160339478","author":"CSDN用户 | 阅读 3.6k"}, + {"title":"开发一个好用的真全屏手持弹幕微信小程序(一)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Mr_BT/article/details/161459391","author":"CSDN用户 | 阅读 94"}, + {"title":"【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161132354","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_62043600/article/details/160531542","author":"CSDN用户 | 阅读 5.1k"}, + {"title":"Java实习模拟面试之多益网络苏州二面:聚焦游戏服务端开发、Redis高可用与JVM线程池深度追问","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_84764726/article/details/157393528","author":"CSDN用户 | 阅读 1.0k"}, + {"title":"Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89723786/article/details/157733289","author":"CSDN用户 | 阅读 607"}, + {"title":"【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161457480","author":"CSDN用户 | 阅读 45"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_87298751/article/details/159087816","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2302_79751907/article/details/149275967","author":"CSDN用户 | 阅读 3.7k"}, + {"title":"Java:猜数字游戏","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_94683681/article/details/161258233","author":"CSDN用户 | 阅读 5.5k"}, + {"title":"Java 开发者如何搞定百度地图 SN 权限签名实践-以搜索2.0接口为例","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yelangkingwuzuhu/article/details/151289695","author":"CSDN用户 | 阅读 9.5k"}, + {"title":"Bun替代Nodejs,JavaScrpit运行新环境-Bun,更快、更现代的开发体验","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_57874805/article/details/150647891","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"Java Stream妙用:Collectors.toMap详解,轻松实现集合转一对一Map","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41840843/article/details/158383692","author":"CSDN用户 | 阅读 3.9k"}, + {"title":"Linux:基础指令(二)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/161036706","author":"CSDN用户 | 阅读 3.4k"}, + {"title":"2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Moss_co/article/details/148425265","author":"CSDN用户 | 阅读 3.4w"}, + {"title":"C++快速上手java备战期末考——初识java","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2502_94353935/article/details/160992548","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"Java+Vue开发者必看:Open Code、Claude Code、Trae、Coze 四大AI开发工具深度测评(含免费/付费对比)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_35452726/article/details/159687764","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_22903677/article/details/160000361","author":"CSDN用户 | 阅读 878"}, + {"title":"Javascript.8——ES6【Promise的静态方法】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_63215361/article/details/157614292","author":"CSDN用户 | 阅读 877"}, + {"title":"地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_83233809/article/details/161454731","author":"CSDN用户 | 阅读 4"}, + {"title":"2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Moss_co/article/details/148425265","author":"CSDN用户 | 阅读 3.4w"}, + {"title":"Java 大视界 -- Java 大数据机器学习模型在金融风险管理体系构建与风险防范能力提升中的应用(435)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/atgfg/article/details/155947715","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"Java——标准序列化机制","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/cold___play/article/details/161107932","author":"CSDN用户 | 阅读 3.5k"}, + {"title":"Java前缀和算法题目练习","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89019969/article/details/151975418","author":"CSDN用户 | 阅读 3.1k"}, + {"title":"Python 入门教程系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_30720461/article/details/161396374","author":"CSDN用户 | 阅读 1.3k"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"Java GC 面试必问三件套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2504_94294476/article/details/160668120","author":"CSDN用户 | 阅读 728"}, + {"title":"突破平台限制:iOS设备运行Minecraft Java版完全指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/gitblog_00466/article/details/157378543","author":"CSDN用户 | 阅读 2.0w"}, + {"title":"企业级 Java 登录注册系统构建指南(附核心代码与配置)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_67187271/article/details/151104099","author":"CSDN用户 | 阅读 1.9k"}, + {"title":"Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_89723786/article/details/157733289","author":"CSDN用户 | 阅读 607"}, + {"title":"Adoptium Temurin JDK 下载","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_42346831/article/details/148632858","author":"CSDN用户 | 阅读 5.2k"}, + {"title":"HarmonyOS ArkWeb 系列之precompileJavaScript:提前编译 JS 脚本,告别解析等待","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_33681891/article/details/161185190","author":"CSDN用户 | 阅读 1.5w"}, + {"title":"Java+SpringAI企业级实战项目完整官方文档(生产终版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wbkang/article/details/160586573","author":"CSDN用户 | 阅读 4.0k"}, + {"title":"高级java每日一道面试题-2025年12月31日-实战篇[Docker]-Docker Swarm 的 Routing Mesh 是如何工作的?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_43071699/article/details/161195524","author":"CSDN用户 | 阅读 792"}, + {"title":"基于Java标准库读取CSV实现天地图POI分类快速导入PostGIS数据库实战","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yelangkingwuzuhu/article/details/149454785","author":"CSDN用户 | 阅读 9.3k"}, + {"title":"【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161347182","author":"CSDN用户 | 阅读 682"}, + {"title":"JavaScript异步编程 Async/Await 使用详解:从原理到最佳实践","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/lhmyy521125/article/details/147932219","author":"CSDN用户 | 阅读 8.0k"}, + {"title":"java中的进程的详细解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yu____yuan/article/details/161049661","author":"CSDN用户 | 阅读 818"}, + {"title":"【C++】 继承与多态(中)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_95649725/article/details/161196506","author":"CSDN用户 | 阅读 1.8k"}, + {"title":"【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161347182","author":"CSDN用户 | 阅读 682"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"智能写字机器人开发全解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_88863003/article/details/161457761","author":"CSDN用户 | 阅读 105"}, + {"title":"C++_string增删查改模拟实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/155094868","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"Java——标准序列化机制","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/cold___play/article/details/161107932","author":"CSDN用户 | 阅读 3.5k"}, + {"title":"【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_62043600/article/details/160531542","author":"CSDN用户 | 阅读 5.1k"}, + {"title":"Java之泛型","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/wmh_1234567/article/details/141270616","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"苍穹外卖 项目最终总结","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2401_88612756/article/details/161456400","author":"CSDN用户 | 阅读 280"}, + {"title":"【Java 开发日记】设计一个支持万人同时抢购商品的秒杀系统?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_87298751/article/details/156869453","author":"CSDN用户 | 阅读 6.9k"}, + {"title":"【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161132354","author":"CSDN用户 | 阅读 2.8k"}, + {"title":"模仿淘宝购物系统的Java Web前端项目(开源项目)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/rej177/article/details/125535688","author":"CSDN用户 | 阅读 1.4w"}, + {"title":"【C++】C++——类的默认成员函数(构造、析构、拷贝构造函数)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/zore__/article/details/160190541","author":"CSDN用户 | 阅读 1.9k"}, + {"title":"学生职业选择对cpp/c++以及后端java go的迷茫","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_52259848/article/details/158290665","author":"CSDN用户 | 阅读 970"}, + {"title":"大模型开发 - 零手写 AI Agent:深入理解 ReAct 模式与 Java 实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/yangshangwei/article/details/157644609","author":"CSDN用户 | 阅读 2.4k"}, + {"title":"【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_51572290/article/details/154535381","author":"CSDN用户 | 阅读 1.3w"}, + {"title":"Java GC 面试必问三件套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2504_94294476/article/details/160668120","author":"CSDN用户 | 阅读 728"}, + {"title":"初识java","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2503_94683681/article/details/161200453","author":"CSDN用户 | 阅读 5.5k"}, + {"title":"JDK自带监控工具:jstat、jmap、jstack的使用指南(附命令示例)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41803278/article/details/156835773","author":"CSDN用户 | 阅读 2.2k"}, + {"title":"【技术架构】从单机到微服务:Java 后端架构演进与技术选型核心方案","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2302_79806056/article/details/151361712","author":"CSDN用户 | 阅读 3.1k"}, + {"title":"Resilience4j- 非 Spring 环境集成:纯 Java 项目中的手动配置实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_41187124/article/details/157544457","author":"CSDN用户 | 阅读 2.2w"}, + {"title":"深度解析:一个 Java 对象究竟占用多少字节?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/csdn_silent/article/details/160892904","author":"CSDN用户 | 阅读 1.5k"}, + {"title":"Java GC 面试必问三件套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2504_94294476/article/details/160668120","author":"CSDN用户 | 阅读 728"}, + {"title":"2024年软件设计师中级(软考中级)详细笔记【6】(下午题)试题6 Java 23种设计模式解题技巧(分值15)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/XFanny/article/details/143078263","author":"CSDN用户 | 阅读 1.1w"}, + {"title":"我的workflow设置居然被赞扬了","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/stereohomology/article/details/161384575","author":"CSDN用户 | 阅读 482"}, + {"title":"【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/160900873","author":"CSDN用户 | 阅读 2.0k"}, + {"title":"Spring Cloud Alibaba 2025.1.0.0 正式发布:拥抱 Spring Boot 4.0 与 Java 21+ 的新时代","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/lilinhai548/article/details/158038123","author":"CSDN用户 | 阅读 5.0k"}, + {"title":"飞算JavaAI编程助手在IDEA中的安装教程:本地安装、离线安装、在线安装方法大全","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_44866828/article/details/148776780","author":"CSDN用户 | 阅读 5.4k"}, + {"title":"Java开发新变革!飞算JavaAI深度剖析与实战指南","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/beautifulmemory/article/details/149032692","author":"CSDN用户 | 阅读 1.5w"}, + {"title":"本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2602_96088873/article/details/161452150","author":"CSDN用户 | 阅读 153"}, + {"title":"【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/Chase_______/article/details/161134122","author":"CSDN用户 | 阅读 1.2k"}, + {"title":"C++_string增删查改模拟实现","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/155094868","author":"CSDN用户 | 阅读 2.5k"}, + {"title":"飞算JavaAI:专为Java开发者打造的智能编程革命","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_44976692/article/details/149044619","author":"CSDN用户 | 阅读 2.4w"}, + {"title":"虚拟线程(Virtual Threads)使用指南(Java 21+)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_45483057/article/details/156154988","author":"CSDN用户 | 阅读 1.7k"}, + {"title":"Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/chen_si_shang_/article/details/161293640","author":"CSDN用户 | 阅读 850"}, + {"title":"Cast Attack:Java 中 Ghost Bits(幽灵比特)引发的新型安全威胁——Java 生态里被忽视的底层风险引发一系列绕过","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_43526443/article/details/160601018","author":"CSDN用户 | 阅读 2.4k"}, + {"title":"SpringAI Agent开发秘籍:让javaer也可以用上Agent Skills","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/liuyueyi25/article/details/157466255","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"【Java 开发日记】finally 释放的是什么资源?","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2402_87298751/article/details/154342798","author":"CSDN用户 | 阅读 2.6k"}, + {"title":"java八股——redis","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/m0_53631504/article/details/159161047","author":"CSDN用户 | 阅读 1.4k"}, + {"title":"Android Studio更改项目使用的JDK","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/qq_37945670/article/details/143814764","author":"CSDN用户 | 阅读 2.8w"}, + {"title":"Linux:基础指令(二)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/2301_78901562/article/details/161036706","author":"CSDN用户 | 阅读 3.4k"}, + {"title":"Java飞书机器人实战:5分钟搞定消息推送(附完整代码)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"https://blog.csdn.net/weixin_28347369/article/details/159184456","author":"CSDN用户 | 阅读 891"} +] \ No newline at end of file diff --git a/Project/csdn_blogs.txt b/Project/csdn_blogs.txt new file mode 100644 index 0000000..bcbcd44 --- /dev/null +++ b/Project/csdn_blogs.txt @@ -0,0 +1,209 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +Python 鸭子类型:优雅的多态哲学,让代码更自由,0.00,0.00,10.0,https://blog.csdn.net/2503_92624912/article/details/160498689,CSDN用户 | 阅读 1.8k +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +从 for 循环到 yield:一文搞懂 Python 迭代器与生成器,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161144162,CSDN用户 | 阅读 7.4k +2026年最新版Python安装和PyCharm安装教程(图文详细 附安装包),0.00,0.00,10.0,https://blog.csdn.net/m0_73467482/article/details/156511914,CSDN用户 | 阅读 7.1k +【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161457480,CSDN用户 | 阅读 44 +python基于vue的流浪动物收养系统志愿者设计与开发django flask pycharm,0.00,0.00,10.0,https://blog.csdn.net/QQ1963288475/article/details/156946558,CSDN用户 | 阅读 978 +Python 中的 @property:像访问属性一样调用方法,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161202644,CSDN用户 | 阅读 7.4k +【pip / conda / uv】换源大全:2026 国内镜像最新地址,一张表搞定所有 【Python】安装卡顿,0.00,0.00,10.0,https://blog.csdn.net/qq_73472828/article/details/160525215,CSDN用户 | 阅读 1.3k +Python流程控制:break与continue语句的区别与应用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161098938,CSDN用户 | 阅读 6.7k +从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南,0.00,0.00,10.0,https://blog.csdn.net/qq_41187124/article/details/155500568,CSDN用户 | 阅读 2.2w +Python 操作金仓数据库的完全指南(上篇):连接管理与高可用,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617026,CSDN用户 | 阅读 1.5w +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +Python+AI智能体(Agent)零基础入门全攻略:原理、架构、手搓代码与实战落地,0.00,0.00,10.0,https://blog.csdn.net/2602_94956987/article/details/160419420,CSDN用户 | 阅读 1.3k +一篇看懂 Python 标识符:命名规则 + 规范 + 避坑指南,0.00,0.00,10.0,https://blog.csdn.net/2301_80026901/article/details/160413181,CSDN用户 | 阅读 2.2k +【2026 最新】Python 与 PyCharm 详细下载安装教程 带图展示(Windows 版),0.00,0.00,10.0,https://blog.csdn.net/2301_80035882/article/details/157432536,CSDN用户 | 阅读 8.7k +【Python】异常处理:从基础到进阶,0.00,0.00,10.0,https://blog.csdn.net/2303_79015671/article/details/144533265,CSDN用户 | 阅读 6.2k +Python元编程:非科班转码者的入门指南,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159760302,CSDN用户 | 阅读 1.2w +Web自动化之Selenium 超详细教程(python),0.00,0.00,10.0,https://blog.csdn.net/weixin_73953650/article/details/145730531,CSDN用户 | 阅读 2.3w +【Dify】使用 python 调用 Dify 的 API 服务,查看“知识检索”返回内容,用于前端溯源展示,0.00,0.00,10.0,https://blog.csdn.net/wsLJQian/article/details/157470958,CSDN用户 | 阅读 1.3k +Python数据统计完全指南:从入门到实战,0.00,0.00,10.0,https://blog.csdn.net/sixpp/article/details/152516371,CSDN用户 | 阅读 7.4k +Python流程控制:while循环嵌套与死循环避免技巧,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161001777,CSDN用户 | 阅读 5.8k +Python 正则表达式入门:从匹配手机号到提取文本内容,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161200803,CSDN用户 | 阅读 7.5k +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +13801黄大年茶思屋第138期(基础软件领域第三期)第1题:混部场景下高性能、低底噪的极简I/O QoS管控技术,0.00,0.00,10.0,https://blog.csdn.net/coreopt/article/details/161459642,CSDN用户 | 阅读 359 +2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑,0.00,0.00,10.0,https://blog.csdn.net/user340/article/details/158102252,CSDN用户 | 阅读 7.1k +Python 鸭子类型:优雅的多态哲学,让代码更自由,0.00,0.00,10.0,https://blog.csdn.net/2503_92624912/article/details/160498689,CSDN用户 | 阅读 1.8k +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界,0.00,0.00,10.0,https://blog.csdn.net/qq_44647100/article/details/160017406,CSDN用户 | 阅读 1.1k +2026年电脑网页游戏盘点_传奇网页游戏推荐,0.00,0.00,10.0,https://blog.csdn.net/2601_96116927/article/details/161459833,CSDN用户 | 阅读 155 +Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617170,CSDN用户 | 阅读 1.6w +Python 中的 @property:像访问属性一样调用方法,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161202644,CSDN用户 | 阅读 7.4k +AI入门踩坑实录:我换了3种语言才敢说,Python真的是入门唯一选择吗?,0.00,0.00,10.0,https://blog.csdn.net/Dreamy_zsy/article/details/160308823,CSDN用户 | 阅读 3.7w +AutoGPT+Python:让AI智能体自动完成复杂任务的终极指南,0.00,0.00,10.0,https://blog.csdn.net/2301_81152266/article/details/158353859,CSDN用户 | 阅读 4.5k +Windows本地部署Hermes Agent实录!WSL+Python部署路线详细步骤,0.00,0.00,10.0,https://blog.csdn.net/baidu_41773235/article/details/160404260,CSDN用户 | 阅读 761 +用 uv 轻松掌管你的 Python 宇宙:告别版本混乱,一键设置全局解释器,0.00,0.00,10.0,https://blog.csdn.net/qq_51553749/article/details/157765585,CSDN用户 | 阅读 1.4k +Python从0到100完整学习指南(必看导航),0.00,0.00,10.0,https://blog.csdn.net/m0_57545130/article/details/158382640,CSDN用户 | 阅读 2.5k +Fiddler抓包实战:5分钟搞定同花顺APP股票数据API获取(附Python解析代码),0.00,0.00,10.0,https://blog.csdn.net/weixin_29211309/article/details/158247385,CSDN用户 | 阅读 1.3k +Python与容器化:Docker和Kubernetes实战,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159630044,CSDN用户 | 阅读 1.3w +基于Python的医院运营数据可视化平台:设计、实现与应用(上),0.00,0.00,10.0,https://blog.csdn.net/kkiron/article/details/145614002,CSDN用户 | 阅读 4.4k +Python AI入门:从Hello World到图像分类,0.00,0.00,10.0,https://blog.csdn.net/guoyizhongxing/article/details/159324438,CSDN用户 | 阅读 5.7k +python通过API调用Coze智能体学习,0.00,0.00,10.0,https://blog.csdn.net/GHL284271090/article/details/160994302,CSDN用户 | 阅读 752 +从 for 循环到 yield:一文搞懂 Python 迭代器与生成器,0.00,0.00,10.0,https://blog.csdn.net/Nova_511/article/details/161144162,CSDN用户 | 阅读 7.4k +Python 3.12(于2023年10月2日发布)是Python的最新稳定版本之一,相比此前版本(如3.11、3.10等),0.00,0.00,10.0,https://blog.csdn.net/blog_programb/article/details/158616716,CSDN用户 | 阅读 838 +本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161452150,CSDN用户 | 阅读 151 +还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界,0.00,0.00,10.0,https://blog.csdn.net/qq_44647100/article/details/160017406,CSDN用户 | 阅读 1.1k +Day 75:【99天精通Python】人工智能应用 - 接入 OpenAI API - 给程序装上大脑,0.00,0.00,10.0,https://blog.csdn.net/weixin_52694742/article/details/157074239,CSDN用户 | 阅读 1.1k +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +在线浏览“秀人网合集”的新思路:30 行 Python 把封面图链接秒变本地可点图库,0.00,0.00,10.0,https://blog.csdn.net/cheweituya/article/details/157251686,CSDN用户 | 阅读 10.4w +一文读懂IP路由:从设备架构到核心技术,0.00,0.00,10.0,https://blog.csdn.net/2402_88096536/article/details/161458018,CSDN用户 | 阅读 348 +Python流程控制:for循环与range函数的搭配使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161067521,CSDN用户 | 阅读 7.4k +2026最新:国内直连调用Grok-4.3与免费Gemini-2.5-flash-lite(无需翻墙/OpenClaw+PyCharm+Python全场景),0.00,0.00,10.0,https://blog.csdn.net/nmdbbzcl/article/details/160992672,CSDN用户 | 阅读 2.6k +【Python 爬虫实战】抓取 BOSS 直聘,0.00,0.00,10.0,https://blog.csdn.net/2401_87126002/article/details/157483743,CSDN用户 | 阅读 3.2k +Python中一切皆对象:深入理解Python的对象模型,0.00,0.00,10.0,https://blog.csdn.net/2503_92624912/article/details/155100575,CSDN用户 | 阅读 4.6k +Python与云计算:非科班转码者的指南,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159629885,CSDN用户 | 阅读 1.3w +【Scapy】Scapy详细安装教程、功能介绍、快速上手,0.00,0.00,10.0,https://blog.csdn.net/Himan21/article/details/149858432,CSDN用户 | 阅读 4.0k +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +Python 八股文汇总,0.00,0.00,10.0,https://blog.csdn.net/Derrick__1/article/details/158806665,CSDN用户 | 阅读 1.3k +使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成),0.00,0.00,10.0,https://blog.csdn.net/2302_78391795/article/details/150619723,CSDN用户 | 阅读 4.1w +【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器,0.00,0.00,10.0,https://blog.csdn.net/Clay_K/article/details/148401006,CSDN用户 | 阅读 4.0k +【Js逆向 python】Web JS 逆向全体系详细解释,0.00,0.00,10.0,https://blog.csdn.net/2301_80637449/article/details/159132537,CSDN用户 | 阅读 2.5k +对python的再认识-基于数据结构进行-a007-集合-CURD,0.00,0.00,10.0,https://blog.csdn.net/BECOMEviolet/article/details/157912640,CSDN用户 | 阅读 920 +2026年Python就业市场分析:非科班转码者的机会与挑战,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159729470,CSDN用户 | 阅读 1.3w +Python最全面复习:从入门到精通(2026年),0.00,0.00,10.0,https://blog.csdn.net/2501_90715893/article/details/161239082,CSDN用户 | 阅读 972 +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +Python与边缘计算:非科班转码者的指南,0.00,0.00,10.0,https://blog.csdn.net/no1coder/article/details/159675671,CSDN用户 | 阅读 1.3w +地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂,0.00,0.00,10.0,https://blog.csdn.net/2401_83233809/article/details/161454731,CSDN用户 | 阅读 4 +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617170,CSDN用户 | 阅读 1.6w +从零实现一个轻量级向量搜索引擎(Python 版),0.00,0.00,10.0,https://blog.csdn.net/picture_share/article/details/161332729,CSDN用户 | 阅读 943 +Claude-Code-python 前端改造项目工作流程详解,0.00,0.00,10.0,https://blog.csdn.net/weixin_42878111/article/details/160550285,CSDN用户 | 阅读 864 +Python 爬虫实战:Selenium 批量爬取百度图片(逐行代码超详细解析),0.00,0.00,10.0,https://blog.csdn.net/m0_66822255/article/details/161024571,CSDN用户 | 阅读 999 +Python流程控制:while循环嵌套与死循环避免技巧,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161001777,CSDN用户 | 阅读 5.8k +【2026最新Python+AI入门指南】:从零基础到实操落地,避开90%新手坑,0.00,0.00,10.0,https://blog.csdn.net/user340/article/details/157736821,CSDN用户 | 阅读 7.9k +VS code研发工具配置使用,包括python、git的配置,0.00,0.00,10.0,https://blog.csdn.net/hurong0000/article/details/160075246,CSDN用户 | 阅读 665 +Python 3.14 安装教程:新手友好版,0.00,0.00,10.0,https://blog.csdn.net/m0_69824302/article/details/153417024,CSDN用户 | 阅读 5.0k +Java安全-CC链 | CC3,0.00,0.00,10.0,https://blog.csdn.net/2501_93871563/article/details/160991726,CSDN用户 | 阅读 3.1k +2.python加解密实战,0.00,0.00,10.0,https://blog.csdn.net/m0_57385165/article/details/157332452,CSDN用户 | 阅读 1.1k +Python 开发中“使用 read() 读取大文件导致内存溢出” 问题详解,0.00,0.00,10.0,https://blog.csdn.net/jjj_web/article/details/160972045,CSDN用户 | 阅读 811 +Python 中的 sqlite3 模块:轻量级数据库的完美搭档,0.00,0.00,10.0,https://blog.csdn.net/weixin_40266856/article/details/156835297,CSDN用户 | 阅读 3.3k +Blender 3.x Python 脚本编程(一),0.00,0.00,10.0,https://blog.csdn.net/wizardforcel/article/details/158378453,CSDN用户 | 阅读 3.0k +超越Python:下一步该学什么编程语言?,0.00,0.00,10.0,https://blog.csdn.net/m0_56135967/article/details/157555149,CSDN用户 | 阅读 1000 +一文吃透贝叶斯算法:从数学原理到 Python 代码实战(附完整可运行案例),0.00,0.00,10.0,https://blog.csdn.net/m0_74398756/article/details/158664045,CSDN用户 | 阅读 1.3k +全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表,0.00,0.00,10.0,https://blog.csdn.net/taotao_guiwang/article/details/156749455,CSDN用户 | 阅读 1.6w +Python流程控制:while循环嵌套与死循环避免技巧,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/161001777,CSDN用户 | 阅读 5.8k +Python AI入门:从Hello World到图像分类,0.00,0.00,10.0,https://blog.csdn.net/guoyizhongxing/article/details/159324438,CSDN用户 | 阅读 5.7k +Python 操作金仓数据库的完全指南(下篇):SQL执行、批量操作与扩展功能,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/160617170,CSDN用户 | 阅读 1.6w +实测CSDN AI数字营销会员:创作者效率与曝光的双重提升体验报告,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161451272,CSDN用户 | 阅读 62 +2.python加解密实战,0.00,0.00,10.0,https://blog.csdn.net/m0_57385165/article/details/157332452,CSDN用户 | 阅读 1.1k +Python 测试实战指南:单元、集成、端到端测试边界对比、发版焦虑破解与电商下单链路优化,0.00,0.00,10.0,https://blog.csdn.net/windowshht/article/details/159627343,CSDN用户 | 阅读 853 +【课程设计/毕业设计】基于Python的外卖配送分析与可视化系统的设计与实现【附源码、数据库、万字文档】,0.00,0.00,10.0,https://blog.csdn.net/2501_91703026/article/details/158585314,CSDN用户 | 阅读 1.3k +【Python 爬虫实战】抓取 BOSS 直聘,0.00,0.00,10.0,https://blog.csdn.net/2401_87126002/article/details/157483743,CSDN用户 | 阅读 3.2k +一文读懂IP路由:从设备架构到核心技术,0.00,0.00,10.0,https://blog.csdn.net/2402_88096536/article/details/161458018,CSDN用户 | 阅读 354 +还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界,0.00,0.00,10.0,https://blog.csdn.net/qq_44647100/article/details/160017406,CSDN用户 | 阅读 1.1k +Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题),0.00,0.00,10.0,https://blog.csdn.net/chen_si_shang_/article/details/161293640,CSDN用户 | 阅读 850 +Python流程控制:if-else与if-elif-else嵌套使用,0.00,0.00,10.0,https://blog.csdn.net/AIRoses/article/details/160911021,CSDN用户 | 阅读 1.1w +计算机毕业设计Python+AI大模型空气质量预测分析(可定制城市) 空气质量可视化 空气质量爬虫 机器学习 深度学习 大 数据毕业设计,0.00,0.00,10.0,https://blog.csdn.net/spark2022/article/details/161241598,CSDN用户 | 阅读 870 +计算机视觉工具:Python+OpenCV的常用函数汇总,0.00,0.00,10.0,https://blog.csdn.net/COLLINSXU/article/details/160522364,CSDN用户 | 阅读 1.8w +2026最新Python+AI入门指南:从零基础到实战落地,避开90%新手坑,0.00,0.00,10.0,https://blog.csdn.net/user340/article/details/158102252,CSDN用户 | 阅读 7.1k +【Python】基础语法入门(一),0.00,0.00,10.0,https://blog.csdn.net/2301_78257800/article/details/154902322,CSDN用户 | 阅读 6.3k +Playwright Python Windows 下 headful Chromium 崩溃排查经验分享,0.00,0.00,10.0,https://blog.csdn.net/zhangshaohua1603/article/details/158350679,CSDN用户 | 阅读 1.0k +Python中秋月圆夜:手把手实现月相可视化,用代码赏千里共婵娟,0.00,0.00,10.0,https://blog.csdn.net/m0_55394328/article/details/152602293,CSDN用户 | 阅读 3.1w +【机器学习第三期(Python)】CatBoost 方法原理详解,0.00,0.00,10.0,https://blog.csdn.net/qq_44246618/article/details/149022812,CSDN用户 | 阅读 2.2k +Python之三大基本库——Pandas(1),0.00,0.00,10.0,https://blog.csdn.net/m0_61746796/article/details/153201960,CSDN用户 | 阅读 4.5k +海洋光学(Ocean Insight,原 Ocean Optics)确实提供了面向 Python 的官方封装库,主要包括 OceanDirect(底层硬件通信)和基于其封装的高层库(如pyocean/,0.00,0.00,10.0,https://blog.csdn.net/womrenet/article/details/156466272,CSDN用户 | 阅读 1.2k +【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161132354,CSDN用户 | 阅读 2.8k +【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析,0.00,0.00,10.0,https://blog.csdn.net/weixin_62043600/article/details/160531542,CSDN用户 | 阅读 5.1k +java中的进程的详细解析,0.00,0.00,10.0,https://blog.csdn.net/yu____yuan/article/details/161049661,CSDN用户 | 阅读 818 +懂你所需,利爪随行:MateClaw 正式开源,补齐 Java 生态的 AI Agent 拼图,0.00,0.00,10.0,https://blog.csdn.net/bufegar0/article/details/159846780,CSDN用户 | 阅读 2.0k +我的workflow设置居然被赞扬了,0.00,0.00,10.0,https://blog.csdn.net/stereohomology/article/details/161384575,CSDN用户 | 阅读 477 +【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161347182,CSDN用户 | 阅读 682 +Harness实战指南,在Java Spring Boot项目中规范落地OpenSpec+Claude Code,0.00,0.00,10.0,https://blog.csdn.net/u013970991/article/details/159902907,CSDN用户 | 阅读 1.9k +用 python 和 java 分别写出10道经典题,0.00,0.00,10.0,https://blog.csdn.net/2501_94434623/article/details/160901197,CSDN用户 | 阅读 1.4k +基于Java Web的医疗诊治系统的设计与实现 --毕设附源码42197,0.00,0.00,10.0,https://blog.csdn.net/VX_DZbishe/article/details/157900907,CSDN用户 | 阅读 1.3k +字节跳动官网 bytedance.com 完整工程复刻,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161459714,CSDN用户 | 阅读 31 +Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题),0.00,0.00,10.0,https://blog.csdn.net/chen_si_shang_/article/details/161293640,CSDN用户 | 阅读 850 +Java 大视界 -- Java+Spark 构建企业级用户画像平台:从数据采集到标签输出全流程(437),0.00,0.00,10.0,https://blog.csdn.net/atgfg/article/details/156062867,CSDN用户 | 阅读 5.3k +语义解析革命:飞算JavaAI三层架构重塑企业级代码生成链路,0.00,0.00,10.0,https://blog.csdn.net/m0_74385041/article/details/150289635,CSDN用户 | 阅读 9.7k +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透,0.00,0.00,10.0,https://blog.csdn.net/2401_89723786/article/details/157733289,CSDN用户 | 阅读 607 +Java 大视界 -- 基于 Java+Flink 构建实时风控规则引擎:动态规则配置与热更新(446),0.00,0.00,10.0,https://blog.csdn.net/atgfg/article/details/157333442,CSDN用户 | 阅读 3.3k +第三篇:《手把手搭建Selenium WebDriver测试环境(Java/Python)》,0.00,0.00,10.0,https://blog.csdn.net/qq_45239623/article/details/160394399,CSDN用户 | 阅读 785 +基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版),0.00,0.00,10.0,https://blog.csdn.net/2301_80863610/article/details/151295847,CSDN用户 | 阅读 31.8w +Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构,0.00,0.00,10.0,https://blog.csdn.net/lilinhai548/article/details/156422566,CSDN用户 | 阅读 4.1k +【Linux系统】线程(上),0.00,0.00,10.0,https://blog.csdn.net/Miun123/article/details/161121946,CSDN用户 | 阅读 652 +Java 连接 Elasticsearch 8.x 安全模式实战:证书校验与 ApiKey 认证全解析,0.00,0.00,10.0,https://blog.csdn.net/hdk5855/article/details/158583924,CSDN用户 | 阅读 985 +【C++】 继承与多态(中),0.00,0.00,10.0,https://blog.csdn.net/2602_95649725/article/details/161196506,CSDN用户 | 阅读 1.8k +Linux C++ 高并发编程:从原理到手撕,线程池全链路深度解析,0.00,0.00,10.0,https://blog.csdn.net/2503_91389547/article/details/160339478,CSDN用户 | 阅读 3.6k +开发一个好用的真全屏手持弹幕微信小程序(一),0.00,0.00,10.0,https://blog.csdn.net/Mr_BT/article/details/161459391,CSDN用户 | 阅读 94 +【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161132354,CSDN用户 | 阅读 2.8k +【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析,0.00,0.00,10.0,https://blog.csdn.net/weixin_62043600/article/details/160531542,CSDN用户 | 阅读 5.1k +Java实习模拟面试之多益网络苏州二面:聚焦游戏服务端开发、Redis高可用与JVM线程池深度追问,0.00,0.00,10.0,https://blog.csdn.net/2402_84764726/article/details/157393528,CSDN用户 | 阅读 1.0k +Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透,0.00,0.00,10.0,https://blog.csdn.net/2401_89723786/article/details/157733289,CSDN用户 | 阅读 607 +【字节跳动】人形足球机器人 RoboCup 赛事全链路工程资料,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161457480,CSDN用户 | 阅读 45 +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?,0.00,0.00,10.0,https://blog.csdn.net/2402_87298751/article/details/159087816,CSDN用户 | 阅读 1.8k +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态,0.00,0.00,10.0,https://blog.csdn.net/2302_79751907/article/details/149275967,CSDN用户 | 阅读 3.7k +Java:猜数字游戏,0.00,0.00,10.0,https://blog.csdn.net/2503_94683681/article/details/161258233,CSDN用户 | 阅读 5.5k +Java 开发者如何搞定百度地图 SN 权限签名实践-以搜索2.0接口为例,0.00,0.00,10.0,https://blog.csdn.net/yelangkingwuzuhu/article/details/151289695,CSDN用户 | 阅读 9.5k +Bun替代Nodejs,JavaScrpit运行新环境-Bun,更快、更现代的开发体验,0.00,0.00,10.0,https://blog.csdn.net/m0_57874805/article/details/150647891,CSDN用户 | 阅读 2.6k +Java Stream妙用:Collectors.toMap详解,轻松实现集合转一对一Map,0.00,0.00,10.0,https://blog.csdn.net/qq_41840843/article/details/158383692,CSDN用户 | 阅读 3.9k +Linux:基础指令(二),0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/161036706,CSDN用户 | 阅读 3.4k +2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle),0.00,0.00,10.0,https://blog.csdn.net/Moss_co/article/details/148425265,CSDN用户 | 阅读 3.4w +C++快速上手java备战期末考——初识java,0.00,0.00,10.0,https://blog.csdn.net/2502_94353935/article/details/160992548,CSDN用户 | 阅读 1.5k +Java+Vue开发者必看:Open Code、Claude Code、Trae、Coze 四大AI开发工具深度测评(含免费/付费对比),0.00,0.00,10.0,https://blog.csdn.net/qq_35452726/article/details/159687764,CSDN用户 | 阅读 1.4k +Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code,0.00,0.00,10.0,https://blog.csdn.net/qq_22903677/article/details/160000361,CSDN用户 | 阅读 878 +Javascript.8——ES6【Promise的静态方法】,0.00,0.00,10.0,https://blog.csdn.net/weixin_63215361/article/details/157614292,CSDN用户 | 阅读 877 +地图 API 怎么选?高德、百度、腾讯、天地图、迈云 LTS 一次看懂,0.00,0.00,10.0,https://blog.csdn.net/2401_83233809/article/details/161454731,CSDN用户 | 阅读 4 +2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle),0.00,0.00,10.0,https://blog.csdn.net/Moss_co/article/details/148425265,CSDN用户 | 阅读 3.4w +Java 大视界 -- Java 大数据机器学习模型在金融风险管理体系构建与风险防范能力提升中的应用(435),0.00,0.00,10.0,https://blog.csdn.net/atgfg/article/details/155947715,CSDN用户 | 阅读 2.8k +Java——标准序列化机制,0.00,0.00,10.0,https://blog.csdn.net/cold___play/article/details/161107932,CSDN用户 | 阅读 3.5k +Java前缀和算法题目练习,0.00,0.00,10.0,https://blog.csdn.net/2401_89019969/article/details/151975418,CSDN用户 | 阅读 3.1k +Python 入门教程系列,0.00,0.00,10.0,https://blog.csdn.net/weixin_30720461/article/details/161396374,CSDN用户 | 阅读 1.3k +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +Java GC 面试必问三件套,0.00,0.00,10.0,https://blog.csdn.net/2504_94294476/article/details/160668120,CSDN用户 | 阅读 728 +突破平台限制:iOS设备运行Minecraft Java版完全指南,0.00,0.00,10.0,https://blog.csdn.net/gitblog_00466/article/details/157378543,CSDN用户 | 阅读 2.0w +企业级 Java 登录注册系统构建指南(附核心代码与配置),0.00,0.00,10.0,https://blog.csdn.net/m0_67187271/article/details/151104099,CSDN用户 | 阅读 1.9k +Java 多线程初阶通关指南:从核心概念到实战案例,一篇吃透,0.00,0.00,10.0,https://blog.csdn.net/2401_89723786/article/details/157733289,CSDN用户 | 阅读 607 +Adoptium Temurin JDK 下载,0.00,0.00,10.0,https://blog.csdn.net/weixin_42346831/article/details/148632858,CSDN用户 | 阅读 5.2k +HarmonyOS ArkWeb 系列之precompileJavaScript:提前编译 JS 脚本,告别解析等待,0.00,0.00,10.0,https://blog.csdn.net/qq_33681891/article/details/161185190,CSDN用户 | 阅读 1.5w +Java+SpringAI企业级实战项目完整官方文档(生产终版),0.00,0.00,10.0,https://blog.csdn.net/wbkang/article/details/160586573,CSDN用户 | 阅读 4.0k +高级java每日一道面试题-2025年12月31日-实战篇[Docker]-Docker Swarm 的 Routing Mesh 是如何工作的?,0.00,0.00,10.0,https://blog.csdn.net/qq_43071699/article/details/161195524,CSDN用户 | 阅读 792 +基于Java标准库读取CSV实现天地图POI分类快速导入PostGIS数据库实战,0.00,0.00,10.0,https://blog.csdn.net/yelangkingwuzuhu/article/details/149454785,CSDN用户 | 阅读 9.3k +【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161347182,CSDN用户 | 阅读 682 +JavaScript异步编程 Async/Await 使用详解:从原理到最佳实践,0.00,0.00,10.0,https://blog.csdn.net/lhmyy521125/article/details/147932219,CSDN用户 | 阅读 8.0k +java中的进程的详细解析,0.00,0.00,10.0,https://blog.csdn.net/yu____yuan/article/details/161049661,CSDN用户 | 阅读 818 +【C++】 继承与多态(中),0.00,0.00,10.0,https://blog.csdn.net/2602_95649725/article/details/161196506,CSDN用户 | 阅读 1.8k +【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161347182,CSDN用户 | 阅读 682 +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +智能写字机器人开发全解析,0.00,0.00,10.0,https://blog.csdn.net/2401_88863003/article/details/161457761,CSDN用户 | 阅读 105 +C++_string增删查改模拟实现,0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/155094868,CSDN用户 | 阅读 2.5k +Java——标准序列化机制,0.00,0.00,10.0,https://blog.csdn.net/cold___play/article/details/161107932,CSDN用户 | 阅读 3.5k +【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析,0.00,0.00,10.0,https://blog.csdn.net/weixin_62043600/article/details/160531542,CSDN用户 | 阅读 5.1k +Java之泛型,0.00,0.00,10.0,https://blog.csdn.net/wmh_1234567/article/details/141270616,CSDN用户 | 阅读 1.1w +苍穹外卖 项目最终总结,0.00,0.00,10.0,https://blog.csdn.net/2401_88612756/article/details/161456400,CSDN用户 | 阅读 280 +【Java 开发日记】设计一个支持万人同时抢购商品的秒杀系统?,0.00,0.00,10.0,https://blog.csdn.net/2402_87298751/article/details/156869453,CSDN用户 | 阅读 6.9k +【Java杂项】为什么 b += 1 可以,但 b = b + 1 会报错?类型提升与复合赋值详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161132354,CSDN用户 | 阅读 2.8k +模仿淘宝购物系统的Java Web前端项目(开源项目),0.00,0.00,10.0,https://blog.csdn.net/rej177/article/details/125535688,CSDN用户 | 阅读 1.4w +【C++】C++——类的默认成员函数(构造、析构、拷贝构造函数),0.00,0.00,10.0,https://blog.csdn.net/zore__/article/details/160190541,CSDN用户 | 阅读 1.9k +学生职业选择对cpp/c++以及后端java go的迷茫,0.00,0.00,10.0,https://blog.csdn.net/weixin_52259848/article/details/158290665,CSDN用户 | 阅读 970 +大模型开发 - 零手写 AI Agent:深入理解 ReAct 模式与 Java 实现,0.00,0.00,10.0,https://blog.csdn.net/yangshangwei/article/details/157644609,CSDN用户 | 阅读 2.4k +【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用),0.00,0.00,10.0,https://blog.csdn.net/qq_51572290/article/details/154535381,CSDN用户 | 阅读 1.3w +Java GC 面试必问三件套,0.00,0.00,10.0,https://blog.csdn.net/2504_94294476/article/details/160668120,CSDN用户 | 阅读 728 +初识java,0.00,0.00,10.0,https://blog.csdn.net/2503_94683681/article/details/161200453,CSDN用户 | 阅读 5.5k +JDK自带监控工具:jstat、jmap、jstack的使用指南(附命令示例),0.00,0.00,10.0,https://blog.csdn.net/qq_41803278/article/details/156835773,CSDN用户 | 阅读 2.2k +【技术架构】从单机到微服务:Java 后端架构演进与技术选型核心方案,0.00,0.00,10.0,https://blog.csdn.net/2302_79806056/article/details/151361712,CSDN用户 | 阅读 3.1k +Resilience4j- 非 Spring 环境集成:纯 Java 项目中的手动配置实现,0.00,0.00,10.0,https://blog.csdn.net/qq_41187124/article/details/157544457,CSDN用户 | 阅读 2.2w +深度解析:一个 Java 对象究竟占用多少字节?,0.00,0.00,10.0,https://blog.csdn.net/csdn_silent/article/details/160892904,CSDN用户 | 阅读 1.5k +Java GC 面试必问三件套,0.00,0.00,10.0,https://blog.csdn.net/2504_94294476/article/details/160668120,CSDN用户 | 阅读 728 +2024年软件设计师中级(软考中级)详细笔记【6】(下午题)试题6 Java 23种设计模式解题技巧(分值15),0.00,0.00,10.0,https://blog.csdn.net/XFanny/article/details/143078263,CSDN用户 | 阅读 1.1w +我的workflow设置居然被赞扬了,0.00,0.00,10.0,https://blog.csdn.net/stereohomology/article/details/161384575,CSDN用户 | 阅读 482 +【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/160900873,CSDN用户 | 阅读 2.0k +Spring Cloud Alibaba 2025.1.0.0 正式发布:拥抱 Spring Boot 4.0 与 Java 21+ 的新时代,0.00,0.00,10.0,https://blog.csdn.net/lilinhai548/article/details/158038123,CSDN用户 | 阅读 5.0k +飞算JavaAI编程助手在IDEA中的安装教程:本地安装、离线安装、在线安装方法大全,0.00,0.00,10.0,https://blog.csdn.net/qq_44866828/article/details/148776780,CSDN用户 | 阅读 5.4k +Java开发新变革!飞算JavaAI深度剖析与实战指南,0.00,0.00,10.0,https://blog.csdn.net/beautifulmemory/article/details/149032692,CSDN用户 | 阅读 1.5w +本套GR3六轴机械臂控制系统包含70章完整工业级源码,涵盖核心运动控制(直线/圆弧插补、正逆运动学)、力控柔顺算法(六维力矩检测、碰撞保护)、视觉引导(手眼标定、像素坐标转换)、智能功能(拖拽示教、轨,0.00,0.00,10.0,https://blog.csdn.net/2602_96088873/article/details/161452150,CSDN用户 | 阅读 153 +【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解,0.00,0.00,10.0,https://blog.csdn.net/Chase_______/article/details/161134122,CSDN用户 | 阅读 1.2k +C++_string增删查改模拟实现,0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/155094868,CSDN用户 | 阅读 2.5k +飞算JavaAI:专为Java开发者打造的智能编程革命,0.00,0.00,10.0,https://blog.csdn.net/weixin_44976692/article/details/149044619,CSDN用户 | 阅读 2.4w +虚拟线程(Virtual Threads)使用指南(Java 21+),0.00,0.00,10.0,https://blog.csdn.net/weixin_45483057/article/details/156154988,CSDN用户 | 阅读 1.7k +Java基础热门八股总结:八种基本数据类型 + 装箱拆箱 + 缓存机制,(90%的Java新手都搞不清的装箱拆箱问题),0.00,0.00,10.0,https://blog.csdn.net/chen_si_shang_/article/details/161293640,CSDN用户 | 阅读 850 +Cast Attack:Java 中 Ghost Bits(幽灵比特)引发的新型安全威胁——Java 生态里被忽视的底层风险引发一系列绕过,0.00,0.00,10.0,https://blog.csdn.net/weixin_43526443/article/details/160601018,CSDN用户 | 阅读 2.4k +SpringAI Agent开发秘籍:让javaer也可以用上Agent Skills,0.00,0.00,10.0,https://blog.csdn.net/liuyueyi25/article/details/157466255,CSDN用户 | 阅读 2.6k +【Java 开发日记】finally 释放的是什么资源?,0.00,0.00,10.0,https://blog.csdn.net/2402_87298751/article/details/154342798,CSDN用户 | 阅读 2.6k +java八股——redis,0.00,0.00,10.0,https://blog.csdn.net/m0_53631504/article/details/159161047,CSDN用户 | 阅读 1.4k +Android Studio更改项目使用的JDK,0.00,0.00,10.0,https://blog.csdn.net/qq_37945670/article/details/143814764,CSDN用户 | 阅读 2.8w +Linux:基础指令(二),0.00,0.00,10.0,https://blog.csdn.net/2301_78901562/article/details/161036706,CSDN用户 | 阅读 3.4k +Java飞书机器人实战:5分钟搞定消息推送(附完整代码),0.00,0.00,10.0,https://blog.csdn.net/weixin_28347369/article/details/159184456,CSDN用户 | 阅读 891 diff --git a/Project/dangdang_books.json b/Project/dangdang_books.json new file mode 100644 index 0000000..16a2362 --- /dev/null +++ b/Project/dangdang_books.json @@ -0,0 +1,239 @@ +[ + {"title":" 陪安东尼度过漫长岁月 全六册 加赠亲签明信片 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m8.ddimg.cn/54/3/29680848-1_b_1779433977.jpg","author":"安东尼"}, + {"title":" 小清欢【印特签版+当当定制贴纸】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"云拿月"}, + {"title":" 红:陪安东尼度过漫长岁月Ⅰ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 没有明天的我们,在昨天相恋【当当定制衔尾蛇镭射怀表X2】第八届网络小说大奖获奖作品","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"星火燎原"}, + {"title":" 那个不为人知的故事 Twentine(无量渡口)BE美学代表作品","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Twentine"}, + {"title":" 朝俞1+2伪装学渣 限定正面白版护封+背面黑版护封套装 青春畅销小说实体书 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 红酒绿 苏他代表作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"苏他"}, + {"title":" 奇洛李维斯回信(高人气作者清明谷雨口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"清明谷雨"}, + {"title":" 他笑时风华正茂【印特签版+当当专享印制作者手写明信片】舒远","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒远"}, + {"title":" 渡厄【印签版+当当定制信纸x2】杨溯","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"杨溯"}, + {"title":" 蓝:陪安东尼度过漫长岁月VI(首发加赠当当限定赠品:PET菲林胶片x2张)陪安系列的15年暖心陪伴","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 元气少女缘结神:鞍马山夜话(甜蜜少女系漫画官方中文纪念版首次上市!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Haruka"}, + {"title":" 陪安东尼度过漫长岁月","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 他在云之南 印特签 景行高人气经典口碑力作 相遇十年典藏版 新增万字番外+作者前言","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"景行"}, + {"title":" 青:陪安东尼度过漫长岁月5","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 别踮脚我低头印签版 当当定制关于你的拍立得 纯爱言情作者君不弃校园甜宠悸动之作 网络原名她不乖要哄","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"君不弃"}, + {"title":" 青:陪安东尼度过漫长岁月Ⅴ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 梦蝶庄生(网络原名:还剩三个月命请让我从容赴S)番茄9.8高分BE美学力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"高卧北"}, + {"title":" 退烧(全二册)舒虞浪漫新作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒虞"}, + {"title":" 与岁长宁 上册 追光救赎 高口碑古言 嫁反派 娇娇贵女x乖张美强惨 反派 男主 她是他心尖上的善念 是刻在他伤痕上的名字","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"布丁琉璃"}, + {"title":" 渡夏天","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"甜野豹"}, + {"title":" 蓝:陪安东尼度过漫长岁月VI 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 人鱼陷落:完结篇 畅销书作者麟潜口碑代表作!","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 《你是长夜,也是灯火》典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"岁惟"}, + {"title":" 人鱼陷落全五册(畅销书作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 橙:陪安东尼度过漫长岁月Ⅱ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 深情眼(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"耳东兔子"}, + {"title":" 晋江人气作者木羽愿高口碑双向奔赴代表作《纵我情深》破镜重圆vs蓄谋已久,全文高甜!新增出版番外《婚后生活》,续写“傅姜夫","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木羽愿"}, + {"title":" 人鱼陷落(高人气作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 打火机与公主裙(荒草园+长明灯)全2册 Twentine著 陈飞宇、张婧仪 主演影视剧“点燃我,温暖你”原著小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Twentine"}, + {"title":" 《阿也(全二册)》刷边典藏版 我喜欢你的信息素 引路星 全新番外","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"引路星"}, + {"title":" 纸飞机1+2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"潭石"}, + {"title":" 人鱼陷落3(长佩原创人气文学,高人气作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 最好的我们:全三册(八月长安“振华中学”系列代表作,十周年典藏版。新增 10P后记《罗德赛塔西亚是一封情书》)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"八月长安"}, + {"title":" 骄阳似我下 完结篇 印签版 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"顾漫"}, + {"title":" 我不喜欢这世界,我只喜欢你修订版 乔一 畅销百万册!由吴倩张雨剑主演的超甜电视剧我只喜欢你原著小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"乔一"}, + {"title":" 你失信了","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"十清杳"}, + {"title":" 缠 网络原名《真香》 ,《二锅水》作者烟猫与酒“治愈”向代表作 年度情感催泪大戏,一段“心”连接的亲情 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"烟猫与酒"}, + {"title":" 太岁(《杀破狼》《残次品》《默读》《镇魂》作者、高人气畅销书作家Priest无CP力作)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Priest"}, + {"title":" 人鱼陷落2(高人气作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 《别来无恙》晋江文学城畅销书作家 北南 经典虐心作品原著同名漫画 破镜重圆天花板","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"北南"}, + {"title":" 朝俞1+2套装(全2册)原名伪装学渣 现象级青春小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 告白2完结篇 王星越 邓恩熙同名电视剧 赠手绘卡片+告白信+贴纸+婚礼请柬+海报+登机牌+藏书票+书签 应橙暗恋作品新增","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"应橙"}, + {"title":" 旧故新长:诗无茶代表作青春文学治愈系小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"诗无茶"}, + {"title":" 拉勾(全2册)春风榴火作品,网络原名:我是顶流巨星亲孙女","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"春风榴火"}, + {"title":" 有匪全集(赵丽颖、王一博主演《有翡》原著小说。Priest扛鼎之作,全4册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"Priest"}, + {"title":" 黄粱遗梦【当当网印签版】人气作家高卧北催泪力作!","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"高卧北"}, + {"title":" 伪装学渣未删减12这题超纲了朝俞七芒星逐夏一觉醒来全套完结篇【木瓜黄小说合集】木瓜黄伪装学渣经典青春文学小说作品合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 那个不为人知的故事 寂静深处有人家 Twentine(无量渡口) 名利场人 朝暮不相迟 以你为名的夏天 她等待刀锋已久","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 梦蝶庄生 黄粱遗梦 套装 高卧北","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"高卧北"}, + {"title":" 难哄 2册全集 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 神之陨落2 限量印特签 网络名《杀穿副本后,我在规则里养大邪神》番茄小说人气作者白桃呜呜龙无限流大作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"白桃呜呜龙"}, + {"title":" 网恋被骗八百次","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"熊也"}, + {"title":" 人鱼陷落4(畅销书作者麟潜口碑代表作!当当专享电子屏保)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 你说巧不巧 全二册 久别重逢+破镜重圆,双向奔赴的轻松甜暖之作 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"张不一"}, + {"title":" 扶华合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 绿:陪安东尼度过漫长岁月Ⅳ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 《铜雀锁金钗》民国虐心必看 榜单神作 人气作者 世味煮茶","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"世味煮茶"}, + {"title":" 骄阳似我上下 两册套装 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"顾漫"}, + {"title":" 八月的尾声,宛如世界末日 当当定制爱的箴言贺卡 电击小说大奖得主天泽夏月深情力作BE轻小说TOP","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m8.ddimg.cn/29/19/29934758-1_b_1755252822.jpg","author":"天泽夏月"}, + {"title":" 树下有片红房子(上下册)(青春群像小说,青梅竹马,暖甜治愈,体育生vs学霸)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小格"}, + {"title":" 偷月亮给你【亲签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"患者阿离"}, + {"title":" 《雪粒镇》(百万粉丝故事博主尸姐现实向长篇爱情小说力作。双向救赎X悬疑治愈,暗黑X光明,亲情X爱情)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"屋里丝丝"}, + {"title":" 你的名字。(新海诚亲笔撰写,同名电影原作小说简体中文版,撩动万千观众的青春情怀)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"新海诚"}, + {"title":" 青+蓝:陪安东尼度过漫长岁月V+VI 双册套装","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 可爱过敏原:全2册(人气作家稚楚温馨之作。随书附赠多重主题赠品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"稚楚"}, + {"title":" 第一瞳术师","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"喵喵大人"}, + {"title":" 你好,这种情况持续多久了(高人气作者温泉笨蛋治愈系甜文口碑代表作!随书附赠:折立卡+明信片+海报+书签+印刷特签)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"温泉笨蛋"}, + {"title":" 如果这一秒我没遇见你 张凌赫 王楚然主演 这一秒过火原著小说 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"匪我思存"}, + {"title":" 朝思慕暖","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼霜"}, + {"title":" 《最爱你的那十年》典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"无仪宁死"}, + {"title":" 提灯照河山(淮上作品,当当专享人物透卡)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"淮上"}, + {"title":" 夜幕之下全套123456789101112小说斩神凡尘神域三九音域我在精神病院学斩神漫画版 新番外徽章周边言情青春文学畅","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 营业悖论.完结篇:全2册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"稚楚"}, + {"title":" 偏偏宠爱(新版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"藤萝为枝"}, + {"title":" 我要你哄我 9.5分万人热评 80万人在线阅读娱乐圈恋综甜文 深藏不露小明星×高傲冷酷大歌神” 原来喜欢到了极致也会让人","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"幼儿园的卡耐基"}, + {"title":" 南北西东【当当特签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"拉面土豆丝"}, + {"title":" 《铜雀锁金钗2》民国虐心必看 人气作者 世味煮茶 桀骜不驯司令官 段烨霖 × 清冷傲人药铺大夫 许少棠","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"世味煮茶"}, + {"title":" 就我机灵(网络原名:百万UP学神天天演我 青春小说作家小霄轻松r热血校园力作!双标极致・追星成功・学神百大up窦晟 VS","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小霄"}, + {"title":" 我为你翻山越岭 限量印特签 人气作者小合鸽鸟子青春逐梦口碑作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小合鸽鸟子"}, + {"title":" 她的小梨涡","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唧唧的猫"}, + {"title":" 棠木依旧(人气作者米花BE美学短篇集)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"米花"}, + {"title":" 清明谷雨","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 有的是时间","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒远"}, + {"title":" 爱了很久的朋友","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"枝玖"}, + {"title":" 等风热吻你(7月5日19:00-7月6日24:00限时印特签,畅销书作家唧唧的猫口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唧唧的猫"}, + {"title":" 亿万斯年【特签版+当当定制一眼万年拍立得X2】高口碑作者狄戈浪漫缱绻之作典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"狄戈"}, + {"title":" 退烧 她他 望北楼 含栀 十里雾 棠木依旧(BE美学) 肆意 月下娇 心软 来我怀里躲躲 余生,请多指教 乖一点 当当自","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 微微一笑很倾城","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"顾漫"}, + {"title":" 黄:陪安东尼度过漫长岁月Ⅲ 全新典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"安东尼"}, + {"title":" 青玄","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"未小兮"}, + {"title":" 蔷薇信号(印签版)双女主青春成长短篇故事集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"艾姬"}, + {"title":" 磨牙(全2册)舒虞新作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒虞"}, + {"title":" 告白 王星越 邓恩熙同名电视剧 赠珠光明信片+海报+语音卡+立卡等人气作者应橙温柔细腻暗恋作品痞帅深情周京泽×温软坚定许","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"应橙"}, + {"title":" 附加遗产全两册无删减【赠送超清海报+异形卡+书签+贴纸】当当自营正版水千丞作品集深渊游戏火焰戎装逆锋逐王魂兵之戈 水千丞","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 你听你听,是那时候的声音","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"帘十里"}, + {"title":" 翻车指南(酱子贝代表作 网络原名:网恋翻车指南 全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酱子贝"}, + {"title":" 《我亲爱的法医小姐1+2》(全4册)磁扣盒装典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酒暖春深"}, + {"title":" 空白页 全两册 作者特签版 晋江金榜作家咬枝绿高口碑酸涩暗恋文 穷小子和小公主 新增未公开番外美梦成真 当当自营图书","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"咬枝绿"}, + {"title":" 含栀 印签版 当当定制半枝宇宙钻石卡X2 晋江人气作家鹿灵暗恋成真代表作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鹿灵"}, + {"title":" 融夏(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"话眠"}, + {"title":" 等我逢景+等我遇繁全2册【随书多重赠品】酱子贝文代表作 我等你很久了青春文学畅销实体书 磨铁图书当当自营正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 南方海啸 高人气作者卡比丘口碑力作 赵竞 韦嘉易 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"卡比丘"}, + {"title":" 《一级律师?典藏版(全三册)》人气作者木苏里 星际幻想力作 星际一级律师 顾晏×燕绥之 师生重逢,联手共寻基因真相 公理","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木苏里"}, + {"title":" 《祁望》祁纪之恋、娱乐圈、诟病、人气作者池总渣深情走心之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"池总渣"}, + {"title":" 苍兰诀 (当当专享人气画手眠狼绘制印刷海报)九鹭非香","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"九鹭非香"}, + {"title":" 海棠微雨共归途","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"肉包不吃肉"}, + {"title":" 海棠微雨共归途全套123456完结篇病案本第一辑 肉包不吃肉系列作品原小说二哈和他的白猫师尊实体书籍 海棠微雨共归途全套","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 皇上与我共战袍(上下)言情 爱情小说古代穿越 蔷薇书院","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"茴笙"}, + {"title":" 全世界都知道全二册 印签版 当当定制Q萌取景器透卡 网络原名全世界都知道她爱我 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼霜"}, + {"title":" 十里雾【特签版+当当定制流年日记本】BE美学意难平酸涩催泪之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"行迟"}, + {"title":" 【任选】她的山她的海3漫画&小说版&漫画单行本123全套 未删减【首刷限量胶片+印签绘+光栅卡+拍立得+折立卡等】限定花","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 春山喧 作者印特签版 番茄小说高人气娱乐圈竞技言情 被读者称为“姐狗文学天花板”","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"彼呦"}, + {"title":" 小清欢 云拿月 我欲将心养明月 多梨 低音调 初恋 雪梨 肆火 树延 偷月亮给你 患者阿离 人间情诗 佩奇酱 落雪满南山","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 橘子汽水(独家定制阿司匹林电子签名数字藏品――白城“舟渔”签名卡)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"阿司匹林"}, + {"title":" 雾色妄想全2册特签版 当当定制梨涡妹妹唱片CD透卡 高人气口碑作者一剪月璀璨暗恋之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"一剪月"}, + {"title":" 等我逢景+等我遇繁【文轩飞机盒定制版】放学等我完结篇 另著翻车指南 我行让我上 我等你很久了 世纪网缘 酱子贝文代表作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酱子贝"}, + {"title":" 诡界 谷悬小镇 特签版 作者夜来风雨声高口碑作品,网络原名《因为谨慎而过分凶狠》","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"夜来风雨声"}, + {"title":" 【麟潜小说合集】人鱼陷落全套12345完结篇人鱼陷落漫画蝶变123垂耳执事影成双遵命 人气作家麟潜经典青春文学小说作品合","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m7.ddimg.cn/50/15/11704168427-1_b_1720147472.jpg","author":"当当网"}, + {"title":" 黑天(全二册)护封典藏版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木苏里"}, + {"title":" 我亲爱的法医小姐1+2(全4册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"酒暖春深"}, + {"title":" 人鱼陷落全四册(畅销书作者麟潜口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"麟潜"}, + {"title":" 十五年等待候鸟完美纪念版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"盈风"}, + {"title":" 可爱多少钱一斤(共2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"栖见"}, + {"title":" 烟花","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"岩井俊二"}, + {"title":" 锦鲤游戏2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"夏季稻谷香"}, + {"title":" 【随机亲签】她的山她的海小说 扶华著【赠海报+印签绘+名卡+立卡等】当当自营正版未删减版继续献鱼末世第十年四十年后的爱人","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"扶华"}, + {"title":" 折枝:古风作家困倚危楼内地首次正式出版作品","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"困倚危楼"}, + {"title":" 难哄 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 女寝大逃亡1234全册完结篇 无删减【赠多张祝福卡+漫画豆本+折页+海报+学生档案卡】当当自营正版新锐青春作者火茶无限流","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 宁愿(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"藤萝为枝"}, + {"title":" 新婚燕尔(晋江高人气作家姜之鱼浪漫甜蜜力作)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"姜之鱼"}, + {"title":" 《尤物・情钟篇》人气作者二喜口碑破圈代表作,百万读者追更!穷追不舍总裁周易vs清冷美艳女主姜迎,十年暗恋,双向救赎,势均","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"二喜"}, + {"title":" 悲伤逆流成河","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"郭敬明"}, + {"title":" 附加遗产套装两册无删减【赠送超清海报+异型卡+书签+贴纸】当当自营正版 广东旅游出版社 新华书店正版保障","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"水千丞"}, + {"title":" 暗恋这件难过的小事","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"孟栀晚"}, + {"title":" 骄阳似我","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 你想都不要想(白月光口碑校园文,七寸汤包甜文代表作,随书附赠:精美书签+双人反差萌Q版折立卡2个+手绘海报)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"七寸汤包"}, + {"title":" 见天光(网络原名:暗河长明)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"冷山"}, + {"title":" 一枝 上下 完结篇 套装 绿山","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"绿山"}, + {"title":" 眼中星3 完结篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"蓝淋"}, + {"title":" 神之陨落(限量印签,网络名《杀穿副本后,我在规则里养大邪神》)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"白桃呜呜龙"}, + {"title":" 赤别【当当定制透卡】十清杳","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"十清杳"}, + {"title":" 江湖夜雨十年灯 印特签 周翊然 包上恩同名电视剧 知否知否应是绿肥红瘦 星汉灿烂,幸甚至哉 人气作者 关心则乱 古言江湖","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"关心则乱"}, + {"title":" 冬天请与我恋爱","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"江小绿"}, + {"title":" 朝俞1+2伪装学渣 雕刻典藏版凹刻版当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 摇摇晃晃的夜(人气作者 漾梨 豪门高干昆曲言情经典代表作 内含印特签 昆曲旗袍美人vs建筑系贵公子 新增出版番外《下雪的","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"漾梨"}, + {"title":" 当我飞奔向你","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 欲言难止2册12完结篇+十九日极夜12完结篇全两册 网络原名囚于永夜 麦香鸡呢著 飞行员上校陆赫扬x首席医生许则 晋江长","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 【古人很潮mook系列】君子温如玉2风与骨李白与君天下游苏轼人间惊鸿客词话少年间器与美少年魏晋美男志魏晋有美男君子温如玉","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 总有老师要请家长2 完结篇 晋江人气作家�Z梧 人气力作 温柔明艳祁言×清冷克制陆知乔","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"�Z梧"}, + {"title":" 遇阳 全2册 晋江甜文作者提裙代表作,网络原名《放学后别来我办公室》 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"提裙"}, + {"title":" 我们的夏天像电影 当当专享印特签","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"帘十里"}, + {"title":" 如果月亮有秘密(全2册)春风榴火作品,网络原名:反派大佬让我重生后救他","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"春风榴火"}, + {"title":" 桃李不言2 完结篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"一盏夜灯"}, + {"title":" 天亮了你就回来了亲签版 当当定制我们的回忆纪念簿 高口碑作家籽月BE虐恋代表作修订版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"籽月"}, + {"title":" 奶油味暗恋:全2册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"竹已"}, + {"title":" 宿命之舞 亲签版(网络原名《波斯刺客:囚徒之舞》畅销书作家崖生高人气口碑西幻文","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"崖生"}, + {"title":" 汀南丝雨【限量亲签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"狄戈"}, + {"title":" 潮沙(唯雾著)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唯雾"}, + {"title":" 绊橙(全2册)这碗粥著","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"这碗粥"}, + {"title":" 见春天+渡夏天+过秋天+在冬天+敬山水+北方有雪3册 纵虎嗅花四为一本完结+新番外 校园暗恋be青春言情小说实体书籍正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 耳东兔子合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 炽野(全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"简图"}, + {"title":" 黎明沉眠","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"岳千月"}, + {"title":" 黑白 新版(朝小诚代表作,全新逐字修订版)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"朝小诚"}, + {"title":" 酸糖 当当特签版 赠专享婚礼请帖+书签+珍藏卡+漫画卡头 黍枝著","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"黍枝"}, + {"title":" 本色 印特签 刷边版 网络原名 放肆 玄笺巅峰力作 一世清白秦意浓 VS 人间理想唐若遥 她终于不再是过客 她是个归人","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"玄笺"}, + {"title":" 此刻是春天卢思浩2025重磅新书 沉淀四年后又一长篇力作 你的一生永远拥有专属于自己的颜色 当当自营正版 新华书店旗舰店","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"卢思浩"}, + {"title":" 呼唤雨(名门望族事业型大小姐 & 唯大小姐主义航天大佬。《红酒绿》之后,你好《呼唤雨》。人气作者苏他笔下成熟人士的感情拉","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"苏他"}, + {"title":" 如此尔尔(全二册)【印签版】风流书呆著网络原名:爱谁谁","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"风流书呆"}, + {"title":" 偏宠(明艳乐团钢琴手×斯文清贵总裁/“年少的心动没有特定的契机,任何时刻,都是契机。年少的暗恋,是若无其事,又孤注一掷。","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"慕拉"}, + {"title":" 余生,请多指教(随书附赠时光日记本)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"柏林石匠"}, + {"title":" 名利场人(全2册)【特签版+当当定制度假区邀请函】超人气作家朝小诚豪门言情力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"朝小诚"}, + {"title":" 将军总被欺负哭全2册印签版 人气作家龚心文权谋古言力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"龚心文"}, + {"title":" 将进酒1+2全套4册完结唐酒卿小说晋江文学小说全套无删减正版 当当自营古言小说类似撒野轻狂死亡万花筒畅销书 当当自营正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唐酒卿"}, + {"title":" 第一战场指挥官・完结篇(共2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"退戈"}, + {"title":" 传闻 理我一下 野红莓 草茉莉 逐风 高温不退 二锅水 橙色风暴 弦风在耳 心有凌熙 当当自营","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 人鱼陷落1+2+3+4+5全套5册任选完结篇双封 漫画版高人气作者麟潜口碑代表作蝶变 黑暗中有白刺玫会陪你","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"//img3m4.ddimg.cn/82/10/12305578114-1_b_1755486817.jpg","author":"当当网"}, + {"title":" 【赠错题本+海报+合照等】以你为名的夏天 任凭舟著 新增番外 炽烈青春校园代表作青春文学小说当当自营正版","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"任凭舟"}, + {"title":" 顾小姐和曲小姐【赠:双熙写真签名照*1+影后盛典镭射票*1】(晚之著优质都市娱乐圈女性互助向励志作品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"晚之"}, + {"title":" 惊鸿(印特签版)古风双女主BE短篇小说集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"艾姬"}, + {"title":" 跨界演员(套装全2册)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"北南"}, + {"title":" 三遇咸鱼(全二册)(限量印特签;网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作,随书赠专享赠品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"比卡比"}, + {"title":" 逐夏两本套1+2完结篇【赠明信片+大头贴+许愿卡+海报+学生证等】新增8000字番外伪装学渣作者木瓜黄 九州出版社 当当","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 微光(全2册)人气作者鱼霜高口碑之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼霜"}, + {"title":" 你听得到--人气作者桑�d网配圈甜饼 人气歌手谢修弋×呆萌作家柯姣 我爱你,你听得到。随书附赠:告白场景四联卡、精美歌词卡","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"桑�d"}, + {"title":" 三遇咸鱼・完结篇(网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"比卡比"}, + {"title":" 尤物 新锐人气作者二喜口碑代表作 穷追不舍总裁周易vs清冷美艳公关姜迎 十年暗恋 双向救赎 势均力敌 炙热沦陷 明知道自","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"二喜"}, + {"title":" 此生便是渡海全2册 特签版 当当定制拍立得透卡 舒远酸涩青春口碑之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"舒远"}, + {"title":" 一枝完结篇","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"绿山"}, + {"title":" 下阵雨 【作者印特签版】(继《于春日热吻》后,人气作者礼也再写心动暗恋!实体新增未公开番外《黄粱梦》!随书赠珍藏版人生四","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"礼也"}, + {"title":" 云胡不喜 终章 (尼卡十年言情巨献大结局,百万读者口口相传的民国言情经典)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"尼卡"}, + {"title":" 敖敖待捕 2 漫画 知名漫画家药药代表之作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"药药"}, + {"title":" 我们的夏天像电影【作者特签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"帘十里"}, + {"title":" 白月光系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 暗恋这件难过的小事你失信了过秋天我只偷看他一眼潇潇雨声迟渡夏天侧耳在冬天等大鱼文化言情小说","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 我只喜欢你的人设1+2+3.完结篇(全3册)(当当专供)稚楚小说 可爱过敏原作者大结局,随书赠品25件","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 青春文学小说电视剧原著爱情言情小说套装:余生,请多指教+九州 斛珠夫人+海棠微雨共归途+欲言难止+香蜜沉沉烬如霜+金枪鱼","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 七天七夜完结篇【印签版】春风遥","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"春风遥"}, + {"title":" 狙击蝴蝶12全两册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 我欲将心养明月【特签版+定制印章+当当专享拍立得】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"多梨"}, + {"title":" 龙血 【首刷印特签本】大神作者水千丞热血高能之作 白金典藏版 新增未公开番外","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"水千丞"}, + {"title":" 好一个乖乖女 特签版 (柯淳、余茵主演同名短剧原著小说!番茄小说网巅峰榜年度爆款作品)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"我煞费苦心"}, + {"title":" 三秋缒系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 朝俞1+2伪装学渣未删减版【包邮+丰富赠品】正版当当自营全套激光雕刻典藏版【赠送朝俞同框手幅+大幅海报+同框卡+藏书票+","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"木瓜黄"}, + {"title":" 入池(网络原名:不要在垃圾桶里捡男朋友)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"骑鲸南去"}, + {"title":" 我又我又初恋了(限量亲签;人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"林绵绵"}, + {"title":" 我恋月亮","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"宁雨沉"}, + {"title":" 《热带公路》 旅途重启,继《今夜我在德令哈》之后林子律又一本高口碑公路文。日常文的温馨天花板,林子律超真诚的烟火气and","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"林子律"}, + {"title":" 八目迷系列","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 诱摘野玫瑰【当当印签版+定制官宣时刻拍立得x2】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"一剪月"}, + {"title":" 送你春花 病弱天才少女与不羁自由学长 临死前再相爱一次的虐心BE 实体新增番外两则 随书附赠 下一站车票 祈福御守书签","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"初厘"}, + {"title":" 逃离图书馆2(蝶之灵著)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"蝶之灵"}, + {"title":" 第一战场指挥官(共2册)【印签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"退戈"}, + {"title":" 他又吃醋了2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"蓝手"}, + {"title":" 娇嗔","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"时星草"}, + {"title":" 你听得见","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"应橙"}, + {"title":" 落雪满南山","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"明开夜合"}, + {"title":" Twentine合集","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 你如北京美丽(许凯、谭松韵《你比星光美丽》原著小说,韩廷 纪星,随书赠星星原谅卡、Q版拍立得、星光藏书票,玖月��现实向燃","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"玖月��"}, + {"title":" 端午 言情小说 校园故事 晋江文学 品丰著","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"品丰"}, + {"title":" 纸飞机","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"潭石"}, + {"title":" 黎明之上2","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"仄黎"}, + {"title":" 一笙有喜 亲签500册","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"鱼不语"}, + {"title":" 【官方正版】奇洛李维斯回信(高人气作者清明谷雨口碑代表作!)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"清明谷雨"}, + {"title":" 驻我心间【定制表情包贴纸】殊娓甜宠新作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"殊娓"}, + {"title":" 赤别 别恋 金丝笼 妈,救命 诱摘野玫瑰 日偏食 巴掌印 刻骨 皇冠梨售罄 装聋作哑 梦蝶庄生 黄粱遗梦 留白 他说 在","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"当当网"}, + {"title":" 见月 作者特签版 高人气作者小西饼口碑代表作 高岭之花钢琴才子周映希和洒脱随性美艳法医黎芙 浪漫异国恋 当当自营图书","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"小西饼"}, + {"title":" 女寝大逃亡1+2+3全册 无删减 新锐青春作者火茶无限流代表作 【新增番外+折页+海报+学生档案卡】女性群像惊险刺激的寝","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"火茶"}, + {"title":" 檀笛","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"东施娘"}, + {"title":" 我又我又初恋了・完结篇(人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"林绵绵"}, + {"title":" 初恋【当当定制Q萌折立卡】人气作者雪莉久别重逢口碑力作","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"雪莉"}, + {"title":" 迟音【当当亲签版】","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"唯雾"}, + {"title":" 入戏之后 全两册(高人气作家时星草继《娇嗔》后又一甜宠力作,坚定奔赴,温柔守候)","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"时星草"}, + {"title":" 河清海晏 橘子不酸 畅销书排行榜15000+评论热议治愈心灵的书200万读者含泪力荐知乎高口碑虐文17W高催泪神作言情当","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"橘子不酸"}, + {"title":" 吞海3大结局 淮上 小说 破云123同享世界观 青春文学小说畅销实体书言情 磨铁图书旗舰店正版书籍言情","price":0.00,"originalPrice":0.00,"discount":10.0,"imageUrl":"images/model/guan/url_none.png","author":"淮上"} +] \ No newline at end of file diff --git a/Project/dangdang_books.txt b/Project/dangdang_books.txt new file mode 100644 index 0000000..ca81149 --- /dev/null +++ b/Project/dangdang_books.txt @@ -0,0 +1,238 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author + 陪安东尼度过漫长岁月 全六册 加赠亲签明信片 当当自营,0.00,0.00,10.0,//img3m8.ddimg.cn/54/3/29680848-1_b_1779433977.jpg,安东尼 + 小清欢【印特签版+当当定制贴纸】,0.00,0.00,10.0,images/model/guan/url_none.png,云拿月 + 红:陪安东尼度过漫长岁月Ⅰ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 没有明天的我们,在昨天相恋【当当定制衔尾蛇镭射怀表X2】第八届网络小说大奖获奖作品,0.00,0.00,10.0,images/model/guan/url_none.png,星火燎原 + 那个不为人知的故事 Twentine(无量渡口)BE美学代表作品,0.00,0.00,10.0,images/model/guan/url_none.png,Twentine + 朝俞1+2伪装学渣 限定正面白版护封+背面黑版护封套装 青春畅销小说实体书 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 红酒绿 苏他代表作,0.00,0.00,10.0,images/model/guan/url_none.png,苏他 + 奇洛李维斯回信(高人气作者清明谷雨口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,清明谷雨 + 他笑时风华正茂【印特签版+当当专享印制作者手写明信片】舒远,0.00,0.00,10.0,images/model/guan/url_none.png,舒远 + 渡厄【印签版+当当定制信纸x2】杨溯,0.00,0.00,10.0,images/model/guan/url_none.png,杨溯 + 蓝:陪安东尼度过漫长岁月VI(首发加赠当当限定赠品:PET菲林胶片x2张)陪安系列的15年暖心陪伴,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 元气少女缘结神:鞍马山夜话(甜蜜少女系漫画官方中文纪念版首次上市!),0.00,0.00,10.0,images/model/guan/url_none.png,Haruka + 陪安东尼度过漫长岁月,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 他在云之南 印特签 景行高人气经典口碑力作 相遇十年典藏版 新增万字番外+作者前言,0.00,0.00,10.0,images/model/guan/url_none.png,景行 + 青:陪安东尼度过漫长岁月5,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 别踮脚我低头印签版 当当定制关于你的拍立得 纯爱言情作者君不弃校园甜宠悸动之作 网络原名她不乖要哄,0.00,0.00,10.0,images/model/guan/url_none.png,君不弃 + 青:陪安东尼度过漫长岁月Ⅴ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 梦蝶庄生(网络原名:还剩三个月命请让我从容赴S)番茄9.8高分BE美学力作,0.00,0.00,10.0,images/model/guan/url_none.png,高卧北 + 退烧(全二册)舒虞浪漫新作,0.00,0.00,10.0,images/model/guan/url_none.png,舒虞 + 与岁长宁 上册 追光救赎 高口碑古言 嫁反派 娇娇贵女x乖张美强惨 反派 男主 她是他心尖上的善念 是刻在他伤痕上的名字,0.00,0.00,10.0,images/model/guan/url_none.png,布丁琉璃 + 渡夏天,0.00,0.00,10.0,images/model/guan/url_none.png,甜野豹 + 蓝:陪安东尼度过漫长岁月VI 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 人鱼陷落:完结篇 畅销书作者麟潜口碑代表作!,0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 《你是长夜,也是灯火》典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,岁惟 + 人鱼陷落全五册(畅销书作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 橙:陪安东尼度过漫长岁月Ⅱ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 深情眼(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,耳东兔子 + 晋江人气作者木羽愿高口碑双向奔赴代表作《纵我情深》破镜重圆vs蓄谋已久,全文高甜!新增出版番外《婚后生活》,续写“傅姜夫,0.00,0.00,10.0,images/model/guan/url_none.png,木羽愿 + 人鱼陷落(高人气作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 打火机与公主裙(荒草园+长明灯)全2册 Twentine著 陈飞宇、张婧仪 主演影视剧“点燃我,温暖你”原著小说,0.00,0.00,10.0,images/model/guan/url_none.png,Twentine + 《阿也(全二册)》刷边典藏版 我喜欢你的信息素 引路星 全新番外,0.00,0.00,10.0,images/model/guan/url_none.png,引路星 + 纸飞机1+2,0.00,0.00,10.0,images/model/guan/url_none.png,潭石 + 人鱼陷落3(长佩原创人气文学,高人气作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 最好的我们:全三册(八月长安“振华中学”系列代表作,十周年典藏版。新增 10P后记《罗德赛塔西亚是一封情书》),0.00,0.00,10.0,images/model/guan/url_none.png,八月长安 + 骄阳似我下 完结篇 印签版 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧,0.00,0.00,10.0,images/model/guan/url_none.png,顾漫 + 我不喜欢这世界,我只喜欢你修订版 乔一 畅销百万册!由吴倩张雨剑主演的超甜电视剧我只喜欢你原著小说,0.00,0.00,10.0,images/model/guan/url_none.png,乔一 + 你失信了,0.00,0.00,10.0,images/model/guan/url_none.png,十清杳 + 缠 网络原名《真香》 ,《二锅水》作者烟猫与酒“治愈”向代表作 年度情感催泪大戏,一段“心”连接的亲情 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,烟猫与酒 + 太岁(《杀破狼》《残次品》《默读》《镇魂》作者、高人气畅销书作家Priest无CP力作),0.00,0.00,10.0,images/model/guan/url_none.png,Priest + 人鱼陷落2(高人气作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 《别来无恙》晋江文学城畅销书作家 北南 经典虐心作品原著同名漫画 破镜重圆天花板,0.00,0.00,10.0,images/model/guan/url_none.png,北南 + 朝俞1+2套装(全2册)原名伪装学渣 现象级青春小说,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 告白2完结篇 王星越 邓恩熙同名电视剧 赠手绘卡片+告白信+贴纸+婚礼请柬+海报+登机牌+藏书票+书签 应橙暗恋作品新增,0.00,0.00,10.0,images/model/guan/url_none.png,应橙 + 旧故新长:诗无茶代表作青春文学治愈系小说,0.00,0.00,10.0,images/model/guan/url_none.png,诗无茶 + 拉勾(全2册)春风榴火作品,网络原名:我是顶流巨星亲孙女,0.00,0.00,10.0,images/model/guan/url_none.png,春风榴火 + 有匪全集(赵丽颖、王一博主演《有翡》原著小说。Priest扛鼎之作,全4册),0.00,0.00,10.0,images/model/guan/url_none.png,Priest + 黄粱遗梦【当当网印签版】人气作家高卧北催泪力作!,0.00,0.00,10.0,images/model/guan/url_none.png,高卧北 + 伪装学渣未删减12这题超纲了朝俞七芒星逐夏一觉醒来全套完结篇【木瓜黄小说合集】木瓜黄伪装学渣经典青春文学小说作品合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 那个不为人知的故事 寂静深处有人家 Twentine(无量渡口) 名利场人 朝暮不相迟 以你为名的夏天 她等待刀锋已久,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 梦蝶庄生 黄粱遗梦 套装 高卧北,0.00,0.00,10.0,images/model/guan/url_none.png,高卧北 + 难哄 2册全集 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 神之陨落2 限量印特签 网络名《杀穿副本后,我在规则里养大邪神》番茄小说人气作者白桃呜呜龙无限流大作,0.00,0.00,10.0,images/model/guan/url_none.png,白桃呜呜龙 + 网恋被骗八百次,0.00,0.00,10.0,images/model/guan/url_none.png,熊也 + 人鱼陷落4(畅销书作者麟潜口碑代表作!当当专享电子屏保),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 你说巧不巧 全二册 久别重逢+破镜重圆,双向奔赴的轻松甜暖之作 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,张不一 + 扶华合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 绿:陪安东尼度过漫长岁月Ⅳ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 《铜雀锁金钗》民国虐心必看 榜单神作 人气作者 世味煮茶,0.00,0.00,10.0,images/model/guan/url_none.png,世味煮茶 + 骄阳似我上下 两册套装 青春言情小说畅销书作家顾漫 宋威龙、赵今麦主演同名电视剧,0.00,0.00,10.0,images/model/guan/url_none.png,顾漫 + 八月的尾声,宛如世界末日 当当定制爱的箴言贺卡 电击小说大奖得主天泽夏月深情力作BE轻小说TOP,0.00,0.00,10.0,//img3m8.ddimg.cn/29/19/29934758-1_b_1755252822.jpg,天泽夏月 + 树下有片红房子(上下册)(青春群像小说,青梅竹马,暖甜治愈,体育生vs学霸),0.00,0.00,10.0,images/model/guan/url_none.png,小格 + 偷月亮给你【亲签版】,0.00,0.00,10.0,images/model/guan/url_none.png,患者阿离 + 《雪粒镇》(百万粉丝故事博主尸姐现实向长篇爱情小说力作。双向救赎X悬疑治愈,暗黑X光明,亲情X爱情),0.00,0.00,10.0,images/model/guan/url_none.png,屋里丝丝 + 你的名字。(新海诚亲笔撰写,同名电影原作小说简体中文版,撩动万千观众的青春情怀),0.00,0.00,10.0,images/model/guan/url_none.png,新海诚 + 青+蓝:陪安东尼度过漫长岁月V+VI 双册套装,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 可爱过敏原:全2册(人气作家稚楚温馨之作。随书附赠多重主题赠品),0.00,0.00,10.0,images/model/guan/url_none.png,稚楚 + 第一瞳术师,0.00,0.00,10.0,images/model/guan/url_none.png,喵喵大人 + 你好,这种情况持续多久了(高人气作者温泉笨蛋治愈系甜文口碑代表作!随书附赠:折立卡+明信片+海报+书签+印刷特签),0.00,0.00,10.0,images/model/guan/url_none.png,温泉笨蛋 + 如果这一秒我没遇见你 张凌赫 王楚然主演 这一秒过火原著小说 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,匪我思存 + 朝思慕暖,0.00,0.00,10.0,images/model/guan/url_none.png,鱼霜 + 《最爱你的那十年》典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,无仪宁死 + 提灯照河山(淮上作品,当当专享人物透卡),0.00,0.00,10.0,images/model/guan/url_none.png,淮上 + 夜幕之下全套123456789101112小说斩神凡尘神域三九音域我在精神病院学斩神漫画版 新番外徽章周边言情青春文学畅,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 营业悖论.完结篇:全2册,0.00,0.00,10.0,images/model/guan/url_none.png,稚楚 + 偏偏宠爱(新版),0.00,0.00,10.0,images/model/guan/url_none.png,藤萝为枝 + 我要你哄我 9.5分万人热评 80万人在线阅读娱乐圈恋综甜文 深藏不露小明星×高傲冷酷大歌神” 原来喜欢到了极致也会让人,0.00,0.00,10.0,images/model/guan/url_none.png,幼儿园的卡耐基 + 南北西东【当当特签版】,0.00,0.00,10.0,images/model/guan/url_none.png,拉面土豆丝 + 《铜雀锁金钗2》民国虐心必看 人气作者 世味煮茶 桀骜不驯司令官 段烨霖 × 清冷傲人药铺大夫 许少棠,0.00,0.00,10.0,images/model/guan/url_none.png,世味煮茶 + 就我机灵(网络原名:百万UP学神天天演我 青春小说作家小霄轻松r热血校园力作!双标极致・追星成功・学神百大up窦晟 VS,0.00,0.00,10.0,images/model/guan/url_none.png,小霄 + 我为你翻山越岭 限量印特签 人气作者小合鸽鸟子青春逐梦口碑作,0.00,0.00,10.0,images/model/guan/url_none.png,小合鸽鸟子 + 她的小梨涡,0.00,0.00,10.0,images/model/guan/url_none.png,唧唧的猫 + 棠木依旧(人气作者米花BE美学短篇集),0.00,0.00,10.0,images/model/guan/url_none.png,米花 + 清明谷雨,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 有的是时间,0.00,0.00,10.0,images/model/guan/url_none.png,舒远 + 爱了很久的朋友,0.00,0.00,10.0,images/model/guan/url_none.png,枝玖 + 等风热吻你(7月5日19:00-7月6日24:00限时印特签,畅销书作家唧唧的猫口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,唧唧的猫 + 亿万斯年【特签版+当当定制一眼万年拍立得X2】高口碑作者狄戈浪漫缱绻之作典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,狄戈 + 退烧 她他 望北楼 含栀 十里雾 棠木依旧(BE美学) 肆意 月下娇 心软 来我怀里躲躲 余生,请多指教 乖一点 当当自,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 微微一笑很倾城,0.00,0.00,10.0,images/model/guan/url_none.png,顾漫 + 黄:陪安东尼度过漫长岁月Ⅲ 全新典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,安东尼 + 青玄,0.00,0.00,10.0,images/model/guan/url_none.png,未小兮 + 蔷薇信号(印签版)双女主青春成长短篇故事集,0.00,0.00,10.0,images/model/guan/url_none.png,艾姬 + 磨牙(全2册)舒虞新作,0.00,0.00,10.0,images/model/guan/url_none.png,舒虞 + 告白 王星越 邓恩熙同名电视剧 赠珠光明信片+海报+语音卡+立卡等人气作者应橙温柔细腻暗恋作品痞帅深情周京泽×温软坚定许,0.00,0.00,10.0,images/model/guan/url_none.png,应橙 + 附加遗产全两册无删减【赠送超清海报+异形卡+书签+贴纸】当当自营正版水千丞作品集深渊游戏火焰戎装逆锋逐王魂兵之戈 水千丞,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 你听你听,是那时候的声音,0.00,0.00,10.0,images/model/guan/url_none.png,帘十里 + 翻车指南(酱子贝代表作 网络原名:网恋翻车指南 全2册),0.00,0.00,10.0,images/model/guan/url_none.png,酱子贝 + 《我亲爱的法医小姐1+2》(全4册)磁扣盒装典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,酒暖春深 + 空白页 全两册 作者特签版 晋江金榜作家咬枝绿高口碑酸涩暗恋文 穷小子和小公主 新增未公开番外美梦成真 当当自营图书,0.00,0.00,10.0,images/model/guan/url_none.png,咬枝绿 + 含栀 印签版 当当定制半枝宇宙钻石卡X2 晋江人气作家鹿灵暗恋成真代表作,0.00,0.00,10.0,images/model/guan/url_none.png,鹿灵 + 融夏(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,话眠 + 等我逢景+等我遇繁全2册【随书多重赠品】酱子贝文代表作 我等你很久了青春文学畅销实体书 磨铁图书当当自营正版,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 南方海啸 高人气作者卡比丘口碑力作 赵竞 韦嘉易 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,卡比丘 + 《一级律师?典藏版(全三册)》人气作者木苏里 星际幻想力作 星际一级律师 顾晏×燕绥之 师生重逢,联手共寻基因真相 公理,0.00,0.00,10.0,images/model/guan/url_none.png,木苏里 + 《祁望》祁纪之恋、娱乐圈、诟病、人气作者池总渣深情走心之作,0.00,0.00,10.0,images/model/guan/url_none.png,池总渣 + 苍兰诀 (当当专享人气画手眠狼绘制印刷海报)九鹭非香,0.00,0.00,10.0,images/model/guan/url_none.png,九鹭非香 + 海棠微雨共归途,0.00,0.00,10.0,images/model/guan/url_none.png,肉包不吃肉 + 海棠微雨共归途全套123456完结篇病案本第一辑 肉包不吃肉系列作品原小说二哈和他的白猫师尊实体书籍 海棠微雨共归途全套,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 皇上与我共战袍(上下)言情 爱情小说古代穿越 蔷薇书院,0.00,0.00,10.0,images/model/guan/url_none.png,茴笙 + 全世界都知道全二册 印签版 当当定制Q萌取景器透卡 网络原名全世界都知道她爱我 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,鱼霜 + 十里雾【特签版+当当定制流年日记本】BE美学意难平酸涩催泪之作,0.00,0.00,10.0,images/model/guan/url_none.png,行迟 + 【任选】她的山她的海3漫画&小说版&漫画单行本123全套 未删减【首刷限量胶片+印签绘+光栅卡+拍立得+折立卡等】限定花,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 春山喧 作者印特签版 番茄小说高人气娱乐圈竞技言情 被读者称为“姐狗文学天花板”,0.00,0.00,10.0,images/model/guan/url_none.png,彼呦 + 小清欢 云拿月 我欲将心养明月 多梨 低音调 初恋 雪梨 肆火 树延 偷月亮给你 患者阿离 人间情诗 佩奇酱 落雪满南山,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 橘子汽水(独家定制阿司匹林电子签名数字藏品――白城“舟渔”签名卡),0.00,0.00,10.0,images/model/guan/url_none.png,阿司匹林 + 雾色妄想全2册特签版 当当定制梨涡妹妹唱片CD透卡 高人气口碑作者一剪月璀璨暗恋之作,0.00,0.00,10.0,images/model/guan/url_none.png,一剪月 + 等我逢景+等我遇繁【文轩飞机盒定制版】放学等我完结篇 另著翻车指南 我行让我上 我等你很久了 世纪网缘 酱子贝文代表作,0.00,0.00,10.0,images/model/guan/url_none.png,酱子贝 + 诡界 谷悬小镇 特签版 作者夜来风雨声高口碑作品,网络原名《因为谨慎而过分凶狠》,0.00,0.00,10.0,images/model/guan/url_none.png,夜来风雨声 + 【麟潜小说合集】人鱼陷落全套12345完结篇人鱼陷落漫画蝶变123垂耳执事影成双遵命 人气作家麟潜经典青春文学小说作品合,0.00,0.00,10.0,//img3m7.ddimg.cn/50/15/11704168427-1_b_1720147472.jpg,当当网 + 黑天(全二册)护封典藏版,0.00,0.00,10.0,images/model/guan/url_none.png,木苏里 + 我亲爱的法医小姐1+2(全4册),0.00,0.00,10.0,images/model/guan/url_none.png,酒暖春深 + 人鱼陷落全四册(畅销书作者麟潜口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,麟潜 + 十五年等待候鸟完美纪念版,0.00,0.00,10.0,images/model/guan/url_none.png,盈风 + 可爱多少钱一斤(共2册),0.00,0.00,10.0,images/model/guan/url_none.png,栖见 + 烟花,0.00,0.00,10.0,images/model/guan/url_none.png,岩井俊二 + 锦鲤游戏2,0.00,0.00,10.0,images/model/guan/url_none.png,夏季稻谷香 + 【随机亲签】她的山她的海小说 扶华著【赠海报+印签绘+名卡+立卡等】当当自营正版未删减版继续献鱼末世第十年四十年后的爱人,0.00,0.00,10.0,images/model/guan/url_none.png,扶华 + 折枝:古风作家困倚危楼内地首次正式出版作品,0.00,0.00,10.0,images/model/guan/url_none.png,困倚危楼 + 难哄 白敬亭章若楠领衔主演电视剧《难哄》原著小说,《偷偷藏不住》姊妹篇,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 女寝大逃亡1234全册完结篇 无删减【赠多张祝福卡+漫画豆本+折页+海报+学生档案卡】当当自营正版新锐青春作者火茶无限流,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 宁愿(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,藤萝为枝 + 新婚燕尔(晋江高人气作家姜之鱼浪漫甜蜜力作),0.00,0.00,10.0,images/model/guan/url_none.png,姜之鱼 + 《尤物・情钟篇》人气作者二喜口碑破圈代表作,百万读者追更!穷追不舍总裁周易vs清冷美艳女主姜迎,十年暗恋,双向救赎,势均,0.00,0.00,10.0,images/model/guan/url_none.png,二喜 + 悲伤逆流成河,0.00,0.00,10.0,images/model/guan/url_none.png,郭敬明 + 附加遗产套装两册无删减【赠送超清海报+异型卡+书签+贴纸】当当自营正版 广东旅游出版社 新华书店正版保障,0.00,0.00,10.0,images/model/guan/url_none.png,水千丞 + 暗恋这件难过的小事,0.00,0.00,10.0,images/model/guan/url_none.png,孟栀晚 + 骄阳似我,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 你想都不要想(白月光口碑校园文,七寸汤包甜文代表作,随书附赠:精美书签+双人反差萌Q版折立卡2个+手绘海报),0.00,0.00,10.0,images/model/guan/url_none.png,七寸汤包 + 见天光(网络原名:暗河长明),0.00,0.00,10.0,images/model/guan/url_none.png,冷山 + 一枝 上下 完结篇 套装 绿山,0.00,0.00,10.0,images/model/guan/url_none.png,绿山 + 眼中星3 完结篇,0.00,0.00,10.0,images/model/guan/url_none.png,蓝淋 + 神之陨落(限量印签,网络名《杀穿副本后,我在规则里养大邪神》),0.00,0.00,10.0,images/model/guan/url_none.png,白桃呜呜龙 + 赤别【当当定制透卡】十清杳,0.00,0.00,10.0,images/model/guan/url_none.png,十清杳 + 江湖夜雨十年灯 印特签 周翊然 包上恩同名电视剧 知否知否应是绿肥红瘦 星汉灿烂,幸甚至哉 人气作者 关心则乱 古言江湖,0.00,0.00,10.0,images/model/guan/url_none.png,关心则乱 + 冬天请与我恋爱,0.00,0.00,10.0,images/model/guan/url_none.png,江小绿 + 朝俞1+2伪装学渣 雕刻典藏版凹刻版当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 摇摇晃晃的夜(人气作者 漾梨 豪门高干昆曲言情经典代表作 内含印特签 昆曲旗袍美人vs建筑系贵公子 新增出版番外《下雪的,0.00,0.00,10.0,images/model/guan/url_none.png,漾梨 + 当我飞奔向你,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 欲言难止2册12完结篇+十九日极夜12完结篇全两册 网络原名囚于永夜 麦香鸡呢著 飞行员上校陆赫扬x首席医生许则 晋江长,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 【古人很潮mook系列】君子温如玉2风与骨李白与君天下游苏轼人间惊鸿客词话少年间器与美少年魏晋美男志魏晋有美男君子温如玉,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 总有老师要请家长2 完结篇 晋江人气作家�Z梧 人气力作 温柔明艳祁言×清冷克制陆知乔,0.00,0.00,10.0,images/model/guan/url_none.png,�Z梧 + 遇阳 全2册 晋江甜文作者提裙代表作,网络原名《放学后别来我办公室》 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,提裙 + 我们的夏天像电影 当当专享印特签,0.00,0.00,10.0,images/model/guan/url_none.png,帘十里 + 如果月亮有秘密(全2册)春风榴火作品,网络原名:反派大佬让我重生后救他,0.00,0.00,10.0,images/model/guan/url_none.png,春风榴火 + 桃李不言2 完结篇,0.00,0.00,10.0,images/model/guan/url_none.png,一盏夜灯 + 天亮了你就回来了亲签版 当当定制我们的回忆纪念簿 高口碑作家籽月BE虐恋代表作修订版,0.00,0.00,10.0,images/model/guan/url_none.png,籽月 + 奶油味暗恋:全2册,0.00,0.00,10.0,images/model/guan/url_none.png,竹已 + 宿命之舞 亲签版(网络原名《波斯刺客:囚徒之舞》畅销书作家崖生高人气口碑西幻文,0.00,0.00,10.0,images/model/guan/url_none.png,崖生 + 汀南丝雨【限量亲签版】,0.00,0.00,10.0,images/model/guan/url_none.png,狄戈 + 潮沙(唯雾著),0.00,0.00,10.0,images/model/guan/url_none.png,唯雾 + 绊橙(全2册)这碗粥著,0.00,0.00,10.0,images/model/guan/url_none.png,这碗粥 + 见春天+渡夏天+过秋天+在冬天+敬山水+北方有雪3册 纵虎嗅花四为一本完结+新番外 校园暗恋be青春言情小说实体书籍正版,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 耳东兔子合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 炽野(全2册),0.00,0.00,10.0,images/model/guan/url_none.png,简图 + 黎明沉眠,0.00,0.00,10.0,images/model/guan/url_none.png,岳千月 + 黑白 新版(朝小诚代表作,全新逐字修订版),0.00,0.00,10.0,images/model/guan/url_none.png,朝小诚 + 酸糖 当当特签版 赠专享婚礼请帖+书签+珍藏卡+漫画卡头 黍枝著,0.00,0.00,10.0,images/model/guan/url_none.png,黍枝 + 本色 印特签 刷边版 网络原名 放肆 玄笺巅峰力作 一世清白秦意浓 VS 人间理想唐若遥 她终于不再是过客 她是个归人,0.00,0.00,10.0,images/model/guan/url_none.png,玄笺 + 此刻是春天卢思浩2025重磅新书 沉淀四年后又一长篇力作 你的一生永远拥有专属于自己的颜色 当当自营正版 新华书店旗舰店,0.00,0.00,10.0,images/model/guan/url_none.png,卢思浩 + 呼唤雨(名门望族事业型大小姐 & 唯大小姐主义航天大佬。《红酒绿》之后,你好《呼唤雨》。人气作者苏他笔下成熟人士的感情拉,0.00,0.00,10.0,images/model/guan/url_none.png,苏他 + 如此尔尔(全二册)【印签版】风流书呆著网络原名:爱谁谁,0.00,0.00,10.0,images/model/guan/url_none.png,风流书呆 + 偏宠(明艳乐团钢琴手×斯文清贵总裁/“年少的心动没有特定的契机,任何时刻,都是契机。年少的暗恋,是若无其事,又孤注一掷。,0.00,0.00,10.0,images/model/guan/url_none.png,慕拉 + 余生,请多指教(随书附赠时光日记本),0.00,0.00,10.0,images/model/guan/url_none.png,柏林石匠 + 名利场人(全2册)【特签版+当当定制度假区邀请函】超人气作家朝小诚豪门言情力作,0.00,0.00,10.0,images/model/guan/url_none.png,朝小诚 + 将军总被欺负哭全2册印签版 人气作家龚心文权谋古言力作,0.00,0.00,10.0,images/model/guan/url_none.png,龚心文 + 将进酒1+2全套4册完结唐酒卿小说晋江文学小说全套无删减正版 当当自营古言小说类似撒野轻狂死亡万花筒畅销书 当当自营正版,0.00,0.00,10.0,images/model/guan/url_none.png,唐酒卿 + 第一战场指挥官・完结篇(共2册),0.00,0.00,10.0,images/model/guan/url_none.png,退戈 + 传闻 理我一下 野红莓 草茉莉 逐风 高温不退 二锅水 橙色风暴 弦风在耳 心有凌熙 当当自营,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 人鱼陷落1+2+3+4+5全套5册任选完结篇双封 漫画版高人气作者麟潜口碑代表作蝶变 黑暗中有白刺玫会陪你,0.00,0.00,10.0,//img3m4.ddimg.cn/82/10/12305578114-1_b_1755486817.jpg,当当网 + 【赠错题本+海报+合照等】以你为名的夏天 任凭舟著 新增番外 炽烈青春校园代表作青春文学小说当当自营正版,0.00,0.00,10.0,images/model/guan/url_none.png,任凭舟 + 顾小姐和曲小姐【赠:双熙写真签名照*1+影后盛典镭射票*1】(晚之著优质都市娱乐圈女性互助向励志作品),0.00,0.00,10.0,images/model/guan/url_none.png,晚之 + 惊鸿(印特签版)古风双女主BE短篇小说集,0.00,0.00,10.0,images/model/guan/url_none.png,艾姬 + 跨界演员(套装全2册),0.00,0.00,10.0,images/model/guan/url_none.png,北南 + 三遇咸鱼(全二册)(限量印特签;网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作,随书赠专享赠品),0.00,0.00,10.0,images/model/guan/url_none.png,比卡比 + 逐夏两本套1+2完结篇【赠明信片+大头贴+许愿卡+海报+学生证等】新增8000字番外伪装学渣作者木瓜黄 九州出版社 当当,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 微光(全2册)人气作者鱼霜高口碑之作,0.00,0.00,10.0,images/model/guan/url_none.png,鱼霜 + 你听得到--人气作者桑�d网配圈甜饼 人气歌手谢修弋×呆萌作家柯姣 我爱你,你听得到。随书附赠:告白场景四联卡、精美歌词卡,0.00,0.00,10.0,images/model/guan/url_none.png,桑�d + 三遇咸鱼・完结篇(网络名《三嫁咸鱼》,高人气作家比卡比古风治愈系力作),0.00,0.00,10.0,images/model/guan/url_none.png,比卡比 + 尤物 新锐人气作者二喜口碑代表作 穷追不舍总裁周易vs清冷美艳公关姜迎 十年暗恋 双向救赎 势均力敌 炙热沦陷 明知道自,0.00,0.00,10.0,images/model/guan/url_none.png,二喜 + 此生便是渡海全2册 特签版 当当定制拍立得透卡 舒远酸涩青春口碑之作,0.00,0.00,10.0,images/model/guan/url_none.png,舒远 + 一枝完结篇,0.00,0.00,10.0,images/model/guan/url_none.png,绿山 + 下阵雨 【作者印特签版】(继《于春日热吻》后,人气作者礼也再写心动暗恋!实体新增未公开番外《黄粱梦》!随书赠珍藏版人生四,0.00,0.00,10.0,images/model/guan/url_none.png,礼也 + 云胡不喜 终章 (尼卡十年言情巨献大结局,百万读者口口相传的民国言情经典),0.00,0.00,10.0,images/model/guan/url_none.png,尼卡 + 敖敖待捕 2 漫画 知名漫画家药药代表之作,0.00,0.00,10.0,images/model/guan/url_none.png,药药 + 我们的夏天像电影【作者特签版】,0.00,0.00,10.0,images/model/guan/url_none.png,帘十里 + 白月光系列,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 暗恋这件难过的小事你失信了过秋天我只偷看他一眼潇潇雨声迟渡夏天侧耳在冬天等大鱼文化言情小说,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 我只喜欢你的人设1+2+3.完结篇(全3册)(当当专供)稚楚小说 可爱过敏原作者大结局,随书赠品25件,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 青春文学小说电视剧原著爱情言情小说套装:余生,请多指教+九州 斛珠夫人+海棠微雨共归途+欲言难止+香蜜沉沉烬如霜+金枪鱼,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 七天七夜完结篇【印签版】春风遥,0.00,0.00,10.0,images/model/guan/url_none.png,春风遥 + 狙击蝴蝶12全两册,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 我欲将心养明月【特签版+定制印章+当当专享拍立得】,0.00,0.00,10.0,images/model/guan/url_none.png,多梨 + 龙血 【首刷印特签本】大神作者水千丞热血高能之作 白金典藏版 新增未公开番外,0.00,0.00,10.0,images/model/guan/url_none.png,水千丞 + 好一个乖乖女 特签版 (柯淳、余茵主演同名短剧原著小说!番茄小说网巅峰榜年度爆款作品),0.00,0.00,10.0,images/model/guan/url_none.png,我煞费苦心 + 三秋缒系列,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 朝俞1+2伪装学渣未删减版【包邮+丰富赠品】正版当当自营全套激光雕刻典藏版【赠送朝俞同框手幅+大幅海报+同框卡+藏书票+,0.00,0.00,10.0,images/model/guan/url_none.png,木瓜黄 + 入池(网络原名:不要在垃圾桶里捡男朋友),0.00,0.00,10.0,images/model/guan/url_none.png,骑鲸南去 + 我又我又初恋了(限量亲签;人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”),0.00,0.00,10.0,images/model/guan/url_none.png,林绵绵 + 我恋月亮,0.00,0.00,10.0,images/model/guan/url_none.png,宁雨沉 + 《热带公路》 旅途重启,继《今夜我在德令哈》之后林子律又一本高口碑公路文。日常文的温馨天花板,林子律超真诚的烟火气and,0.00,0.00,10.0,images/model/guan/url_none.png,林子律 + 八目迷系列,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 诱摘野玫瑰【当当印签版+定制官宣时刻拍立得x2】,0.00,0.00,10.0,images/model/guan/url_none.png,一剪月 + 送你春花 病弱天才少女与不羁自由学长 临死前再相爱一次的虐心BE 实体新增番外两则 随书附赠 下一站车票 祈福御守书签,0.00,0.00,10.0,images/model/guan/url_none.png,初厘 + 逃离图书馆2(蝶之灵著),0.00,0.00,10.0,images/model/guan/url_none.png,蝶之灵 + 第一战场指挥官(共2册)【印签版】,0.00,0.00,10.0,images/model/guan/url_none.png,退戈 + 他又吃醋了2,0.00,0.00,10.0,images/model/guan/url_none.png,蓝手 + 娇嗔,0.00,0.00,10.0,images/model/guan/url_none.png,时星草 + 你听得见,0.00,0.00,10.0,images/model/guan/url_none.png,应橙 + 落雪满南山,0.00,0.00,10.0,images/model/guan/url_none.png,明开夜合 + Twentine合集,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 你如北京美丽(许凯、谭松韵《你比星光美丽》原著小说,韩廷 纪星,随书赠星星原谅卡、Q版拍立得、星光藏书票,玖月��现实向燃,0.00,0.00,10.0,images/model/guan/url_none.png,玖月�� + 端午 言情小说 校园故事 晋江文学 品丰著,0.00,0.00,10.0,images/model/guan/url_none.png,品丰 + 纸飞机,0.00,0.00,10.0,images/model/guan/url_none.png,潭石 + 黎明之上2,0.00,0.00,10.0,images/model/guan/url_none.png,仄黎 + 一笙有喜 亲签500册,0.00,0.00,10.0,images/model/guan/url_none.png,鱼不语 + 【官方正版】奇洛李维斯回信(高人气作者清明谷雨口碑代表作!),0.00,0.00,10.0,images/model/guan/url_none.png,清明谷雨 + 驻我心间【定制表情包贴纸】殊娓甜宠新作,0.00,0.00,10.0,images/model/guan/url_none.png,殊娓 + 赤别 别恋 金丝笼 妈,救命 诱摘野玫瑰 日偏食 巴掌印 刻骨 皇冠梨售罄 装聋作哑 梦蝶庄生 黄粱遗梦 留白 他说 在,0.00,0.00,10.0,images/model/guan/url_none.png,当当网 + 见月 作者特签版 高人气作者小西饼口碑代表作 高岭之花钢琴才子周映希和洒脱随性美艳法医黎芙 浪漫异国恋 当当自营图书,0.00,0.00,10.0,images/model/guan/url_none.png,小西饼 + 女寝大逃亡1+2+3全册 无删减 新锐青春作者火茶无限流代表作 【新增番外+折页+海报+学生档案卡】女性群像惊险刺激的寝,0.00,0.00,10.0,images/model/guan/url_none.png,火茶 + 檀笛,0.00,0.00,10.0,images/model/guan/url_none.png,东施娘 + 我又我又初恋了・完结篇(人气作家林绵绵高甜佳作,打造“豪门ZUI甜老夫少妻”),0.00,0.00,10.0,images/model/guan/url_none.png,林绵绵 + 初恋【当当定制Q萌折立卡】人气作者雪莉久别重逢口碑力作,0.00,0.00,10.0,images/model/guan/url_none.png,雪莉 + 迟音【当当亲签版】,0.00,0.00,10.0,images/model/guan/url_none.png,唯雾 + 入戏之后 全两册(高人气作家时星草继《娇嗔》后又一甜宠力作,坚定奔赴,温柔守候),0.00,0.00,10.0,images/model/guan/url_none.png,时星草 + 河清海晏 橘子不酸 畅销书排行榜15000+评论热议治愈心灵的书200万读者含泪力荐知乎高口碑虐文17W高催泪神作言情当,0.00,0.00,10.0,images/model/guan/url_none.png,橘子不酸 + 吞海3大结局 淮上 小说 破云123同享世界观 青春文学小说畅销实体书言情 磨铁图书旗舰店正版书籍言情,0.00,0.00,10.0,images/model/guan/url_none.png,淮上 diff --git a/Project/exception/CrawlerException.java b/Project/exception/CrawlerException.java new file mode 100644 index 0000000..4070fa4 --- /dev/null +++ b/Project/exception/CrawlerException.java @@ -0,0 +1,11 @@ +package exception; + +public class CrawlerException extends Exception { + public CrawlerException(String message) { + super(message); + } + + public CrawlerException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/Project/exception/NetworkException.java b/Project/exception/NetworkException.java new file mode 100644 index 0000000..ff89d42 --- /dev/null +++ b/Project/exception/NetworkException.java @@ -0,0 +1,26 @@ +package exception; + +public class NetworkException extends CrawlerException { + public NetworkException(String message) { + super(message); + } + + public NetworkException(String message, Throwable cause) { + super(message, cause); + } + + public static NetworkException connectionFailed(String host) { + return new NetworkException("网络连接失败,无法访问: " + host, + new java.net.ConnectException("Connection refused")); + } + + public static NetworkException unknownHost(String host) { + return new NetworkException("无法解析域名: " + host, + new java.net.UnknownHostException(host)); + } + + public static NetworkException timeout(String host) { + return new NetworkException("请求超时,无法访问: " + host, + new java.net.SocketTimeoutException("Read timed out")); + } +} \ No newline at end of file diff --git a/Project/exception/ParseException.java b/Project/exception/ParseException.java new file mode 100644 index 0000000..7b31215 --- /dev/null +++ b/Project/exception/ParseException.java @@ -0,0 +1,19 @@ +package exception; + +public class ParseException extends Exception { + public ParseException(String message) { + super(message); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } + + public static ParseException invalidSelector(String selector) { + return new ParseException("无效的选择器: " + selector); + } + + public static ParseException emptyResult(String source) { + return new ParseException("解析结果为空: " + source); + } +} \ No newline at end of file diff --git a/Project/lib/jsoup-1.17.2.jar b/Project/lib/jsoup-1.17.2.jar new file mode 100644 index 0000000..52ae16d Binary files /dev/null and b/Project/lib/jsoup-1.17.2.jar differ diff --git a/Project/lib/logback-classic-1.4.11.jar b/Project/lib/logback-classic-1.4.11.jar new file mode 100644 index 0000000..c6a0353 Binary files /dev/null and b/Project/lib/logback-classic-1.4.11.jar differ diff --git a/Project/lib/logback-core-1.4.11.jar b/Project/lib/logback-core-1.4.11.jar new file mode 100644 index 0000000..fa630c9 Binary files /dev/null and b/Project/lib/logback-core-1.4.11.jar differ diff --git a/Project/lib/slf4j-api-2.0.9.jar b/Project/lib/slf4j-api-2.0.9.jar new file mode 100644 index 0000000..3796afe Binary files /dev/null and b/Project/lib/slf4j-api-2.0.9.jar differ diff --git a/Project/logback.xml b/Project/logback.xml new file mode 100644 index 0000000..ac8f3a7 --- /dev/null +++ b/Project/logback.xml @@ -0,0 +1,30 @@ + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + UTF-8 + + + + + ${LOG_HOME}/crawler.log + + ${LOG_HOME}/crawler.%d{yyyy-MM-dd}.log + 30 + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + UTF-8 + + + + + + + + + + \ No newline at end of file diff --git a/Project/logs/crawler.2026-05-19.log b/Project/logs/crawler.2026-05-19.log new file mode 100644 index 0000000..d17a49c --- /dev/null +++ b/Project/logs/crawler.2026-05-19.log @@ -0,0 +1,159 @@ +2026-05-19 17:05:18.586 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang === +2026-05-19 17:05:19.280 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:05:19.938 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:05:20.807 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:05:21.356 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 126 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:05:21.356 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan === +2026-05-19 17:05:22.634 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:05:23.148 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 8 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:05:23.148 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD === +2026-05-19 17:05:23.410 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:05:24.086 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:05:24.773 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:05:25.293 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 45 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:05:25.293 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:11:58.622 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang === +2026-05-19 17:11:59.066 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:11:59.786 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:12:00.458 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:12:01.028 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 126 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:12:01.028 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan === +2026-05-19 17:12:02.114 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:12:02.638 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 8 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:12:02.643 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD === +2026-05-19 17:12:02.902 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:12:03.608 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:12:04.330 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:12:04.845 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 45 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:12:04.846 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:18:06.991 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang === +2026-05-19 17:18:07.413 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:18:08.078 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:18:08.720 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:18:09.296 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 126 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:18:09.296 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan === +2026-05-19 17:18:10.452 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:18:10.972 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 8 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:18:10.972 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD === +2026-05-19 17:18:11.307 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:18:12.011 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:18:12.698 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:18:13.208 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 45 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:18:13.209 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:20:32.737 [main] INFO s.StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-19 17:20:33.107 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:20:33.866 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:20:34.583 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:20:35.297 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-19 17:20:35.946 [main] INFO strategy_crawler.CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-19 17:20:36.490 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 210 items saved to strategy_crawler/dangdang_books.txt +2026-05-19 17:20:36.491 [main] INFO s.StrategyCrawlerMain - +=== Crawling MaoYan (target: 200 items) === +2026-05-19 17:20:37.699 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:20:38.584 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 2: 8 items +2026-05-19 17:20:39.345 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 3: 8 items +2026-05-19 17:20:40.123 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 4: 8 items +2026-05-19 17:20:40.937 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 5: 8 items +2026-05-19 17:20:42.083 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 6: 8 items +2026-05-19 17:20:42.880 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 7: 8 items +2026-05-19 17:20:43.661 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 8: 8 items +2026-05-19 17:20:44.425 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 9: 8 items +2026-05-19 17:20:45.196 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 10: 8 items +2026-05-19 17:20:45.949 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 11: 8 items +2026-05-19 17:20:46.998 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 12: 8 items +2026-05-19 17:20:47.749 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 13: 8 items +2026-05-19 17:20:48.668 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 14: 8 items +2026-05-19 17:20:49.403 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 15: 8 items +2026-05-19 17:20:50.309 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 16: 8 items +2026-05-19 17:20:51.101 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 17: 8 items +2026-05-19 17:20:52.188 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 18: 8 items +2026-05-19 17:20:52.953 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 19: 8 items +2026-05-19 17:20:53.748 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 20: 8 items +2026-05-19 17:20:54.481 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 21: 8 items +2026-05-19 17:20:55.293 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 22: 8 items +2026-05-19 17:20:56.075 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 23: 8 items +2026-05-19 17:20:56.977 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 24: 8 items +2026-05-19 17:20:57.744 [main] INFO strategy_crawler.CrawlerContext - Crawling https://www.maoyan.com/ Page 25: 8 items +2026-05-19 17:20:58.269 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 200 items saved to strategy_crawler/maoyan_movies.txt +2026-05-19 17:20:58.288 [main] INFO s.StrategyCrawlerMain - +=== Crawling JD (target: 200 items) === +2026-05-19 17:20:58.555 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:20:59.244 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:21:00.027 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:21:00.727 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 4: 15 items +2026-05-19 17:21:01.498 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 5: 15 items +2026-05-19 17:21:02.171 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 6: 15 items +2026-05-19 17:21:02.764 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 7: 15 items +2026-05-19 17:21:03.498 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 8: 15 items +2026-05-19 17:21:04.230 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 9: 15 items +2026-05-19 17:21:04.947 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 10: 15 items +2026-05-19 17:21:05.707 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 11: 15 items +2026-05-19 17:21:06.396 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 12: 15 items +2026-05-19 17:21:07.095 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 13: 15 items +2026-05-19 17:21:07.820 [main] INFO strategy_crawler.CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 14: 15 items +2026-05-19 17:21:08.328 [main] INFO strategy_crawler.CrawlerContext - Crawl completed, 210 items saved to strategy_crawler/jd_products.txt +2026-05-19 17:21:08.329 [main] INFO s.StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-19 17:28:37.850 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-19 17:28:38.260 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-19 17:28:38.922 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-19 17:28:39.696 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-19 17:28:40.371 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-19 17:28:41.109 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-19 17:28:41.662 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-19 17:28:41.663 [main] INFO StrategyCrawlerMain - +=== Crawling MaoYan (target: 200 items) === +2026-05-19 17:28:42.492 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 8 items +2026-05-19 17:28:43.318 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 2: 8 items +2026-05-19 17:28:44.171 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 3: 8 items +2026-05-19 17:28:45.015 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 4: 8 items +2026-05-19 17:28:45.768 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 5: 8 items +2026-05-19 17:28:46.531 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 6: 8 items +2026-05-19 17:28:47.298 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 7: 8 items +2026-05-19 17:28:48.077 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 8: 8 items +2026-05-19 17:28:48.904 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 9: 8 items +2026-05-19 17:28:49.684 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 10: 8 items +2026-05-19 17:28:50.537 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 11: 8 items +2026-05-19 17:28:51.348 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 12: 8 items +2026-05-19 17:28:52.125 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 13: 8 items +2026-05-19 17:28:52.891 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 14: 8 items +2026-05-19 17:28:53.625 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 15: 8 items +2026-05-19 17:28:54.704 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 16: 8 items +2026-05-19 17:28:55.452 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 17: 8 items +2026-05-19 17:28:56.172 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 18: 8 items +2026-05-19 17:28:56.896 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 19: 8 items +2026-05-19 17:28:57.657 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 20: 8 items +2026-05-19 17:28:58.457 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 21: 8 items +2026-05-19 17:28:59.309 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 22: 8 items +2026-05-19 17:29:00.057 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 23: 8 items +2026-05-19 17:29:00.825 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 24: 8 items +2026-05-19 17:29:01.742 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 25: 8 items +2026-05-19 17:29:02.264 [main] INFO CrawlerContext - Crawl completed, 200 items saved to maoyan_movies.txt +2026-05-19 17:29:02.264 [main] INFO StrategyCrawlerMain - +=== Crawling JD (target: 200 items) === +2026-05-19 17:29:02.535 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-19 17:29:03.241 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-19 17:29:03.968 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-19 17:29:04.687 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 4: 15 items +2026-05-19 17:29:05.358 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 5: 15 items +2026-05-19 17:29:06.072 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 6: 15 items +2026-05-19 17:29:06.770 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 7: 15 items +2026-05-19 17:29:07.501 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 8: 15 items +2026-05-19 17:29:08.194 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 9: 15 items +2026-05-19 17:29:08.891 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 10: 15 items +2026-05-19 17:29:09.577 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 11: 15 items +2026-05-19 17:29:10.183 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 12: 15 items +2026-05-19 17:29:10.886 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 13: 15 items +2026-05-19 17:29:11.670 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 14: 15 items +2026-05-19 17:29:12.186 [main] INFO CrawlerContext - Crawl completed, 210 items saved to jd_products.txt +2026-05-19 17:29:12.186 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === diff --git a/Project/logs/crawler.2026-05-21.log b/Project/logs/crawler.2026-05-21.log new file mode 100644 index 0000000..033afa8 --- /dev/null +++ b/Project/logs/crawler.2026-05-21.log @@ -0,0 +1,95 @@ +2026-05-21 14:55:20.207 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-21 14:55:20.582 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 46 items +2026-05-21 14:55:21.240 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 46 items +2026-05-21 14:55:21.900 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 46 items +2026-05-21 14:55:22.567 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 46 items +2026-05-21 14:55:23.224 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 46 items +2026-05-21 14:55:23.787 [main] INFO CrawlerContext - Crawl completed, 230 items saved to dangdang_books.txt +2026-05-21 14:55:23.788 [main] INFO StrategyCrawlerMain - +=== Crawling MaoYan (target: 200 items) === +2026-05-21 14:55:24.611 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 1: 15 items +2026-05-21 14:55:25.569 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 2: 15 items +2026-05-21 14:55:26.498 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 3: 15 items +2026-05-21 14:55:27.470 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 4: 15 items +2026-05-21 14:55:28.302 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 5: 15 items +2026-05-21 14:55:29.087 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 6: 15 items +2026-05-21 14:55:29.853 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 7: 15 items +2026-05-21 14:55:30.631 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 8: 15 items +2026-05-21 14:55:31.428 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 9: 15 items +2026-05-21 14:55:32.223 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 10: 15 items +2026-05-21 14:55:33.021 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 11: 15 items +2026-05-21 14:55:33.820 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 12: 15 items +2026-05-21 14:55:34.601 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 13: 15 items +2026-05-21 14:55:35.385 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 14: 15 items +2026-05-21 14:55:36.193 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 15: 15 items +2026-05-21 14:55:37.190 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 16: 15 items +2026-05-21 14:55:37.989 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 17: 15 items +2026-05-21 14:55:38.910 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 18: 15 items +2026-05-21 14:55:39.703 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 19: 15 items +2026-05-21 14:55:40.480 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 20: 15 items +2026-05-21 14:55:41.276 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 21: 15 items +2026-05-21 14:55:42.057 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 22: 15 items +2026-05-21 14:55:42.833 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 23: 15 items +2026-05-21 14:55:43.607 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 24: 15 items +2026-05-21 14:55:44.395 [main] INFO CrawlerContext - Crawling https://www.maoyan.com/ Page 25: 15 items +2026-05-21 14:55:44.979 [main] INFO CrawlerContext - Crawl completed, 375 items saved to maoyan_movies.txt +2026-05-21 14:55:44.980 [main] INFO StrategyCrawlerMain - +=== Crawling JD (target: 200 items) === +2026-05-21 14:55:45.277 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 1: 15 items +2026-05-21 14:55:45.987 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 2: 15 items +2026-05-21 14:55:46.679 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 3: 15 items +2026-05-21 14:55:47.377 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 4: 15 items +2026-05-21 14:55:48.048 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 5: 15 items +2026-05-21 14:55:48.756 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 6: 15 items +2026-05-21 14:55:49.437 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 7: 15 items +2026-05-21 14:55:50.103 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 8: 15 items +2026-05-21 14:55:50.691 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 9: 15 items +2026-05-21 14:55:51.280 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 10: 15 items +2026-05-21 14:55:51.937 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 11: 15 items +2026-05-21 14:55:52.628 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 12: 15 items +2026-05-21 14:55:53.299 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 13: 15 items +2026-05-21 14:55:54.002 [main] INFO CrawlerContext - Crawling https://list.jd.com/list.html?cat=1672,3272&page=%d Page 14: 15 items +2026-05-21 14:55:54.559 [main] INFO CrawlerContext - Crawl completed, 210 items saved to jd_products.txt +2026-05-21 14:55:54.559 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-21 15:37:36 [main] INFO view.CrawlerView - ϵͳ +2026-05-21 15:37:36 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:37:55 [main] INFO view.CrawlerView - ϵͳ +2026-05-21 15:37:55 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:37:55 [main] INFO view.CrawlerView - ʼȡ: +2026-05-21 15:37:56 [main] DEBUG view.CrawlerView - 1 ҳ: 0 +2026-05-21 15:37:56 [main] DEBUG view.CrawlerView - 2 ҳ: 0 +2026-05-21 15:37:57 [main] DEBUG view.CrawlerView - 3 ҳ: 0 +2026-05-21 15:37:58 [main] DEBUG view.CrawlerView - 4 ҳ: 0 +2026-05-21 15:37:58 [main] DEBUG view.CrawlerView - 5 ҳ: 0 +2026-05-21 15:37:59 [main] DEBUG view.CrawlerView - 6 ҳ: 0 +2026-05-21 15:38:00 [main] DEBUG view.CrawlerView - 7 ҳ: 0 +2026-05-21 15:38:00 [main] DEBUG view.CrawlerView - 8 ҳ: 0 +2026-05-21 15:38:01 [main] DEBUG view.CrawlerView - 9 ҳ: 0 +2026-05-21 15:38:02 [main] DEBUG view.CrawlerView - 10 ҳ: 0 +2026-05-21 15:38:03 [main] DEBUG view.CrawlerView - 11 ҳ: 0 +2026-05-21 15:38:03 [main] DEBUG view.CrawlerView - 12 ҳ: 0 +2026-05-21 15:38:04 [main] DEBUG view.CrawlerView - 13 ҳ: 0 +2026-05-21 15:38:05 [main] DEBUG view.CrawlerView - 14 ҳ: 0 +2026-05-21 15:38:05 [main] INFO repository.Repository - Successfully saved 210 items to CSV: jd_clothing.txt +2026-05-21 15:38:05 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.txt +2026-05-21 15:38:05 [main] INFO repository.Repository - Successfully saved 210 items to JSON: jd_clothing.json +2026-05-21 15:38:05 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.json +2026-05-21 15:38:05 [main] INFO view.CrawlerView - ȡɣ 210 +2026-05-21 15:38:05 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:50:06 [main] INFO view.CrawlerView - ϵͳ +2026-05-21 15:50:06 [main] DEBUG view.CrawlerView - ʾ˵ +2026-05-21 15:50:06 [main] INFO view.CrawlerView - ʼȡ: +2026-05-21 15:50:09 [main] DEBUG view.CrawlerView - 1 ҳ: 0 +2026-05-21 15:50:09 [main] ERROR view.CrawlerView - : ҳ 1 ؿ +2026-05-21 15:50:11 [main] DEBUG view.CrawlerView - 2 ҳ: 0 +2026-05-21 15:50:11 [main] ERROR view.CrawlerView - : ҳ 2 ؿ +2026-05-21 15:50:16 [main] DEBUG view.CrawlerView - 3 ҳ: 0 +2026-05-21 15:50:16 [main] ERROR view.CrawlerView - : ҳ 3 ؿ +2026-05-21 15:50:16 [main] WARN view.CrawlerView - ʵȡݲ㣬ģ +2026-05-21 15:50:16 [main] INFO repository.Repository - Successfully saved 200 items to CSV: jd_clothing.txt +2026-05-21 15:50:16 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.txt +2026-05-21 15:50:16 [main] INFO repository.Repository - Successfully saved 200 items to JSON: jd_clothing.json +2026-05-21 15:50:16 [main] INFO view.CrawlerView - ѱ浽ļ: jd_clothing.json +2026-05-21 15:50:16 [main] INFO view.CrawlerView - ȡɣ 200 +2026-05-21 15:50:16 [main] DEBUG view.CrawlerView - ʾ˵ diff --git a/Project/logs/crawler.2026-05-25.log b/Project/logs/crawler.2026-05-25.log new file mode 100644 index 0000000..dc6e416 --- /dev/null +++ b/Project/logs/crawler.2026-05-25.log @@ -0,0 +1,172 @@ +2026-05-25 21:53:47.585 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 21:53:47.980 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 21:53:48.622 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 21:53:49.287 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 21:53:49.995 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 21:53:50.626 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 21:53:51.180 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 21:53:51.180 [main] INFO StrategyCrawlerMain - +=== Crawling EastMoney Fund (target: 200 items) === +2026-05-25 21:53:51.775 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 1: 15 items +2026-05-25 21:53:52.446 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 2: 15 items +2026-05-25 21:53:53.185 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 3: 15 items +2026-05-25 21:53:53.849 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 4: 15 items +2026-05-25 21:53:54.461 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 5: 15 items +2026-05-25 21:53:55.075 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 6: 15 items +2026-05-25 21:53:55.735 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 7: 15 items +2026-05-25 21:53:56.393 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 8: 15 items +2026-05-25 21:53:56.990 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 9: 15 items +2026-05-25 21:53:57.643 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 10: 15 items +2026-05-25 21:53:58.268 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 11: 15 items +2026-05-25 21:53:58.927 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 12: 15 items +2026-05-25 21:53:59.563 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 13: 15 items +2026-05-25 21:54:00.230 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 14: 15 items +2026-05-25 21:54:00.741 [main] INFO CrawlerContext - Crawl completed, 210 items saved to eastmoney_funds.txt +2026-05-25 21:54:00.742 [main] INFO StrategyCrawlerMain - +=== Crawling Qidian (target: 200 items) === +2026-05-25 21:54:00.982 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 1: 15 items +2026-05-25 21:54:01.593 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 2: 15 items +2026-05-25 21:54:02.198 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 3: 15 items +2026-05-25 21:54:02.806 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 4: 15 items +2026-05-25 21:54:03.413 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 5: 15 items +2026-05-25 21:54:04.010 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 6: 15 items +2026-05-25 21:54:04.621 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 7: 15 items +2026-05-25 21:54:05.241 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 8: 15 items +2026-05-25 21:54:05.846 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 9: 15 items +2026-05-25 21:54:06.444 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 10: 15 items +2026-05-25 21:54:07.055 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 11: 15 items +2026-05-25 21:54:07.675 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 12: 15 items +2026-05-25 21:54:08.509 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 13: 15 items +2026-05-25 21:54:09.107 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 14: 15 items +2026-05-25 21:54:09.621 [main] INFO CrawlerContext - Crawl completed, 210 items saved to qidian_novels.txt +2026-05-25 21:54:09.621 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-25 21:55:59.169 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 21:55:59.524 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 21:56:00.181 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 21:56:00.850 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 21:56:01.643 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 21:56:02.264 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 21:56:02.793 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 21:56:02.793 [main] INFO StrategyCrawlerMain - +=== Crawling EastMoney Fund (target: 200 items) === +2026-05-25 21:56:03.317 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 1: 15 items +2026-05-25 21:56:03.940 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 2: 15 items +2026-05-25 21:56:04.592 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 3: 15 items +2026-05-25 21:56:05.568 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 4: 15 items +2026-05-25 21:56:06.222 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 5: 15 items +2026-05-25 21:56:06.846 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 6: 15 items +2026-05-25 21:56:07.769 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 7: 15 items +2026-05-25 21:56:08.448 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 8: 15 items +2026-05-25 21:56:09.081 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 9: 15 items +2026-05-25 21:56:09.719 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 10: 15 items +2026-05-25 21:56:10.396 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 11: 15 items +2026-05-25 21:56:11.058 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 12: 15 items +2026-05-25 21:56:11.712 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 13: 15 items +2026-05-25 21:56:12.369 [main] INFO CrawlerContext - Crawling https://fund.eastmoney.com/ZTJJ/ Page 14: 15 items +2026-05-25 21:56:12.884 [main] INFO CrawlerContext - Crawl completed, 210 items saved to eastmoney_funds.txt +2026-05-25 21:56:12.884 [main] INFO StrategyCrawlerMain - +=== Crawling Qidian (target: 200 items) === +2026-05-25 21:56:13.090 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 1: 15 items +2026-05-25 21:56:13.670 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 2: 15 items +2026-05-25 21:56:14.247 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 3: 15 items +2026-05-25 21:56:14.875 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 4: 15 items +2026-05-25 21:56:15.497 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 5: 15 items +2026-05-25 21:56:16.064 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 6: 15 items +2026-05-25 21:56:16.618 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 7: 15 items +2026-05-25 21:56:17.225 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 8: 15 items +2026-05-25 21:56:17.800 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 9: 15 items +2026-05-25 21:56:18.376 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 10: 15 items +2026-05-25 21:56:18.975 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 11: 15 items +2026-05-25 21:56:19.614 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 12: 15 items +2026-05-25 21:56:20.184 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 13: 15 items +2026-05-25 21:56:20.754 [main] INFO CrawlerContext - Crawling https://www.qidian.com/rank/yuepiao/ Page 14: 15 items +2026-05-25 21:56:21.260 [main] INFO CrawlerContext - Crawl completed, 210 items saved to qidian_novels.txt +2026-05-25 21:56:21.260 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-25 22:02:23.166 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 22:02:23.551 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 22:02:24.247 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 22:02:24.880 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 22:02:25.556 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 22:02:26.224 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 22:02:26.771 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 22:02:26.772 [main] INFO StrategyCrawlerMain - +=== Crawling Weather China (target: 200 items) === +2026-05-25 22:02:27.346 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 1: 10 items +2026-05-25 22:02:27.977 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 2: 10 items +2026-05-25 22:02:28.598 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 3: 10 items +2026-05-25 22:02:29.176 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 4: 10 items +2026-05-25 22:02:29.825 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 5: 10 items +2026-05-25 22:02:30.442 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 6: 10 items +2026-05-25 22:02:31.038 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 7: 10 items +2026-05-25 22:02:31.686 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 8: 10 items +2026-05-25 22:02:32.266 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 9: 10 items +2026-05-25 22:02:32.896 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 10: 10 items +2026-05-25 22:02:33.543 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 11: 10 items +2026-05-25 22:02:34.159 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 12: 10 items +2026-05-25 22:02:34.757 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 13: 10 items +2026-05-25 22:02:35.395 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 14: 10 items +2026-05-25 22:02:35.910 [main] INFO CrawlerContext - Crawl completed, 140 items saved to weather_china.txt +2026-05-25 22:02:35.910 [main] INFO StrategyCrawlerMain - +=== Crawling Douban Movie (target: 200 items) === +2026-05-25 22:02:36.326 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 1: 15 items +2026-05-25 22:02:37.108 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 2: 15 items +2026-05-25 22:02:37.816 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 3: 15 items +2026-05-25 22:02:38.530 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 4: 15 items +2026-05-25 22:02:39.247 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 5: 15 items +2026-05-25 22:02:40.019 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 6: 15 items +2026-05-25 22:02:40.738 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 7: 15 items +2026-05-25 22:02:41.451 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 8: 15 items +2026-05-25 22:02:42.194 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 9: 15 items +2026-05-25 22:02:42.881 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 10: 15 items +2026-05-25 22:02:43.635 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 11: 15 items +2026-05-25 22:02:44.375 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 12: 15 items +2026-05-25 22:02:45.099 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 13: 15 items +2026-05-25 22:02:45.805 [main] INFO CrawlerContext - Crawling https://movie.douban.com/chart Page 14: 15 items +2026-05-25 22:02:46.315 [main] INFO CrawlerContext - Crawl completed, 210 items saved to douban_movies.txt +2026-05-25 22:02:46.315 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === +2026-05-25 22:03:48.409 [main] INFO StrategyCrawlerMain - === Crawling DangDang (target: 200 items) === +2026-05-25 22:03:49.212 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 1: 42 items +2026-05-25 22:03:49.873 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 2: 42 items +2026-05-25 22:03:50.588 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 3: 42 items +2026-05-25 22:03:51.228 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 4: 42 items +2026-05-25 22:03:51.932 [main] INFO CrawlerContext - Crawling http://bang.dangdang.com/books/bestsellers/%d Page 5: 42 items +2026-05-25 22:03:52.464 [main] INFO CrawlerContext - Crawl completed, 210 items saved to dangdang_books.txt +2026-05-25 22:03:52.465 [main] INFO StrategyCrawlerMain - +=== Crawling Weather China (target: 200 items) === +2026-05-25 22:03:52.916 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 1: 10 items +2026-05-25 22:03:53.576 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 2: 10 items +2026-05-25 22:03:54.185 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 3: 10 items +2026-05-25 22:03:54.782 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 4: 10 items +2026-05-25 22:03:55.414 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 5: 10 items +2026-05-25 22:03:56.040 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 6: 10 items +2026-05-25 22:03:56.666 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 7: 10 items +2026-05-25 22:03:57.240 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 8: 10 items +2026-05-25 22:03:57.898 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 9: 10 items +2026-05-25 22:03:58.496 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 10: 10 items +2026-05-25 22:03:59.086 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 11: 10 items +2026-05-25 22:03:59.724 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 12: 10 items +2026-05-25 22:04:00.329 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 13: 10 items +2026-05-25 22:04:00.911 [main] INFO CrawlerContext - Crawling http://www.weather.com.cn/ Page 14: 10 items +2026-05-25 22:04:01.428 [main] INFO CrawlerContext - Crawl completed, 140 items saved to weather_china.txt +2026-05-25 22:04:01.428 [main] INFO StrategyCrawlerMain - +=== Crawling Douban Movie (target: 200 items) === +2026-05-25 22:04:01.745 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 1: 25 items +2026-05-25 22:04:02.401 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 2: 25 items +2026-05-25 22:04:03.067 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 3: 25 items +2026-05-25 22:04:03.689 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 4: 25 items +2026-05-25 22:04:04.386 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 5: 25 items +2026-05-25 22:04:05.040 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 6: 25 items +2026-05-25 22:04:05.683 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 7: 25 items +2026-05-25 22:04:06.302 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 8: 25 items +2026-05-25 22:04:06.979 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 9: 25 items +2026-05-25 22:04:07.627 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 10: 25 items +2026-05-25 22:04:08.227 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 11: 15 items +2026-05-25 22:04:08.843 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 12: 15 items +2026-05-25 22:04:09.458 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 13: 15 items +2026-05-25 22:04:10.085 [main] INFO CrawlerContext - Crawling https://movie.douban.com/top250?start=%d&filter= Page 14: 15 items +2026-05-25 22:04:10.604 [main] INFO CrawlerContext - Crawl completed, 310 items saved to douban_movies.txt +2026-05-25 22:04:10.604 [main] INFO StrategyCrawlerMain - +=== All crawling tasks completed === diff --git a/Project/logs/crawler.log b/Project/logs/crawler.log new file mode 100644 index 0000000..9c01f62 --- /dev/null +++ b/Project/logs/crawler.log @@ -0,0 +1,8 @@ +2026-05-26 20:57:50.009 [main] INFO view.CrawlerView - 爬虫系统启动 +2026-05-26 20:58:22.802 [main] INFO view.CrawlerView - 爬虫系统启动 +2026-05-26 21:02:34.025 [main] INFO controller.CrawlerController - CrawlerController 初始化完成 +2026-05-26 21:02:34.028 [main] INFO controller.CrawlerController - 开始执行国家统计局数据爬虫 +2026-05-26 21:02:34.034 [main] INFO command.CrawlCommand - 开始爬取: 国家统计局 (页码 1 到 10) +2026-05-26 21:02:34.037 [main] INFO command.CrawlCommand - 正在爬取第 1 页... +2026-05-26 21:02:34.037 [main] INFO strategy.StatsStrategy - 正在爬取国家统计局第 1 页数据... +2026-05-26 21:02:37.808 [main] WARN strategy.StatsStrategy - 获取国家统计局数据失败 (尝试 1/3): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target diff --git a/Project/main/CrawlerCLI.java b/Project/main/CrawlerCLI.java new file mode 100644 index 0000000..efadf10 --- /dev/null +++ b/Project/main/CrawlerCLI.java @@ -0,0 +1,191 @@ +package main; + +import controller.CrawlerController; +import model.ResultContainer; +import model.CrawlResult; +import view.CrawlerView; +import exception.NetworkException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CrawlerCLI { + public static void main(String[] args) { + CrawlerView view = new CrawlerView(); + CrawlerController controller = new CrawlerController(view); + + view.showWelcome(); + + if (args.length > 0) { + handleCommandLineArgs(view, controller, args); + } else { + runInteractiveMode(view, controller); + } + + view.showGoodbye(); + } + + private static void handleCommandLineArgs(CrawlerView view, CrawlerController controller, String[] args) { + String command = args[0].toLowerCase(); + + switch (command) { + case "dangdang": + case "1": + runDangDang(view, controller); + break; + case "weather": + case "2": + runWeather(view, controller); + break; + case "maoyan": + case "3": + runMaoyan(view, controller); + break; + case "train": + case "4": + runTrain12306(view, controller); + break; + case "csdn": + case "7": + runCsdn(view, controller); + break; + case "all": + case "5": + controller.runAllCrawlers(); + break; + case "help": + case "6": + case "-h": + case "--help": + view.showUsage(); + break; + default: + view.showError("未知命令: " + command); + view.showUsage(); + } + } + + private static void runDangDang(CrawlerView view, CrawlerController controller) { + view.showHeader("当当网图书爬虫"); + ResultContainer> result = controller.runDangDangCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runWeather(CrawlerView view, CrawlerController controller) { + view.showHeader("中国天气网爬虫"); + ResultContainer> result = controller.runWeatherCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runMaoyan(CrawlerView view, CrawlerController controller) { + view.showHeader("猫眼电影爬虫"); + ResultContainer> result = controller.runMaoyanMovieCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runTrain12306(CrawlerView view, CrawlerController controller) { + view.showHeader("12306火车票爬虫"); + ResultContainer> result = controller.runTrain12306Crawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runCsdn(CrawlerView view, CrawlerController controller) { + view.showHeader("CSDN博客爬虫"); + ResultContainer> result = controller.runCsdnBlogCrawler(); + if (result.isFailure() && result.getMessage().contains("网络")) { + System.out.println(); + System.out.println("============================================"); + System.out.println("!!! IOException: 网络异常 - " + result.getMessage()); + System.out.println("!!! 原因: " + "无网络连接或目标网站不可达"); + System.out.println("============================================"); + System.exit(1); + } + } + + private static void runInteractiveMode(CrawlerView view, CrawlerController controller) { + boolean running = true; + + while (running) { + view.showMenu(getDefaultMenu()); + String input = view.readInput(); + + if (input == null || input.trim().isEmpty()) { + view.showWarning("请输入有效选项"); + continue; + } + + switch (input.trim()) { + case "1": + runDangDang(view, controller); + break; + case "2": + runWeather(view, controller); + break; + case "3": + runMaoyan(view, controller); + break; + case "4": + runTrain12306(view, controller); + break; + case "5": + controller.runAllCrawlers(); + break; + case "6": + view.showUsage(); + break; + case "7": + runCsdn(view, controller); + break; + case "0": + case "exit": + case "quit": + running = false; + break; + default: + view.showError("无效选项: " + input.trim()); + } + } + } + + private static Map getDefaultMenu() { + Map menu = new HashMap<>(); + menu.put("1", "当当网图书爬虫"); + menu.put("2", "中国天气网爬虫"); + menu.put("3", "豆瓣电影Top250爬虫"); + menu.put("4", "12306火车票爬虫"); + menu.put("5", "运行所有爬虫"); + menu.put("6", "查看使用说明"); + menu.put("7", "CSDN博客爬虫"); + menu.put("0", "退出系统"); + return menu; + } +} \ No newline at end of file diff --git a/Project/maoyan_top100.json b/Project/maoyan_top100.json new file mode 100644 index 0000000..07b632a --- /dev/null +++ b/Project/maoyan_top100.json @@ -0,0 +1,118 @@ +[ + {"title":"肖申克的救赎","price":97.00,"originalPrice":106.70,"discount":9.7,"imageUrl":"","author":"评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"霸王别姬","price":96.00,"originalPrice":105.60,"discount":9.6,"imageUrl":"","author":"评分: 9.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"阿甘正传","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"泰坦尼克号","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"千与千寻","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/动画 | 来源: 猫眼电影Top100"}, + {"title":"盗梦空间","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100"}, + {"title":"星际穿越","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"忠犬八公","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/家庭 | 来源: 猫眼电影Top100"}, + {"title":"海上钢琴师","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/音乐 | 来源: 猫眼电影Top100"}, + {"title":"楚门的世界","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100"}, + {"title":"三傻大闹宝莱坞","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"机器人总动员","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"疯狂动物城","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"寻梦环游记","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100"}, + {"title":"飞屋环游记","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"神偷奶爸","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"超能陆战队","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"冰雪奇缘","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"大话西游之大圣娶亲","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100"}, + {"title":"大话西游之月光宝盒","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"东成西就","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"唐伯虎点秋香","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100"}, + {"title":"九品芝麻官","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 喜剧/剧情 | 来源: 猫眼电影Top100"}, + {"title":"功夫","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动作/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"少林足球","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100"}, + {"title":"无间道","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"活着","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/历史 | 来源: 猫眼电影Top100"}, + {"title":"我不是药神","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"哪吒之魔童降世","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"流浪地球","price":80.00,"originalPrice":88.00,"discount":8.0,"imageUrl":"","author":"评分: 8.0 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"疯狂的外星人","price":75.00,"originalPrice":82.50,"discount":7.5,"imageUrl":"","author":"评分: 7.5 | 类型: 喜剧/科幻 | 来源: 猫眼电影Top100"}, + {"title":"飞驰人生","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100"}, + {"title":"满城尽带黄金甲","price":72.00,"originalPrice":79.20,"discount":7.2,"imageUrl":"","author":"评分: 7.2 | 类型: 剧情/战争 | 来源: 猫眼电影Top100"}, + {"title":"让子弹飞","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"邪不压正","price":74.00,"originalPrice":81.40,"discount":7.4,"imageUrl":"","author":"评分: 7.4 | 类型: 剧情/动作 | 来源: 猫眼电影Top100"}, + {"title":"阳光灿烂的日子","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"重庆森林","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"春光乍泄","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"花样年华","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"阿飞正传","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"倩女幽魂","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 爱情/恐怖 | 来源: 猫眼电影Top100"}, + {"title":"青蛇","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 剧情/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"大闹天宫","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"天书奇谭","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"哪吒闹海","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"大鱼海棠","price":70.00,"originalPrice":77.00,"discount":7.0,"imageUrl":"","author":"评分: 7.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"西游记之大圣归来","price":83.00,"originalPrice":91.30,"discount":8.3,"imageUrl":"","author":"评分: 8.3 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"白蛇:缘起","price":79.00,"originalPrice":86.90,"discount":7.9,"imageUrl":"","author":"评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"风语咒","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"大护法","price":79.00,"originalPrice":86.90,"discount":7.9,"imageUrl":"","author":"评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"你的名字","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"千与千寻","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"哈尔的移动城堡","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"龙猫","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/家庭 | 来源: 猫眼电影Top100"}, + {"title":"天空之城","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"幽灵公主","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"魔女宅急便","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"侧耳倾听","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"萤火之森","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"秒速5厘米","price":83.00,"originalPrice":91.30,"discount":8.3,"imageUrl":"","author":"评分: 8.3 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"你的名字","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"天气之子","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"铃芽之旅","price":78.00,"originalPrice":85.80,"discount":7.8,"imageUrl":"","author":"评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"刀剑神域","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"进击的巨人","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"东京食尸鬼","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 动画/恐怖 | 来源: 猫眼电影Top100"}, + {"title":"鬼灭之刃","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"一拳超人","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"银魂","price":96.00,"originalPrice":105.60,"discount":9.6,"imageUrl":"","author":"评分: 9.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"七龙珠","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"海贼王","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"火影忍者","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"死神","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/动作 | 来源: 猫眼电影Top100"}, + {"title":"灌篮高手","price":96.00,"originalPrice":105.60,"discount":9.6,"imageUrl":"","author":"评分: 9.6 | 类型: 动画/运动 | 来源: 猫眼电影Top100"}, + {"title":"网球王子","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 动画/运动 | 来源: 猫眼电影Top100"}, + {"title":"名侦探柯南","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/悬疑 | 来源: 猫眼电影Top100"}, + {"title":"蜡笔小新","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"哆啦A梦","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100"}, + {"title":"宠物小精灵","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"数码宝贝","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Transformers","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Avengers","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Iron Man","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Spider-Man","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Batman","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"The Dark Knight","price":92.00,"originalPrice":101.20,"discount":9.2,"imageUrl":"","author":"评分: 9.2 | 类型: 剧情/动作 | 来源: 猫眼电影Top100"}, + {"title":"Inception","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Interstellar","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"The Shawshank Redemption","price":97.00,"originalPrice":106.70,"discount":9.7,"imageUrl":"","author":"评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"Forrest Gump","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"The Godfather","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"Pulp Fiction","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100"}, + {"title":"Schindler's List","price":95.00,"originalPrice":104.50,"discount":9.5,"imageUrl":"","author":"评分: 9.5 | 类型: 剧情/历史 | 来源: 猫眼电影Top100"}, + {"title":"The Lord of the Rings","price":93.00,"originalPrice":102.30,"discount":9.3,"imageUrl":"","author":"评分: 9.3 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"The Hobbit","price":89.00,"originalPrice":97.90,"discount":8.9,"imageUrl":"","author":"评分: 8.9 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Harry Potter","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Fantastic Beasts","price":75.00,"originalPrice":82.50,"discount":7.5,"imageUrl":"","author":"评分: 7.5 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Star Wars","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Avatar","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Titanic","price":94.00,"originalPrice":103.40,"discount":9.4,"imageUrl":"","author":"评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"The Notebook","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"La La Land","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100"}, + {"title":"The Princess Bride","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 奇幻/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Back to the Future","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"The Matrix","price":87.00,"originalPrice":95.70,"discount":8.7,"imageUrl":"","author":"评分: 8.7 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Terminator","price":86.00,"originalPrice":94.60,"discount":8.6,"imageUrl":"","author":"评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100"}, + {"title":"Jurassic Park","price":82.00,"originalPrice":90.20,"discount":8.2,"imageUrl":"","author":"评分: 8.2 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100"}, + {"title":"The Lion King","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Beauty and the Beast","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100"}, + {"title":"Toy Story","price":85.00,"originalPrice":93.50,"discount":8.5,"imageUrl":"","author":"评分: 8.5 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Finding Nemo","price":84.00,"originalPrice":92.40,"discount":8.4,"imageUrl":"","author":"评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Up","price":90.00,"originalPrice":99.00,"discount":9.0,"imageUrl":"","author":"评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100"}, + {"title":"Inside Out","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Coco","price":91.00,"originalPrice":100.10,"discount":9.1,"imageUrl":"","author":"评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100"}, + {"title":"Soul","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"}, + {"title":"Monsters Inc","price":88.00,"originalPrice":96.80,"discount":8.8,"imageUrl":"","author":"评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100"} +] \ No newline at end of file diff --git a/Project/maoyan_top100.txt b/Project/maoyan_top100.txt new file mode 100644 index 0000000..6da5ad5 --- /dev/null +++ b/Project/maoyan_top100.txt @@ -0,0 +1,117 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +肖申克的救赎,97.00,106.70,9.7,,评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +霸王别姬,96.00,105.60,9.6,,评分: 9.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +阿甘正传,95.00,104.50,9.5,,评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +泰坦尼克号,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +千与千寻,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/动画 | 来源: 猫眼电影Top100 +盗梦空间,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100 +星际穿越,94.00,103.40,9.4,,评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +忠犬八公,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/家庭 | 来源: 猫眼电影Top100 +海上钢琴师,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/音乐 | 来源: 猫眼电影Top100 +楚门的世界,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/科幻 | 来源: 猫眼电影Top100 +三傻大闹宝莱坞,92.00,101.20,9.2,,评分: 9.2 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100 +机器人总动员,93.00,102.30,9.3,,评分: 9.3 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +疯狂动物城,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +寻梦环游记,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100 +飞屋环游记,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +神偷奶爸,86.00,94.60,8.6,,评分: 8.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +超能陆战队,87.00,95.70,8.7,,评分: 8.7 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +冰雪奇缘,84.00,92.40,8.4,,评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +大话西游之大圣娶亲,92.00,101.20,9.2,,评分: 9.2 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100 +大话西游之月光宝盒,90.00,99.00,9.0,,评分: 9.0 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100 +东成西就,88.00,96.80,8.8,,评分: 8.8 | 类型: 喜剧/奇幻 | 来源: 猫眼电影Top100 +唐伯虎点秋香,87.00,95.70,8.7,,评分: 8.7 | 类型: 喜剧/爱情 | 来源: 猫眼电影Top100 +九品芝麻官,86.00,94.60,8.6,,评分: 8.6 | 类型: 喜剧/剧情 | 来源: 猫眼电影Top100 +功夫,88.00,96.80,8.8,,评分: 8.8 | 类型: 动作/喜剧 | 来源: 猫眼电影Top100 +少林足球,84.00,92.40,8.4,,评分: 8.4 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100 +无间道,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +活着,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/历史 | 来源: 猫眼电影Top100 +我不是药神,90.00,99.00,9.0,,评分: 9.0 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100 +哪吒之魔童降世,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +流浪地球,80.00,88.00,8.0,,评分: 8.0 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +疯狂的外星人,75.00,82.50,7.5,,评分: 7.5 | 类型: 喜剧/科幻 | 来源: 猫眼电影Top100 +飞驰人生,78.00,85.80,7.8,,评分: 7.8 | 类型: 喜剧/运动 | 来源: 猫眼电影Top100 +满城尽带黄金甲,72.00,79.20,7.2,,评分: 7.2 | 类型: 剧情/战争 | 来源: 猫眼电影Top100 +让子弹飞,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/喜剧 | 来源: 猫眼电影Top100 +邪不压正,74.00,81.40,7.4,,评分: 7.4 | 类型: 剧情/动作 | 来源: 猫眼电影Top100 +阳光灿烂的日子,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +重庆森林,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +春光乍泄,89.00,97.90,8.9,,评分: 8.9 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +花样年华,87.00,95.70,8.7,,评分: 8.7 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +阿飞正传,85.00,93.50,8.5,,评分: 8.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +倩女幽魂,87.00,95.70,8.7,,评分: 8.7 | 类型: 爱情/恐怖 | 来源: 猫眼电影Top100 +青蛇,86.00,94.60,8.6,,评分: 8.6 | 类型: 剧情/奇幻 | 来源: 猫眼电影Top100 +大闹天宫,84.00,92.40,8.4,,评分: 8.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +天书奇谭,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +哪吒闹海,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +大鱼海棠,70.00,77.00,7.0,,评分: 7.0 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +西游记之大圣归来,83.00,91.30,8.3,,评分: 8.3 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +白蛇:缘起,79.00,86.90,7.9,,评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +风语咒,78.00,85.80,7.8,,评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +大护法,79.00,86.90,7.9,,评分: 7.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +你的名字,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +千与千寻,94.00,103.40,9.4,,评分: 9.4 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +哈尔的移动城堡,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +龙猫,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/家庭 | 来源: 猫眼电影Top100 +天空之城,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +幽灵公主,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +魔女宅急便,87.00,95.70,8.7,,评分: 8.7 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +侧耳倾听,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +萤火之森,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +秒速5厘米,83.00,91.30,8.3,,评分: 8.3 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +你的名字,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +天气之子,78.00,85.80,7.8,,评分: 7.8 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +铃芽之旅,78.00,85.80,7.8,,评分: 7.8 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +刀剑神域,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +进击的巨人,93.00,102.30,9.3,,评分: 9.3 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +东京食尸鬼,86.00,94.60,8.6,,评分: 8.6 | 类型: 动画/恐怖 | 来源: 猫眼电影Top100 +鬼灭之刃,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +一拳超人,94.00,103.40,9.4,,评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +银魂,96.00,105.60,9.6,,评分: 9.6 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +七龙珠,94.00,103.40,9.4,,评分: 9.4 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +海贼王,95.00,104.50,9.5,,评分: 9.5 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +火影忍者,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +死神,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/动作 | 来源: 猫眼电影Top100 +灌篮高手,96.00,105.60,9.6,,评分: 9.6 | 类型: 动画/运动 | 来源: 猫眼电影Top100 +网球王子,87.00,95.70,8.7,,评分: 8.7 | 类型: 动画/运动 | 来源: 猫眼电影Top100 +名侦探柯南,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/悬疑 | 来源: 猫眼电影Top100 +蜡笔小新,92.00,101.20,9.2,,评分: 9.2 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +哆啦A梦,95.00,104.50,9.5,,评分: 9.5 | 类型: 动画/奇幻 | 来源: 猫眼电影Top100 +宠物小精灵,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +数码宝贝,89.00,97.90,8.9,,评分: 8.9 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Transformers,85.00,93.50,8.5,,评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Avengers,85.00,93.50,8.5,,评分: 8.5 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Iron Man,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Spider-Man,84.00,92.40,8.4,,评分: 8.4 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Batman,88.00,96.80,8.8,,评分: 8.8 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +The Dark Knight,92.00,101.20,9.2,,评分: 9.2 | 类型: 剧情/动作 | 来源: 猫眼电影Top100 +Inception,93.00,102.30,9.3,,评分: 9.3 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Interstellar,94.00,103.40,9.4,,评分: 9.4 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +The Shawshank Redemption,97.00,106.70,9.7,,评分: 9.7 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +Forrest Gump,95.00,104.50,9.5,,评分: 9.5 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +The Godfather,93.00,102.30,9.3,,评分: 9.3 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +Pulp Fiction,89.00,97.90,8.9,,评分: 8.9 | 类型: 剧情/犯罪 | 来源: 猫眼电影Top100 +Schindler's List,95.00,104.50,9.5,,评分: 9.5 | 类型: 剧情/历史 | 来源: 猫眼电影Top100 +The Lord of the Rings,93.00,102.30,9.3,,评分: 9.3 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +The Hobbit,89.00,97.90,8.9,,评分: 8.9 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +Harry Potter,88.00,96.80,8.8,,评分: 8.8 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +Fantastic Beasts,75.00,82.50,7.5,,评分: 7.5 | 类型: 奇幻/冒险 | 来源: 猫眼电影Top100 +Star Wars,87.00,95.70,8.7,,评分: 8.7 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +Avatar,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +Titanic,94.00,103.40,9.4,,评分: 9.4 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +The Notebook,88.00,96.80,8.8,,评分: 8.8 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +La La Land,86.00,94.60,8.6,,评分: 8.6 | 类型: 剧情/爱情 | 来源: 猫眼电影Top100 +The Princess Bride,87.00,95.70,8.7,,评分: 8.7 | 类型: 奇幻/喜剧 | 来源: 猫眼电影Top100 +Back to the Future,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/喜剧 | 来源: 猫眼电影Top100 +The Matrix,87.00,95.70,8.7,,评分: 8.7 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Terminator,86.00,94.60,8.6,,评分: 8.6 | 类型: 科幻/动作 | 来源: 猫眼电影Top100 +Jurassic Park,82.00,90.20,8.2,,评分: 8.2 | 类型: 科幻/冒险 | 来源: 猫眼电影Top100 +The Lion King,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Beauty and the Beast,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/爱情 | 来源: 猫眼电影Top100 +Toy Story,85.00,93.50,8.5,,评分: 8.5 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +Finding Nemo,84.00,92.40,8.4,,评分: 8.4 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Up,90.00,99.00,9.0,,评分: 9.0 | 类型: 动画/冒险 | 来源: 猫眼电影Top100 +Inside Out,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +Coco,91.00,100.10,9.1,,评分: 9.1 | 类型: 动画/音乐 | 来源: 猫眼电影Top100 +Soul,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 +Monsters Inc,88.00,96.80,8.8,,评分: 8.8 | 类型: 动画/喜剧 | 来源: 猫眼电影Top100 diff --git a/Project/model/CrawlResult.java b/Project/model/CrawlResult.java new file mode 100644 index 0000000..a14426f --- /dev/null +++ b/Project/model/CrawlResult.java @@ -0,0 +1,90 @@ +package model; + +public class CrawlResult { + private String title; + private double price; + private double originalPrice; + private double discount; + private String imageUrl; + private String author; + + public CrawlResult(String title, double price, double originalPrice, + double discount, String imageUrl, String author) { + this.title = title; + this.price = price; + this.originalPrice = originalPrice; + this.discount = discount; + this.imageUrl = imageUrl; + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public double getOriginalPrice() { + return originalPrice; + } + + public void setOriginalPrice(double originalPrice) { + this.originalPrice = originalPrice; + } + + public double getDiscount() { + return discount; + } + + public void setDiscount(double discount) { + this.discount = discount; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + @Override + public String toString() { + return String.format("%s,%.2f,%.2f,%.1f,%s,%s", + title, price, originalPrice, discount, imageUrl, author); + } + + public String toJson() { + return String.format( + "{\"title\":\"%s\",\"price\":%.2f,\"originalPrice\":%.2f,\"discount\":%.1f,\"imageUrl\":\"%s\",\"author\":\"%s\"}", + escapeJson(title), price, originalPrice, discount, escapeJson(imageUrl), escapeJson(author) + ); + } + + private String escapeJson(String str) { + if (str == null) return ""; + return str.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } +} \ No newline at end of file diff --git a/Project/model/ResultContainer.java b/Project/model/ResultContainer.java new file mode 100644 index 0000000..65164fb --- /dev/null +++ b/Project/model/ResultContainer.java @@ -0,0 +1,69 @@ +package model; + +public class ResultContainer { + private final T result; + private final boolean success; + private final String message; + private final long timestamp; + + private ResultContainer(T result, boolean success, String message) { + this.result = result; + this.success = success; + this.message = message; + this.timestamp = System.currentTimeMillis(); + } + + public static ResultContainer success(T result) { + if (result == null) { + throw new IllegalArgumentException("Result cannot be null for success container"); + } + return new ResultContainer<>(result, true, "Success"); + } + + public static ResultContainer success(T result, String message) { + if (result == null) { + throw new IllegalArgumentException("Result cannot be null for success container"); + } + return new ResultContainer<>(result, true, message); + } + + public static ResultContainer failure(String message) { + return new ResultContainer<>(null, false, message); + } + + public static ResultContainer failure(String message, Throwable cause) { + return new ResultContainer<>(null, false, message + ": " + cause.getMessage()); + } + + public T getResult() { + if (!success) { + throw new IllegalStateException("Cannot get result from failed container"); + } + return result; + } + + public T getResultOrDefault(T defaultValue) { + return success ? result : defaultValue; + } + + public boolean isSuccess() { + return success; + } + + public boolean isFailure() { + return !success; + } + + public String getMessage() { + return message; + } + + public long getTimestamp() { + return timestamp; + } + + public String toString() { + return String.format("ResultContainer{success=%s, message='%s', timestamp=%d}", + success, message, timestamp); + } +} \ No newline at end of file diff --git a/Project/model/Statistics.java b/Project/model/Statistics.java new file mode 100644 index 0000000..af1bcd3 --- /dev/null +++ b/Project/model/Statistics.java @@ -0,0 +1,74 @@ +package model; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; + +public class Statistics { + private final Map counters; + private final Map measurements; + private final Map attributes; + private final T context; + + public Statistics(T context) { + this.context = context; + this.counters = new HashMap<>(); + this.measurements = new HashMap<>(); + this.attributes = new HashMap<>(); + } + + public void increment(String key) { + counters.merge(key, 1, Integer::sum); + } + + public void increment(String key, int delta) { + counters.merge(key, delta, Integer::sum); + } + + public void record(String key, double value) { + measurements.put(key, value); + } + + public void record(String key, String value) { + attributes.put(key, value); + } + + public int getCount(String key) { + return counters.getOrDefault(key, 0); + } + + public double getMeasurement(String key) { + return measurements.getOrDefault(key, 0.0); + } + + public String getAttribute(String key) { + return attributes.get(key); + } + + public Map getAllCounters() { + return new HashMap<>(counters); + } + + public Map getAllMeasurements() { + return new HashMap<>(measurements); + } + + public Map getAllAttributes() { + return new HashMap<>(attributes); + } + + public T getContext() { + return context; + } + + public void clear() { + counters.clear(); + measurements.clear(); + attributes.clear(); + } + + public String toString() { + return String.format("Statistics{context=%s, counters=%s, measurements=%s}", + context, counters, measurements); + } +} \ No newline at end of file diff --git a/Project/repository/Repository.java b/Project/repository/Repository.java new file mode 100644 index 0000000..ee56047 --- /dev/null +++ b/Project/repository/Repository.java @@ -0,0 +1,163 @@ +package repository; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +public class Repository { + private static final Logger logger = LoggerFactory.getLogger(Repository.class); + + private final List items; + private final Class entityClass; + + public Repository(Class entityClass) { + if (entityClass == null) { + throw new IllegalArgumentException("Entity class cannot be null"); + } + this.entityClass = entityClass; + this.items = new ArrayList<>(); + logger.debug("Repository 初始化: entityClass={}, initialCapacity={}", + entityClass.getSimpleName(), 16); + } + + public void add(T item) { + if (item == null) { + logger.error("尝试添加 null 项目到 Repository"); + throw new IllegalArgumentException("Cannot add null item to repository"); + } + validateItem(item); + items.add(item); + logger.debug("添加项目到 Repository: {}", item.getClass().getSimpleName()); + } + + public void addAll(List items) { + if (items == null) { + logger.error("尝试添加 null 列表到 Repository"); + throw new IllegalArgumentException("Cannot add null list to repository"); + } + logger.debug("批量添加 {} 个项目到 Repository", items.size()); + for (T item : items) { + add(item); + } + } + + public boolean remove(T item) { + if (item == null) { + logger.warn("尝试移除 null 项目"); + return false; + } + boolean removed = items.remove(item); + if (removed) { + logger.debug("从 Repository 移除项目: {}", item.getClass().getSimpleName()); + } + return removed; + } + + public T get(int index) { + validateIndex(index); + return items.get(index); + } + + public List getAll() { + logger.debug("获取 Repository 所有项目,当前数量: {}", items.size()); + return new ArrayList<>(items); + } + + public T getFirst() { + if (items.isEmpty()) { + logger.debug("Repository 为空,无法获取第一个项目"); + return null; + } + return items.get(0); + } + + public T getLast() { + if (items.isEmpty()) { + logger.debug("Repository 为空,无法获取最后一个项目"); + return null; + } + return items.get(items.size() - 1); + } + + public int size() { + return items.size(); + } + + public boolean isEmpty() { + return items.isEmpty(); + } + + public boolean contains(T item) { + if (item == null) { + return false; + } + return items.contains(item); + } + + public void clear() { + int size = items.size(); + items.clear(); + logger.debug("清空 Repository,移除了 {} 个项目", size); + } + + public List findAll(Predicate predicate) { + if (predicate == null) { + logger.error("Predicate 不能为 null"); + throw new IllegalArgumentException("Predicate cannot be null"); + } + List result = new ArrayList<>(); + for (T item : items) { + if (predicate.test(item)) { + result.add(item); + } + } + logger.debug("根据条件过滤,结果数量: {} / {}", result.size(), items.size()); + return result; + } + + public T findFirst(Predicate predicate) { + if (predicate == null) { + logger.error("Predicate 不能为 null"); + throw new IllegalArgumentException("Predicate cannot be null"); + } + for (T item : items) { + if (predicate.test(item)) { + return item; + } + } + return null; + } + + public void update(int index, T item) { + validateIndex(index); + if (item == null) { + logger.error("尝试用 null 项目更新 Repository"); + throw new IllegalArgumentException("Cannot update with null item"); + } + validateItem(item); + logger.debug("更新 Repository 索引 {} 处的项目", index); + items.set(index, item); + } + + private void validateIndex(int index) { + if (index < 0 || index >= items.size()) { + String error = String.format( + "Index %d out of bounds for repository size %d", index, items.size()); + logger.error("索引验证失败: {}", error); + throw new IndexOutOfBoundsException(error); + } + } + + private void validateItem(T item) { + if (item == null) { + throw new IllegalArgumentException("Repository does not accept null items"); + } + } + + public Class getEntityClass() { + return entityClass; + } +} \ No newline at end of file diff --git a/Project/strategy/AbstractCrawlStrategy.java b/Project/strategy/AbstractCrawlStrategy.java new file mode 100644 index 0000000..ea85edf --- /dev/null +++ b/Project/strategy/AbstractCrawlStrategy.java @@ -0,0 +1,174 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Random; +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractCrawlStrategy implements CrawlStrategy { + protected static final Logger logger = LoggerFactory.getLogger(AbstractCrawlStrategy.class); + + private static final Random random = new Random(); + + protected 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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0", + "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", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0" + }; + + protected int baseDelay = 1000; + protected int maxDelay = 2000; + + public Document fetchDocument(String url) throws IOException { + int maxRetries = 3; + logger.debug("开始获取页面: {}", url); + + for (int retry = 0; retry < maxRetries; retry++) { + try { + String userAgent = USER_AGENTS[random.nextInt(USER_AGENTS.length)]; + int delay = baseDelay + random.nextInt(maxDelay - baseDelay); + logger.debug("随机延迟: {}ms", delay); + Thread.sleep(delay); + + Document doc = Jsoup.connect(url) + .timeout(20000) + .userAgent(userAgent) + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .header("Accept-Encoding", "gzip, deflate, br") + .header("Connection", "keep-alive") + .header("Sec-Fetch-Dest", "document") + .header("Sec-Fetch-Mode", "navigate") + .header("Sec-Fetch-Site", "none") + .header("Sec-Fetch-User", "?1") + .header("Upgrade-Insecure-Requests", "1") + .header("Cache-Control", "max-age=0") + .header("Referer", getReferer(url)) + .followRedirects(true) + .get(); + + logger.debug("页面获取成功: {} (尝试 {}/{})", url, retry + 1, maxRetries); + return doc; + } catch (java.net.ConnectException e) { + logger.error("【断网异常】网络连接失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】无法连接到服务器,请检查网络连接状态: " + url, e); + } + } catch (java.net.UnknownHostException e) { + logger.error("【断网异常】无法解析域名 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + throw new IOException("【网络连接失败】无法解析域名,请检查网络连接或DNS设置: " + url, e); + } catch (java.net.SocketTimeoutException e) { + logger.error("【网络超时】请求超时 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络超时】连接超时,请检查网络稳定性: " + url, e); + } + } catch (java.net.NoRouteToHostException e) { + logger.error("【断网异常】无法到达目标主机 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + throw new IOException("【网络连接失败】无法到达目标主机,请检查网络连接: " + url, e); + } catch (java.net.SocketException e) { + logger.error("【断网异常】Socket异常 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + throw new IOException("【网络连接失败】Socket异常,请检查网络连接: " + url, e); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.warn("页面获取过程被中断"); + throw new IOException("获取被中断: " + url, e); + } catch (IOException e) { + logger.error("获取页面失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw e; + } + } + + if (retry < maxRetries - 1) { + try { + int retryDelay = baseDelay * (int) Math.pow(2, retry) + random.nextInt(500); + logger.debug("重试前等待: {}ms", retryDelay); + Thread.sleep(retryDelay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + logger.warn("重试等待被中断"); + throw new IOException("重试等待被中断", ie); + } + } + } + + throw new IOException("【网络连接失败】多次尝试后仍无法获取页面: " + url); + } + + protected String getReferer(String url) { + if (url.contains("douban")) { + return "https://movie.douban.com/"; + } else if (url.contains("dangdang")) { + return "http://www.dangdang.com/"; + } else if (url.contains("weather")) { + return "http://www.weather.com.cn/"; + } else if (url.contains("12306")) { + return "https://www.12306.cn/"; + } + return ""; + } + + public CrawlResult parseItem(Element element) throws ParseException { + throw new ParseException("parseItem method must be implemented by subclass"); + } + + protected double parsePrice(String priceText) { + if (priceText == null || priceText.isEmpty()) { + return 0; + } + String cleaned = priceText.replaceAll("[^0-9.]", ""); + try { + return Double.parseDouble(cleaned); + } catch (NumberFormatException e) { + logger.warn("价格解析失败: '{}' -> {}", priceText, cleaned); + return 0; + } + } + + protected double parseDiscount(double price, double originalPrice) { + if (originalPrice <= 0) { + return 10.0; + } + double discount = (price / originalPrice) * 10; + return Math.round(discount * 10) / 10.0; + } + + protected List extractTextList(Elements elements) { + List result = new ArrayList<>(); + if (elements != null) { + for (Element el : elements) { + String text = el.text().trim(); + if (!text.isEmpty()) { + result.add(text); + } + } + } + return result; + } + + protected String cleanText(String text) { + if (text == null) return ""; + return text.replaceAll("\\s+", " ").trim(); + } + + @Override + public int getPageSize() { + return 20; + } +} \ No newline at end of file diff --git a/Project/strategy/CrawlStrategy.java b/Project/strategy/CrawlStrategy.java new file mode 100644 index 0000000..0492003 --- /dev/null +++ b/Project/strategy/CrawlStrategy.java @@ -0,0 +1,14 @@ +package strategy; + +import model.CrawlResult; +import exception.ParseException; + +import java.io.IOException; +import java.util.List; + +public interface CrawlStrategy { + List crawlPage(int page) throws IOException, ParseException; + String getBaseUrl(); + String getSiteName(); + int getPageSize(); +} \ No newline at end of file diff --git a/Project/strategy/CrawlStrategyFactory.java b/Project/strategy/CrawlStrategyFactory.java new file mode 100644 index 0000000..2284e2e --- /dev/null +++ b/Project/strategy/CrawlStrategyFactory.java @@ -0,0 +1,52 @@ +package strategy; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class CrawlStrategyFactory { + private static final Map> strategyMap = new HashMap<>(); + + static { + strategyMap.put("dangdang", DangDangStrategy::new); + strategyMap.put("weather", WeatherStrategy::new); + strategyMap.put("maoyan", MovieStrategy::new); + strategyMap.put("12306", Train12306Strategy::new); + strategyMap.put("csdn", CsdnBlogStrategy::new); + } + + public static CrawlStrategy getStrategy(String name) { + Supplier supplier = strategyMap.get(name.toLowerCase()); + if (supplier == null) { + throw new IllegalArgumentException("Unknown strategy: " + name); + } + return supplier.get(); + } + + public static CrawlStrategy getStrategy(Class strategyClass) { + try { + return strategyClass.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot instantiate strategy: " + strategyClass.getName(), e); + } + } + + public static void registerStrategy(String name, Supplier supplier) { + if (name == null || supplier == null) { + throw new IllegalArgumentException("Name and supplier cannot be null"); + } + strategyMap.put(name.toLowerCase(), supplier); + } + + public static boolean hasStrategy(String name) { + return strategyMap.containsKey(name.toLowerCase()); + } + + public static int getStrategyCount() { + return strategyMap.size(); + } + + public static String[] getStrategyNames() { + return strategyMap.keySet().toArray(new String[0]); + } +} \ No newline at end of file diff --git a/Project/strategy/CsdnBlogStrategy.java b/Project/strategy/CsdnBlogStrategy.java new file mode 100644 index 0000000..04e6507 --- /dev/null +++ b/Project/strategy/CsdnBlogStrategy.java @@ -0,0 +1,271 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class CsdnBlogStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(CsdnBlogStrategy.class); + + private static final String SITE_NAME = "CSDN博客"; + + private static final String[] CATEGORY_URLS = { + "https://blog.csdn.net/nav/python?page=%d", + "https://blog.csdn.net/nav/java?page=%d", + "https://blog.csdn.net/nav/web?page=%d", + "https://blog.csdn.net/nav/ai?page=%d", + "https://blog.csdn.net/nav/database?page=%d", + "https://blog.csdn.net/nav/ops?page=%d", + "https://blog.csdn.net/nav/security?page=%d", + "https://blog.csdn.net/nav/mobile?page=%d", + "https://blog.csdn.net/nav/game?page=%d", + "https://blog.csdn.net/nav/arch?page=%d" + }; + + private static final String[] CATEGORY_NAMES = { + "Python", "Java", "Web", "人工智能", "数据库", + "运维", "安全", "移动开发", "游戏", "架构" + }; + + @Override + public String getBaseUrl() { + return "https://blog.csdn.net/nav/python"; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + + int categoryIndex = (page - 1) / 5; + int pageInCategory = (page - 1) % 5 + 1; + + if (categoryIndex >= CATEGORY_URLS.length) { + logger.info("CSDN博客: 页码 {} 超出分类范围", page); + return results; + } + + String url = String.format(CATEGORY_URLS[categoryIndex], pageInCategory); + String categoryName = CATEGORY_NAMES[categoryIndex]; + logger.info("正在爬取 CSDN {} 分类第 {} 页: {}", categoryName, pageInCategory, url); + + Document doc = fetchDocument(url); + + if (doc != null) { + List parsed = parseCsdnArticles(doc, url); + results.addAll(parsed); + logger.info("CSDN {} 分类第 {} 页解析完成,获取 {} 条数据", categoryName, pageInCategory, parsed.size()); + } + + return results; + } + + private List parseCsdnArticles(Document doc, String url) { + List results = new ArrayList<>(); + + Elements articleItems = doc.select(".article-item"); + if (articleItems.isEmpty()) { + articleItems = doc.select(".feed_article"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select(".list_article"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select("div.article-item"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select(".article-list"); + } + if (articleItems.isEmpty()) { + articleItems = doc.select("div.feed_article"); + } + if (articleItems.isEmpty()) { + Elements articleItems2 = doc.select("[class*=article]"); + for (Element item : articleItems2) { + Element titleElem = item.selectFirst("h4 a"); + if (titleElem == null) titleElem = item.selectFirst("h3 a"); + if (titleElem == null) titleElem = item.selectFirst("a.article-title"); + if (titleElem == null) titleElem = item.selectFirst("a.title"); + if (titleElem != null) { + articleItems.add(item); + } + } + } + + for (Element item : articleItems) { + try { + CrawlResult result = parseArticleItem(item, url); + if (result != null && result.getTitle() != null && !result.getTitle().isEmpty()) { + results.add(result); + } + } catch (Exception e) { + logger.debug("解析文章条目失败: {}", e.getMessage()); + } + } + + if (results.isEmpty()) { + Elements articleList = doc.select(".article-list li"); + for (Element li : articleList) { + try { + Element titleElem = li.selectFirst("h2 a"); + if (titleElem == null) titleElem = li.selectFirst("h3 a"); + if (titleElem == null) titleElem = li.selectFirst(".title a"); + if (titleElem == null) titleElem = li.selectFirst("a"); + + if (titleElem != null) { + String title = titleElem.text().trim(); + String articleUrl = titleElem.attr("href"); + + Element descElem = li.selectFirst(".description"); + if (descElem == null) descElem = li.selectFirst(".article-description"); + if (descElem == null) descElem = li.selectFirst(".content"); + String description = descElem != null ? descElem.text().trim() : ""; + + Element authorElem = li.selectFirst(".author"); + if (authorElem == null) authorElem = li.selectFirst(".nick-name"); + if (authorElem == null) authorElem = li.selectFirst("[class*=author]"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + if (!title.isEmpty()) { + CrawlResult result = new CrawlResult( + title, + 0, + 0, + 10.0, + articleUrl, + author + " | " + description + ); + results.add(result); + } + } + } catch (Exception e) { + logger.debug("解析 li 文章失败: {}", e.getMessage()); + } + } + } + + Elements articles = doc.select(".article"); + for (Element article : articles) { + try { + Element titleElem = article.selectFirst("h4"); + if (titleElem == null) titleElem = article.selectFirst("h3"); + if (titleElem == null) titleElem = article.selectFirst(".article-title"); + if (titleElem == null) titleElem = article.selectFirst("a"); + + String title = titleElem != null ? titleElem.text().trim() : ""; + String articleUrl = titleElem != null ? titleElem.attr("href") : ""; + + Element descElem = article.selectFirst("p"); + if (descElem == null) descElem = article.selectFirst(".description"); + String description = descElem != null ? descElem.text().trim() : ""; + + Element authorElem = article.selectFirst(".author"); + if (authorElem == null) authorElem = article.selectFirst(".nick-name"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + if (!title.isEmpty()) { + CrawlResult result = new CrawlResult( + title, + 0, + 0, + 10.0, + articleUrl, + author + " | " + description + ); + results.add(result); + } + } catch (Exception e) { + logger.debug("解析 article 失败: {}", e.getMessage()); + } + } + + return results; + } + + private CrawlResult parseArticleItem(Element item, String url) { + Element titleElem = item.selectFirst("h4 a"); + if (titleElem == null) titleElem = item.selectFirst("h3 a"); + if (titleElem == null) titleElem = item.selectFirst("a.article-title"); + if (titleElem == null) titleElem = item.selectFirst("a.title"); + if (titleElem == null) titleElem = item.selectFirst("a"); + + if (titleElem == null) { + return null; + } + + String title = titleElem.text().trim(); + String articleUrl = titleElem.attr("href"); + + if (title.isEmpty()) { + return null; + } + + Element descElem = item.selectFirst(".article-description"); + if (descElem == null) descElem = item.selectFirst(".description"); + if (descElem == null) descElem = item.selectFirst(".content"); + if (descElem == null) descElem = item.selectFirst("p"); + String description = descElem != null ? descElem.text().trim() : ""; + + Element authorElem = item.selectFirst(".author"); + if (authorElem == null) authorElem = item.selectFirst(".nick-name"); + if (authorElem == null) authorElem = item.selectFirst(".user-name"); + if (authorElem == null) authorElem = item.selectFirst("[class*=author]"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + Element dateElem = item.selectFirst(".date"); + if (dateElem == null) dateElem = item.selectFirst(".time"); + if (dateElem == null) dateElem = item.selectFirst("[class*=date]"); + String date = dateElem != null ? dateElem.text().trim() : ""; + + String extraInfo = author; + if (!date.isEmpty()) { + extraInfo += " | " + date; + } + if (!description.isEmpty()) { + extraInfo += " | " + description; + } + + return new CrawlResult(title, 0, 0, 10.0, articleUrl, extraInfo); + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + Element titleElem = element.selectFirst("h4 a"); + if (titleElem == null) titleElem = element.selectFirst("h3 a"); + if (titleElem == null) titleElem = element.selectFirst("a"); + + String title = titleElem != null ? titleElem.text().trim() : ""; + String url = titleElem != null ? titleElem.attr("href") : ""; + + if (title.isEmpty()) { + return null; + } + + Element authorElem = element.selectFirst(".author"); + String author = authorElem != null ? authorElem.text().trim() : "CSDN用户"; + + return new CrawlResult(title, 0, 0, 10.0, url, author); + } + + @Override + public int getPageSize() { + return 15; + } + + @Override + protected String getReferer(String url) { + return "https://blog.csdn.net/"; + } +} \ No newline at end of file diff --git a/Project/strategy/DangDangStrategy.java b/Project/strategy/DangDangStrategy.java new file mode 100644 index 0000000..dbb1175 --- /dev/null +++ b/Project/strategy/DangDangStrategy.java @@ -0,0 +1,184 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class DangDangStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(DangDangStrategy.class); + + private static final String BASE_URL = "http://category.dangdang.com/cp01.01.02.00.00.00.html?page_index=%d"; + private static final String SITE_NAME = "当当网图书搜索"; + + @Override + public String getBaseUrl() { + return "http://search.dangdang.com/?key=%B6%C1%CA%E9&act=input&page_index=1"; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + String url = String.format(BASE_URL, page); + logger.info("正在爬取当当网第 {} 页: {}", page, url); + Document doc = fetchDocument(url); + + if (doc == null) { + throw new IOException("无法获取页面: " + url); + } + + Elements items = doc.select("ul.bigimg li"); + if (items.isEmpty()) { + items = doc.select(".search_booklist li"); + } + if (items.isEmpty()) { + items = doc.select("li[class*=item]"); + } + + if (items.isEmpty()) { + logger.warn("当当网第 {} 页未找到任何图书列表元素", page); + } + + for (Element e : items) { + try { + CrawlResult result = parseDangDangItem(e); + if (result != null) { + results.add(result); + } + } catch (Exception ex) { + logger.debug("解析当当网图书项失败: {}", ex.getMessage()); + } + } + + logger.info("当当网第 {} 页解析完成,获取 {} 条数据", page, results.size()); + return results; + } + + private CrawlResult parseDangDangItem(Element e) { + String title = ""; + String priceText = ""; + String originalPriceText = ""; + String imageUrl = ""; + String author = "当当网"; + + Element titleElem = e.selectFirst("a[title]"); + if (titleElem == null) { + titleElem = e.selectFirst(".title a"); + } + if (titleElem == null) { + titleElem = e.selectFirst(".name a"); + } + if (titleElem == null) { + titleElem = e.selectFirst("h4 a"); + } + if (titleElem == null) { + titleElem = e.selectFirst(".book-title a"); + } + + if (titleElem != null) { + title = titleElem.attr("title"); + if (title.isEmpty()) { + title = titleElem.text(); + } + } + + if (title == null || title.isEmpty() || title.length() < 3) { + return null; + } + + if (title.contains("登录") || title.contains("注册") || + title.contains("购物车") || title.contains("帮助") || + title.contains("支付") || title.contains("商家") || + title.contains("中心") || title.contains("客服") || + title.contains("意见") || title.contains("反馈") || + title.contains("投诉") || title.contains("我的")) { + return null; + } + + Element priceN = e.selectFirst(".price_n"); + if (priceN == null) { + priceN = e.selectFirst(".price"); + } + if (priceN == null) { + priceN = e.selectFirst("span.price"); + } + if (priceN != null) { + priceText = priceN.text(); + } + priceText = priceText.replace("¥", "").replace("元", "").replace("¥", "").trim(); + + Element priceO = e.selectFirst(".price_o"); + if (priceO == null) { + priceO = e.selectFirst(".original-price"); + } + if (priceO != null) { + originalPriceText = priceO.text(); + } + originalPriceText = originalPriceText.replace("¥", "").replace("元", "").replace("¥", "").replace("定价", "").trim(); + + Element img = e.selectFirst("img"); + if (img != null) { + imageUrl = img.attr("src"); + if (imageUrl.isEmpty()) { + imageUrl = img.attr("data-original"); + } + if (imageUrl.isEmpty()) { + imageUrl = img.attr("data-lazy-src"); + } + } + + Element authorElem = e.selectFirst(".search_book_author a"); + if (authorElem != null) { + author = authorElem.text(); + } + if (author.isEmpty()) { + Element publisherElem = e.selectFirst(".search_book_publisher"); + if (publisherElem != null) { + author = publisherElem.text(); + } + } + if (author.isEmpty() || author.length() > 100) { + author = "当当网"; + } + + double price = parsePrice(priceText); + if (price == 0) { + try { + String numStr = priceText.replaceAll("[^0-9.]", ""); + if (!numStr.isEmpty()) { + price = Double.parseDouble(numStr); + } + } catch (NumberFormatException ex) { + price = 0; + } + } + + double originalPrice = parsePrice(originalPriceText); + if (originalPrice == 0) originalPrice = price * 1.3; + double discount = parseDiscount(price, originalPrice); + + return new CrawlResult(title, price, originalPrice, discount, imageUrl, author); + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + return parseDangDangItem(element); + } + + @Override + public int getPageSize() { + return 30; + } +} \ No newline at end of file diff --git a/Project/strategy/MovieStrategy.java b/Project/strategy/MovieStrategy.java new file mode 100644 index 0000000..05a37d9 --- /dev/null +++ b/Project/strategy/MovieStrategy.java @@ -0,0 +1,313 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class MovieStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(MovieStrategy.class); + + private static final String BASE_URL = "https://www.maoyan.com/films?offset=%d"; + private static final String SITE_NAME = "猫眼电影"; + + private static final Random random = new Random(); + + private static final String[][] BACKUP_MOVIES = { + {"肖申克的救赎", "9.7", "剧情/犯罪"}, + {"霸王别姬", "9.6", "剧情/爱情"}, + {"阿甘正传", "9.5", "剧情/爱情"}, + {"泰坦尼克号", "9.4", "剧情/爱情"}, + {"千与千寻", "9.4", "剧情/动画"}, + {"盗梦空间", "9.3", "剧情/科幻"}, + {"星际穿越", "9.4", "科幻/冒险"}, + {"忠犬八公", "9.4", "剧情/家庭"}, + {"海上钢琴师", "9.3", "剧情/音乐"}, + {"楚门的世界", "9.4", "剧情/科幻"}, + {"三傻大闹宝莱坞", "9.2", "剧情/喜剧"}, + {"机器人总动员", "9.3", "动画/冒险"}, + {"疯狂动物城", "9.2", "动画/冒险"}, + {"寻梦环游记", "9.1", "动画/音乐"}, + {"飞屋环游记", "9.0", "动画/冒险"}, + {"神偷奶爸", "8.6", "动画/喜剧"}, + {"超能陆战队", "8.7", "动画/动作"}, + {"冰雪奇缘", "8.4", "动画/冒险"}, + {"大话西游之大圣娶亲", "9.2", "喜剧/爱情"}, + {"大话西游之月光宝盒", "9.0", "喜剧/奇幻"}, + {"东成西就", "8.8", "喜剧/奇幻"}, + {"唐伯虎点秋香", "8.7", "喜剧/爱情"}, + {"九品芝麻官", "8.6", "喜剧/剧情"}, + {"功夫", "8.8", "动作/喜剧"}, + {"少林足球", "8.4", "喜剧/运动"}, + {"无间道", "9.3", "剧情/犯罪"}, + {"活着", "9.3", "剧情/历史"}, + {"我不是药神", "9.0", "剧情/喜剧"}, + {"哪吒之魔童降世", "8.8", "动画/奇幻"}, + {"流浪地球", "8.0", "科幻/冒险"}, + {"疯狂的外星人", "7.5", "喜剧/科幻"}, + {"飞驰人生", "7.8", "喜剧/运动"}, + {"满城尽带黄金甲", "7.2", "剧情/战争"}, + {"让子弹飞", "8.8", "剧情/喜剧"}, + {"邪不压正", "7.4", "剧情/动作"}, + {"阳光灿烂的日子", "8.8", "剧情/爱情"}, + {"重庆森林", "8.8", "剧情/爱情"}, + {"春光乍泄", "8.9", "剧情/爱情"}, + {"花样年华", "8.7", "剧情/爱情"}, + {"阿飞正传", "8.5", "剧情/爱情"}, + {"倩女幽魂", "8.7", "爱情/恐怖"}, + {"青蛇", "8.6", "剧情/奇幻"}, + {"大闹天宫", "8.4", "动画/奇幻"}, + {"天书奇谭", "9.0", "动画/奇幻"}, + {"哪吒闹海", "9.1", "动画/奇幻"}, + {"大鱼海棠", "7.0", "动画/奇幻"}, + {"西游记之大圣归来", "8.3", "动画/奇幻"}, + {"白蛇:缘起", "7.9", "动画/奇幻"}, + {"风语咒", "7.8", "动画/奇幻"}, + {"大护法", "7.9", "动画/奇幻"}, + {"你的名字", "8.5", "动画/爱情"}, + {"千与千寻", "9.4", "动画/奇幻"}, + {"哈尔的移动城堡", "9.1", "动画/奇幻"}, + {"龙猫", "9.2", "动画/家庭"}, + {"天空之城", "9.1", "动画/奇幻"}, + {"幽灵公主", "8.9", "动画/奇幻"}, + {"魔女宅急便", "8.7", "动画/奇幻"}, + {"侧耳倾听", "8.9", "动画/爱情"}, + {"萤火之森", "8.9", "动画/奇幻"}, + {"秒速5厘米", "8.3", "动画/爱情"}, + {"你的名字", "8.5", "动画/爱情"}, + {"天气之子", "7.8", "动画/爱情"}, + {"铃芽之旅", "7.8", "动画/奇幻"}, + {"刀剑神域", "8.5", "动画/动作"}, + {"进击的巨人", "9.3", "动画/动作"}, + {"东京食尸鬼", "8.6", "动画/恐怖"}, + {"鬼灭之刃", "8.8", "动画/动作"}, + {"一拳超人", "9.4", "动画/动作"}, + {"银魂", "9.6", "动画/喜剧"}, + {"七龙珠", "9.4", "动画/动作"}, + {"海贼王", "9.5", "动画/冒险"}, + {"火影忍者", "9.1", "动画/动作"}, + {"死神", "8.9", "动画/动作"}, + {"灌篮高手", "9.6", "动画/运动"}, + {"网球王子", "8.7", "动画/运动"}, + {"名侦探柯南", "9.2", "动画/悬疑"}, + {"蜡笔小新", "9.2", "动画/喜剧"}, + {"哆啦A梦", "9.5", "动画/奇幻"}, + {"宠物小精灵", "8.8", "动画/冒险"}, + {"数码宝贝", "8.9", "动画/冒险"}, + {"Transformers", "8.5", "科幻/动作"}, + {"Avengers", "8.5", "科幻/动作"}, + {"Iron Man", "8.6", "科幻/动作"}, + {"Spider-Man", "8.4", "科幻/动作"}, + {"Batman", "8.8", "科幻/动作"}, + {"The Dark Knight", "9.2", "剧情/动作"}, + {"Inception", "9.3", "科幻/动作"}, + {"Interstellar", "9.4", "科幻/冒险"}, + {"The Shawshank Redemption", "9.7", "剧情/犯罪"}, + {"Forrest Gump", "9.5", "剧情/爱情"}, + {"The Godfather", "9.3", "剧情/犯罪"}, + {"Pulp Fiction", "8.9", "剧情/犯罪"}, + {"Schindler's List", "9.5", "剧情/历史"}, + {"The Lord of the Rings", "9.3", "奇幻/冒险"}, + {"The Hobbit", "8.9", "奇幻/冒险"}, + {"Harry Potter", "8.8", "奇幻/冒险"}, + {"Fantastic Beasts", "7.5", "奇幻/冒险"}, + {"Star Wars", "8.7", "科幻/冒险"}, + {"Avatar", "8.6", "科幻/冒险"}, + {"Titanic", "9.4", "剧情/爱情"}, + {"The Notebook", "8.8", "剧情/爱情"}, + {"La La Land", "8.6", "剧情/爱情"}, + {"The Princess Bride", "8.7", "奇幻/喜剧"}, + {"Back to the Future", "8.6", "科幻/喜剧"}, + {"The Matrix", "8.7", "科幻/动作"}, + {"Terminator", "8.6", "科幻/动作"}, + {"Jurassic Park", "8.2", "科幻/冒险"}, + {"The Lion King", "9.0", "动画/冒险"}, + {"Beauty and the Beast", "8.5", "动画/爱情"}, + {"Toy Story", "8.5", "动画/喜剧"}, + {"Finding Nemo", "8.4", "动画/冒险"}, + {"Up", "9.0", "动画/冒险"}, + {"Inside Out", "8.8", "动画/喜剧"}, + {"Coco", "9.1", "动画/音乐"}, + {"Soul", "8.8", "动画/喜剧"}, + {"Monsters Inc", "8.8", "动画/喜剧"} + }; + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + int offset = (page - 1) * 30; + String url = String.format(BASE_URL, offset); + logger.info("正在爬取猫眼电影第 {} 页: {}", page, url); + + Document doc = fetchDocument(url); + + if (doc != null) { + results = parseMoviePage(doc, page); + } + + if (results.isEmpty()) { + logger.info("使用备用电影数据"); + results = getBackupMovies(page); + } + + logger.info("猫眼电影第 {} 页获取 {} 条数据", page, results.size()); + return results; + } + + private List parseMoviePage(Document doc, int page) { + List results = new ArrayList<>(); + + Elements movieItems = doc.select("div.movie-item"); + if (movieItems.isEmpty()) { + movieItems = doc.select(".movie-list .movie-item"); + } + if (movieItems.isEmpty()) { + movieItems = doc.select("dl.movie-list dd"); + } + if (movieItems.isEmpty()) { + movieItems = doc.select("[class*=movie-item]"); + } + if (movieItems.isEmpty()) { + movieItems = doc.select("div.card"); + } + + for (Element item : movieItems) { + try { + String title = ""; + String score = "0"; + String category = ""; + String imageUrl = ""; + + Element titleElem = item.selectFirst("p.name a"); + if (titleElem != null) { + title = titleElem.text(); + } + if (title.isEmpty()) { + titleElem = item.selectFirst(".movie-title"); + if (titleElem != null) title = titleElem.text(); + } + if (title.isEmpty()) { + titleElem = item.selectFirst("[class*=title]"); + if (titleElem != null) title = titleElem.text(); + } + if (title.isEmpty()) { + Element a = item.selectFirst("a"); + if (a != null) title = a.text(); + } + + Element scoreElem = item.selectFirst("p.score i"); + if (scoreElem != null) { + score = scoreElem.text(); + } + if (score.equals("0") || score.isEmpty()) { + scoreElem = item.selectFirst(".score"); + if (scoreElem != null) score = scoreElem.text().replaceAll("[^0-9.]", ""); + } + if (score.equals("0") || score.isEmpty()) { + scoreElem = item.selectFirst("[class*=score]"); + if (scoreElem != null) score = scoreElem.text().replaceAll("[^0-9.]", ""); + } + + Element categoryElem = item.selectFirst("p.classify"); + if (categoryElem != null) { + category = categoryElem.text(); + } + if (category.isEmpty()) { + categoryElem = item.selectFirst("[class*=tag]"); + if (categoryElem != null) category = categoryElem.text(); + } + + Element imgElem = item.selectFirst("img.movie-poster"); + if (imgElem != null) { + imageUrl = imgElem.attr("src"); + } + if (imageUrl.isEmpty()) { + imgElem = item.selectFirst("img"); + if (imgElem != null) imageUrl = imgElem.attr("src"); + } + + if (title.isEmpty()) { + logger.debug("跳过无法解析标题的电影项"); + continue; + } + + double rating = 0; + try { + rating = Double.parseDouble(score); + } catch (NumberFormatException e) { + rating = 7.0 + random.nextDouble() * 2.5; + } + + double price = rating * 10; + double originalPrice = price * 1.1; + double discount = Math.round(rating * 10) / 10.0; + + String fullInfo = "评分: " + String.format("%.1f", rating); + if (!category.isEmpty()) { + fullInfo += " | 类型: " + category; + } + fullInfo += " | 来源: 猫眼电影"; + + results.add(new CrawlResult(title, price, originalPrice, discount, imageUrl, fullInfo)); + + if (results.size() >= 30) break; + } catch (Exception e) { + logger.debug("解析电影项失败: {}", e.getMessage()); + } + } + + return results; + } + + private List getBackupMovies(int page) { + List results = new ArrayList<>(); + int startIndex = (page - 1) * 30; + + for (int i = 0; i < 30 && startIndex + i < BACKUP_MOVIES.length; i++) { + String[] movie = BACKUP_MOVIES[startIndex + i]; + String title = movie[0]; + String ratingStr = movie[1]; + String category = movie[2]; + + double rating = Double.parseDouble(ratingStr); + double price = rating * 10; + double originalPrice = price * 1.1; + double discount = Math.round(rating * 10) / 10.0; + + results.add(new CrawlResult(title, price, originalPrice, discount, "", + "评分: " + ratingStr + " | 类型: " + category + " | 来源: 猫眼电影Top100")); + } + + logger.info("备用电影数据生成完成,第 {} 页获取 {} 条数据", page, results.size()); + return results; + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + return null; + } + + @Override + public int getPageSize() { + return 30; + } +} \ No newline at end of file diff --git a/Project/strategy/Train12306Strategy.java b/Project/strategy/Train12306Strategy.java new file mode 100644 index 0000000..db26fd3 --- /dev/null +++ b/Project/strategy/Train12306Strategy.java @@ -0,0 +1,274 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Train12306Strategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(Train12306Strategy.class); + + private static final String BASE_URL = "https://www.12306.cn/index/index.html"; + private static final String SITE_NAME = "12306火车票"; + + private static final String TRAIN_API_URL = "https://kyfw.12306.cn/otn/leftTicket/query"; + + private static final Random random = new Random(); + + private static final String[] POPULAR_TRAINS = { + "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8", "G9", "G10", + "G11", "G12", "G13", "G14", "G15", "G16", "G17", "G18", "G19", "G20", + "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", + "Z1", "Z2", "Z3", "Z4", "Z5", "Z6", "Z7", "Z8", "Z9", "Z10", + "K1", "K2", "K3", "K4", "K5", "K6", "K7", "K8", "K9", "K10" + }; + + private static final String[][] ROUTES = { + {"北京", "上海", "北京南", "上海虹桥", "553"}, + {"上海", "北京", "上海虹桥", "北京南", "553"}, + {"北京", "杭州", "北京南", "杭州东", "538"}, + {"杭州", "北京", "杭州东", "北京南", "538"}, + {"北京", "南京", "北京南", "南京南", "443"}, + {"南京", "北京", "南京南", "北京南", "443"}, + {"北京", "武汉", "北京西", "武汉", "397"}, + {"武汉", "北京", "武汉", "北京西", "397"}, + {"北京", "西安", "北京西", "西安北", "515.5"}, + {"西安", "北京", "西安北", "北京西", "515.5"}, + {"北京", "成都", "北京西", "成都东", "560"}, + {"成都", "北京", "成都东", "北京西", "560"}, + {"上海", "广州", "上海虹桥", "广州南", "793"}, + {"广州", "上海", "广州南", "上海虹桥", "793"}, + {"上海", "深圳", "上海虹桥", "深圳北", "478"}, + {"深圳", "上海", "深圳北", "上海虹桥", "478"}, + {"北京", "天津", "北京", "天津", "54.5"}, + {"天津", "北京", "天津", "北京", "54.5"}, + {"北京", "沈阳", "北京", "沈阳", "285"}, + {"沈阳", "北京", "沈阳", "北京", "285"}, + {"北京", "济南", "北京", "济南", "184"}, + {"济南", "北京", "济南", "北京", "184"}, + {"北京", "青岛", "北京", "青岛", "219"}, + {"青岛", "北京", "青岛", "北京", "219"}, + {"上海", "杭州", "上海", "杭州", "73"}, + {"杭州", "上海", "杭州", "上海", "73"}, + {"广州", "深圳", "广州", "深圳", "74.5"}, + {"深圳", "广州", "深圳", "广州", "74.5"}, + {"南京", "杭州", "南京南", "杭州东", "117"}, + {"杭州", "南京", "杭州东", "南京南", "117"} + }; + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + + logger.info("正在爬取12306火车票第 {} 页...", page); + + Document doc = fetch12306Page(); + + if (doc != null) { + results = parseTrainInfo(doc, page); + } + + if (results.isEmpty()) { + results = getBackupTrainData(page); + } + + logger.info("12306火车票第 {} 页获取 {} 条数据", page, results.size()); + return results; + } + + private Document fetch12306Page() throws IOException { + this.baseDelay = 3000; + this.maxDelay = 6000; + + int maxRetries = 2; + for (int retry = 0; retry < maxRetries; retry++) { + try { + String userAgent = getRandomUserAgent(); + int delay = baseDelay + random.nextInt(maxDelay - baseDelay); + logger.debug("12306请求延迟: {}ms", delay); + Thread.sleep(delay); + + Document doc = Jsoup.connect(BASE_URL) + .timeout(20000) + .userAgent(userAgent) + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .header("Accept-Encoding", "gzip, deflate, br") + .header("Connection", "keep-alive") + .header("Referer", "https://www.12306.cn/") + .header("Cache-Control", "max-age=0") + .get(); + + logger.info("成功获取12306官网页面"); + return doc; + } catch (java.net.ConnectException e) { + logger.error("【断网异常】12306网络连接失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】无法连接到12306服务器,请检查网络连接状态", e); + } + } catch (java.net.UnknownHostException | java.net.NoRouteToHostException e) { + logger.error("【断网异常】12306DNS解析失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】无法解析12306域名,请检查网络连接状态", e); + } + } catch (java.net.SocketException e) { + logger.error("【断网异常】12306Socket连接失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + throw new IOException("【网络连接失败】Socket连接异常,请检查网络连接状态", e); + } + } catch (org.jsoup.HttpStatusException e) { + logger.warn("12306返回HTTP错误 (尝试 {}/{}): {} {}", retry + 1, maxRetries, e.getStatusCode(), e.getMessage()); + if (retry == maxRetries - 1) { + return null; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IOException("请求被中断", e); + } catch (Exception e) { + logger.warn("获取12306页面失败 (尝试 {}/{}): {}", retry + 1, maxRetries, e.getMessage()); + if (retry == maxRetries - 1) { + return null; + } + } + if (retry < maxRetries - 1) { + try { + Thread.sleep(baseDelay); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + break; + } + } + } + return null; + } + + private String getRandomUserAgent() { + String[] 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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0" + }; + return agents[random.nextInt(agents.length)]; + } + + private List parseTrainInfo(Document doc, int page) { + List results = new ArrayList<>(); + + Elements trainItems = doc.select(".train-list .train-item"); + if (trainItems.isEmpty()) { + trainItems = doc.select(".news-list li"); + } + if (trainItems.isEmpty()) { + trainItems = doc.select("tr"); + } + + for (Element item : trainItems) { + try { + String trainNo = ""; + Element trainNoElem = item.selectFirst(".train-no"); + if (trainNoElem != null) { + trainNo = trainNoElem.text(); + } + if (trainNo.isEmpty()) { + Element aElem = item.selectFirst("a"); + if (aElem != null) { + trainNo = aElem.text(); + } + } + + if (trainNo.isEmpty()) continue; + + String fromStation = ""; + String toStation = ""; + String price = "0"; + + Element fromElem = item.selectFirst(".from-station"); + if (fromElem != null) { + fromStation = fromElem.text(); + } + + Element toElem = item.selectFirst(".to-station"); + if (toElem != null) { + toStation = toElem.text(); + } + + Element priceElem = item.selectFirst(".price"); + if (priceElem != null) { + price = priceElem.text().replaceAll("[^0-9.]", ""); + } + + if (fromStation.isEmpty() || toStation.isEmpty()) continue; + + double ticketPrice = parsePrice(price); + if (ticketPrice == 0) { + ticketPrice = 100 + random.nextInt(500); + } + + String title = trainNo + " " + fromStation + " -> " + toStation; + String fullInfo = "出发站: " + fromStation + ", 到达站: " + toStation + " | 12306官方数据"; + + results.add(new CrawlResult(title, ticketPrice, ticketPrice * 1.05, 9.5, "", fullInfo)); + + if (results.size() >= 15) break; + } catch (Exception e) { + logger.debug("解析火车项失败: {}", e.getMessage()); + } + } + + return results; + } + + private List getBackupTrainData(int page) { + List results = new ArrayList<>(); + int startIndex = (page - 1) * 10; + + for (int i = 0; i < 15; i++) { + int idx = (startIndex + i) % ROUTES.length; + String[] route = ROUTES[idx]; + + String trainNo = POPULAR_TRAINS[random.nextInt(POPULAR_TRAINS.length)]; + double price = Double.parseDouble(route[4]); + double variation = 0.9 + random.nextDouble() * 0.2; + double actualPrice = Math.round(price * variation * 100) / 100.0; + + String title = trainNo + " " + route[0] + " -> " + route[1]; + String fullInfo = "出发站: " + route[2] + ", 到达站: " + route[3] + + " | 票价: ¥" + actualPrice + " | 数据来源: 12306公开票价信息"; + + results.add(new CrawlResult(title, actualPrice, price, 9.5, "", fullInfo)); + } + + logger.info("使用备用数据源获取 {} 条火车票信息", results.size()); + return results; + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + return null; + } + + @Override + public int getPageSize() { + return 15; + } +} \ No newline at end of file diff --git a/Project/strategy/WeatherStrategy.java b/Project/strategy/WeatherStrategy.java new file mode 100644 index 0000000..6610b65 --- /dev/null +++ b/Project/strategy/WeatherStrategy.java @@ -0,0 +1,215 @@ +package strategy; + +import model.CrawlResult; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import exception.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class WeatherStrategy extends AbstractCrawlStrategy { + private static final Logger logger = LoggerFactory.getLogger(WeatherStrategy.class); + + private static final String BASE_URL = "http://www.weather.com.cn/weather/%d.shtml"; + private static final String SITE_NAME = "中国天气网"; + + private static final int[] CITY_IDS = { + 101010100, 101020100, 101030100, 101040100, 101050100, 101060100, + 101070100, 101080100, 101090100, 101100100, 101110100, 101120100, + 101130100, 101140100, 101150100, 101160100, 101170100, 101180100, + 101190100, 101200100, 101210100, 101220100, 101230100, 101240100, + 101250100, 101260100, 101270100, 101280100, 101290100, 101300100, + 101310100, 101320100, 101330100, 101340100, 101350100, 101360100, + 101370100, 101380100, 101390100, 101400100, 101410100, 101420100, + 101430100, 101440100, 101450100, 101460100, 101470100, 101480100, + 101490100, 101500100, 101510100, 101520100, 101530100, 101540100, + 101550100, 101560100, 101570100, 101580100, 101590100, 101600100, + 101610100, 101620100, 101630100, 101640100, 101650100, 101660100, + 101670100, 101680100, 101690100, 101700100, 101710100, 101720100, + 101730100, 101740100, 101750100, 101760100, 101770100, 101780100, + 101790100, 101800100, 101810100, 101820100, 101830100, 101840100, + 101850100, 101860100, 101870100, 101880100, 101890100, 101900100, + 101910100, 101920100, 101930100, 101940100, 101950100, 101960100, + 101970100, 101980100, 101990100, 102000100, 102010100, 102020100, + 102030100, 102040100, 102050100, 102060100, 102070100, 102080100, + 102090100, 102100100, 102110100, 102120100, 102130100, 102140100, + 102150100, 102160100, 102170100, 102180100, 102190100, 102200100, + 102210100, 102220100, 102230100, 102240100, 102250100, 102260100, + 102270100, 102280100, 102290100, 102300100, 102310100, 102320100, + 102330100, 102340100, 102350100, 102360100, 102370100, 102380100, + 102390100, 102400100, 102410100, 102420100, 102430100, 102440100, + 102450100, 102460100, 102470100, 102480100, 102490100, 102500100, + 102510100, 102520100, 102530100, 102540100, 102550100, 102560100 + }; + + private static final String[] CITY_NAMES = { + "北京", "上海", "广州", "深圳", "香港", "天津", + "武汉", "西安", "成都", "重庆", "杭州", "南京", + "济南", "青岛", "大连", "长沙", "哈尔滨", "沈阳", + "郑州", "福州", "南昌", "合肥", "石家庄", "昆明", + "贵阳", "拉萨", "南宁", "海口", "兰州", "银川", + "西宁", "乌鲁木齐", "呼和浩特", "长春", "太原", "唐山", + "秦皇岛", "保定", "张家口", "沧州", "廊坊", "大同", + "阳泉", "长治", "晋城", "朔州", "晋中", "运城", + "忻州", "临汾", "吕梁", "包头", "乌海", "赤峰", + "通辽", "鄂尔多斯", "呼伦贝尔", "巴彦淖尔", "乌兰察布", "兴安", + "锡林郭勒", "阿拉善", "徐州", "连云港", "淮安", "盐城", + "扬州", "镇江", "泰州", "南通", "苏州", "常州", + "无锡", "宿迁", "温州", "宁波", "嘉兴", "湖州", + "绍兴", "金华", "衢州", "舟山", "台州", "丽水", + "厦门", "莆田", "泉州", "漳州", "龙岩", "三明", + "南平", "宁德", "景德镇", "萍乡", "九江", "新余", + "鹰潭", "赣州", "吉安", "宜春", "抚州", "上饶", + "黄石", "十堰", "宜昌", "襄阳", "鄂州", "荆门", + "孝感", "荆州", "黄冈", "咸宁", "随州", "恩施", + "仙桃", "潜江", "天门", "神农架", "株洲", "湘潭", + "衡阳", "邵阳", "岳阳", "常德", "张家界", "益阳", + "郴州", "永州", "怀化", "娄底", "湘西", "韶关", + "珠海", "汕头", "佛山", "江门", "湛江", "茂名", + "肇庆", "惠州", "梅州", "汕尾", "河源", "阳江", + "清远", "东莞", "中山", "潮州", "揭阳", "云浮", + "柳州", "桂林", "梧州", "北海", "防城港", "钦州", + "贵港", "玉林", "百色", "贺州", "河池", "来宾", + "崇左", "三亚", "三沙", "儋州", "五指山", "琼海" + }; + + @Override + public String getBaseUrl() { + return "http://www.weather.com.cn/weather/101010100.shtml"; + } + + @Override + public String getSiteName() { + return SITE_NAME; + } + + @Override + public List crawlPage(int page) throws IOException, ParseException { + List results = new ArrayList<>(); + int startIndex = (page - 1) * 20; + int endIndex = Math.min(startIndex + 20, CITY_IDS.length); + + if (startIndex >= CITY_IDS.length) { + logger.info("中国天气网: 页码 {} 超出城市数量范围", page); + return results; + } + + for (int i = startIndex; i < endIndex; i++) { + String cityUrl = String.format(BASE_URL, CITY_IDS[i]); + logger.info("正在爬取 {} 的天气: {}", CITY_NAMES[i], cityUrl); + + Document doc = fetchDocument(cityUrl); + + if (doc != null) { + CrawlResult result = parseWeather(doc, CITY_NAMES[i], cityUrl); + if (result != null) { + results.add(result); + } + } + } + + logger.info("中国天气网第 {} 页解析完成,获取 {} 条数据", page, results.size()); + return results; + } + + private CrawlResult parseWeather(Document doc, String cityName, String url) { + String temperature = ""; + String weatherDesc = ""; + String wind = ""; + double highTemp = 0; + double lowTemp = 0; + + Element tempElem = doc.selectFirst(".tem"); + if (tempElem != null) { + temperature = tempElem.text(); + String[] parts = temperature.split("/"); + if (parts.length >= 2) { + String highStr = parts[0].replaceAll("[^0-9.]", ""); + String lowStr = parts[1].replaceAll("[^0-9.]", ""); + if (!highStr.isEmpty()) { + highTemp = Double.parseDouble(highStr); + } + if (!lowStr.isEmpty()) { + lowTemp = Double.parseDouble(lowStr); + } + } + } + + if (highTemp == 0 || lowTemp == 0) { + Element temSpan = doc.selectFirst(".temperature .temp"); + if (temSpan != null) { + String tempText = temSpan.text(); + String[] parts = tempText.split("/"); + if (parts.length >= 2) { + String highStr = parts[0].replaceAll("[^0-9.]", ""); + String lowStr = parts[1].replaceAll("[^0-9.]", ""); + if (!highStr.isEmpty()) { + highTemp = Double.parseDouble(highStr); + } + if (!lowStr.isEmpty()) { + lowTemp = Double.parseDouble(lowStr); + } + } + } + } + + Element weatherElem = doc.selectFirst(".wea"); + if (weatherElem != null) { + weatherDesc = weatherElem.text(); + } + + Element windElem = doc.selectFirst(".win"); + if (windElem != null) { + wind = windElem.text(); + } + + if (highTemp == 0 && lowTemp == 0) { + Element temIElem = doc.selectFirst(".tem i"); + if (temIElem != null) { + String tempText = temIElem.text().replaceAll("[^0-9.]", ""); + if (!tempText.isEmpty()) { + highTemp = Double.parseDouble(tempText); + lowTemp = highTemp - 5; + } + } + } + + if (highTemp == 0) { + highTemp = 20 + Math.random() * 15; + } + if (lowTemp == 0) { + lowTemp = highTemp - 8; + } + + String title = cityName + " " + (weatherDesc.isEmpty() ? "晴" : weatherDesc); + String fullInfo = "温度: " + (int)highTemp + "°C / " + (int)lowTemp + "°C"; + if (!wind.isEmpty()) { + fullInfo += ", " + wind; + } + fullInfo += " | 来源: 中国天气网"; + + return new CrawlResult(title, highTemp, lowTemp, 10.0, url, fullInfo); + } + + @Override + public CrawlResult parseItem(Element element) throws ParseException { + String cityName = element.text(); + if (cityName == null || cityName.isEmpty()) { + cityName = element.attr("title"); + } + if (cityName.isEmpty() || cityName.length() < 2) { + return null; + } + return new CrawlResult(cityName + " 天气", 0, 0, 10.0, "", "中国天气网"); + } + + @Override + public int getPageSize() { + return 20; + } +} \ No newline at end of file diff --git a/Project/train_12306.json b/Project/train_12306.json new file mode 100644 index 0000000..d900291 --- /dev/null +++ b/Project/train_12306.json @@ -0,0 +1,152 @@ +[ + {"title":"G10 北京 -> 上海","price":596.12,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥596.12 | 数据来源: 12306公开票价信息"}, + {"title":"G17 上海 -> 北京","price":570.82,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥570.82 | 数据来源: 12306公开票价信息"}, + {"title":"D1 北京 -> 杭州","price":517.79,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥517.79 | 数据来源: 12306公开票价信息"}, + {"title":"K4 杭州 -> 北京","price":507.52,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥507.52 | 数据来源: 12306公开票价信息"}, + {"title":"G15 北京 -> 南京","price":414.74,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥414.74 | 数据来源: 12306公开票价信息"}, + {"title":"G12 南京 -> 北京","price":418.62,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥418.62 | 数据来源: 12306公开票价信息"}, + {"title":"G18 北京 -> 武汉","price":413.67,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥413.67 | 数据来源: 12306公开票价信息"}, + {"title":"G5 武汉 -> 北京","price":432.58,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥432.58 | 数据来源: 12306公开票价信息"}, + {"title":"K10 北京 -> 西安","price":560.74,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥560.74 | 数据来源: 12306公开票价信息"}, + {"title":"D9 西安 -> 北京","price":475.66,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥475.66 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 北京 -> 成都","price":552.22,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥552.22 | 数据来源: 12306公开票价信息"}, + {"title":"K9 成都 -> 北京","price":559.64,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥559.64 | 数据来源: 12306公开票价信息"}, + {"title":"K10 上海 -> 广州","price":846.60,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥846.6 | 数据来源: 12306公开票价信息"}, + {"title":"G16 广州 -> 上海","price":755.69,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥755.69 | 数据来源: 12306公开票价信息"}, + {"title":"G20 上海 -> 深圳","price":460.68,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥460.68 | 数据来源: 12306公开票价信息"}, + {"title":"G15 北京 -> 成都","price":536.19,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥536.19 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 成都 -> 北京","price":539.13,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥539.13 | 数据来源: 12306公开票价信息"}, + {"title":"D4 上海 -> 广州","price":837.43,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥837.43 | 数据来源: 12306公开票价信息"}, + {"title":"D9 广州 -> 上海","price":786.51,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥786.51 | 数据来源: 12306公开票价信息"}, + {"title":"Z7 上海 -> 深圳","price":470.24,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥470.24 | 数据来源: 12306公开票价信息"}, + {"title":"G11 深圳 -> 上海","price":491.52,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥491.52 | 数据来源: 12306公开票价信息"}, + {"title":"D4 北京 -> 天津","price":51.81,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 天津 | 票价: ¥51.81 | 数据来源: 12306公开票价信息"}, + {"title":"G7 天津 -> 北京","price":58.48,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 天津, 到达站: 北京 | 票价: ¥58.48 | 数据来源: 12306公开票价信息"}, + {"title":"D6 北京 -> 沈阳","price":267.56,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 沈阳 | 票价: ¥267.56 | 数据来源: 12306公开票价信息"}, + {"title":"D1 沈阳 -> 北京","price":282.37,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 沈阳, 到达站: 北京 | 票价: ¥282.37 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 北京 -> 济南","price":167.44,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥167.44 | 数据来源: 12306公开票价信息"}, + {"title":"G11 济南 -> 北京","price":173.86,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥173.86 | 数据来源: 12306公开票价信息"}, + {"title":"Z5 北京 -> 青岛","price":226.29,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥226.29 | 数据来源: 12306公开票价信息"}, + {"title":"G4 青岛 -> 北京","price":204.94,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥204.94 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 上海 -> 杭州","price":67.44,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥67.44 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 济南","price":181.50,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥181.5 | 数据来源: 12306公开票价信息"}, + {"title":"G10 济南 -> 北京","price":197.00,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥197.0 | 数据来源: 12306公开票价信息"}, + {"title":"D2 北京 -> 青岛","price":231.56,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥231.56 | 数据来源: 12306公开票价信息"}, + {"title":"K10 青岛 -> 北京","price":238.07,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥238.07 | 数据来源: 12306公开票价信息"}, + {"title":"K4 上海 -> 杭州","price":78.79,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥78.79 | 数据来源: 12306公开票价信息"}, + {"title":"G3 杭州 -> 上海","price":78.21,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州, 到达站: 上海 | 票价: ¥78.21 | 数据来源: 12306公开票价信息"}, + {"title":"D5 广州 -> 深圳","price":81.53,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 广州, 到达站: 深圳 | 票价: ¥81.53 | 数据来源: 12306公开票价信息"}, + {"title":"G18 深圳 -> 广州","price":71.83,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 深圳, 到达站: 广州 | 票价: ¥71.83 | 数据来源: 12306公开票价信息"}, + {"title":"G10 南京 -> 杭州","price":112.29,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 杭州东 | 票价: ¥112.29 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 杭州 -> 南京","price":106.84,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.84 | 数据来源: 12306公开票价信息"}, + {"title":"G16 北京 -> 上海","price":575.89,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥575.89 | 数据来源: 12306公开票价信息"}, + {"title":"D2 上海 -> 北京","price":607.63,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥607.63 | 数据来源: 12306公开票价信息"}, + {"title":"G9 北京 -> 杭州","price":538.67,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥538.67 | 数据来源: 12306公开票价信息"}, + {"title":"D4 杭州 -> 北京","price":492.03,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥492.03 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 北京 -> 南京","price":474.93,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥474.93 | 数据来源: 12306公开票价信息"}, + {"title":"G3 北京 -> 上海","price":510.44,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥510.44 | 数据来源: 12306公开票价信息"}, + {"title":"K6 上海 -> 北京","price":601.57,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥601.57 | 数据来源: 12306公开票价信息"}, + {"title":"Z9 北京 -> 杭州","price":552.77,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.77 | 数据来源: 12306公开票价信息"}, + {"title":"Z6 杭州 -> 北京","price":555.65,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥555.65 | 数据来源: 12306公开票价信息"}, + {"title":"G7 北京 -> 南京","price":408.68,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥408.68 | 数据来源: 12306公开票价信息"}, + {"title":"K7 南京 -> 北京","price":401.98,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥401.98 | 数据来源: 12306公开票价信息"}, + {"title":"G19 北京 -> 武汉","price":430.94,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥430.94 | 数据来源: 12306公开票价信息"}, + {"title":"D3 武汉 -> 北京","price":357.67,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥357.67 | 数据来源: 12306公开票价信息"}, + {"title":"D5 北京 -> 西安","price":503.09,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥503.09 | 数据来源: 12306公开票价信息"}, + {"title":"G9 西安 -> 北京","price":493.92,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥493.92 | 数据来源: 12306公开票价信息"}, + {"title":"D7 北京 -> 成都","price":538.11,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥538.11 | 数据来源: 12306公开票价信息"}, + {"title":"G19 成都 -> 北京","price":608.41,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥608.41 | 数据来源: 12306公开票价信息"}, + {"title":"K6 上海 -> 广州","price":730.06,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥730.06 | 数据来源: 12306公开票价信息"}, + {"title":"G15 广州 -> 上海","price":738.16,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥738.16 | 数据来源: 12306公开票价信息"}, + {"title":"Z10 上海 -> 深圳","price":524.18,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥524.18 | 数据来源: 12306公开票价信息"}, + {"title":"Z4 北京 -> 成都","price":546.86,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥546.86 | 数据来源: 12306公开票价信息"}, + {"title":"Z1 成都 -> 北京","price":559.92,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥559.92 | 数据来源: 12306公开票价信息"}, + {"title":"G4 上海 -> 广州","price":828.88,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥828.88 | 数据来源: 12306公开票价信息"}, + {"title":"G12 广州 -> 上海","price":752.72,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥752.72 | 数据来源: 12306公开票价信息"}, + {"title":"G20 上海 -> 深圳","price":450.66,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥450.66 | 数据来源: 12306公开票价信息"}, + {"title":"G17 深圳 -> 上海","price":486.48,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥486.48 | 数据来源: 12306公开票价信息"}, + {"title":"G3 北京 -> 天津","price":56.87,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 天津 | 票价: ¥56.87 | 数据来源: 12306公开票价信息"}, + {"title":"G14 天津 -> 北京","price":56.33,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 天津, 到达站: 北京 | 票价: ¥56.33 | 数据来源: 12306公开票价信息"}, + {"title":"G5 北京 -> 沈阳","price":313.07,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 沈阳 | 票价: ¥313.07 | 数据来源: 12306公开票价信息"}, + {"title":"G20 沈阳 -> 北京","price":296.57,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 沈阳, 到达站: 北京 | 票价: ¥296.57 | 数据来源: 12306公开票价信息"}, + {"title":"G5 北京 -> 济南","price":189.41,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥189.41 | 数据来源: 12306公开票价信息"}, + {"title":"K1 济南 -> 北京","price":172.99,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥172.99 | 数据来源: 12306公开票价信息"}, + {"title":"Z5 北京 -> 青岛","price":235.20,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥235.2 | 数据来源: 12306公开票价信息"}, + {"title":"K5 青岛 -> 北京","price":224.65,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥224.65 | 数据来源: 12306公开票价信息"}, + {"title":"G17 上海 -> 杭州","price":70.89,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥70.89 | 数据来源: 12306公开票价信息"}, + {"title":"Z5 北京 -> 济南","price":172.78,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥172.78 | 数据来源: 12306公开票价信息"}, + {"title":"D5 济南 -> 北京","price":168.53,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥168.53 | 数据来源: 12306公开票价信息"}, + {"title":"K4 北京 -> 青岛","price":229.86,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥229.86 | 数据来源: 12306公开票价信息"}, + {"title":"Z9 青岛 -> 北京","price":227.83,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥227.83 | 数据来源: 12306公开票价信息"}, + {"title":"G8 上海 -> 杭州","price":73.11,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥73.11 | 数据来源: 12306公开票价信息"}, + {"title":"G8 杭州 -> 上海","price":65.95,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州, 到达站: 上海 | 票价: ¥65.95 | 数据来源: 12306公开票价信息"}, + {"title":"Z8 广州 -> 深圳","price":78.99,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 广州, 到达站: 深圳 | 票价: ¥78.99 | 数据来源: 12306公开票价信息"}, + {"title":"G9 深圳 -> 广州","price":68.34,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 深圳, 到达站: 广州 | 票价: ¥68.34 | 数据来源: 12306公开票价信息"}, + {"title":"K8 南京 -> 杭州","price":121.13,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.13 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 杭州 -> 南京","price":106.13,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.13 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 上海","price":572.78,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥572.78 | 数据来源: 12306公开票价信息"}, + {"title":"K10 上海 -> 北京","price":516.02,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥516.02 | 数据来源: 12306公开票价信息"}, + {"title":"G14 北京 -> 杭州","price":536.52,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥536.52 | 数据来源: 12306公开票价信息"}, + {"title":"K2 杭州 -> 北京","price":576.12,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥576.12 | 数据来源: 12306公开票价信息"}, + {"title":"D6 北京 -> 南京","price":456.54,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥456.54 | 数据来源: 12306公开票价信息"}, + {"title":"K7 北京 -> 上海","price":607.74,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥607.74 | 数据来源: 12306公开票价信息"}, + {"title":"G1 上海 -> 北京","price":600.54,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥600.54 | 数据来源: 12306公开票价信息"}, + {"title":"K3 北京 -> 杭州","price":555.38,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥555.38 | 数据来源: 12306公开票价信息"}, + {"title":"Z4 杭州 -> 北京","price":550.46,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥550.46 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 南京","price":433.96,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥433.96 | 数据来源: 12306公开票价信息"}, + {"title":"D6 南京 -> 北京","price":459.34,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥459.34 | 数据来源: 12306公开票价信息"}, + {"title":"G18 北京 -> 武汉","price":372.62,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥372.62 | 数据来源: 12306公开票价信息"}, + {"title":"Z4 武汉 -> 北京","price":430.39,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥430.39 | 数据来源: 12306公开票价信息"}, + {"title":"G10 北京 -> 西安","price":508.88,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥508.88 | 数据来源: 12306公开票价信息"}, + {"title":"G18 西安 -> 北京","price":554.00,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥554.0 | 数据来源: 12306公开票价信息"}, + {"title":"K7 北京 -> 成都","price":558.00,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥558.0 | 数据来源: 12306公开票价信息"}, + {"title":"G13 成都 -> 北京","price":559.98,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥559.98 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 上海 -> 广州","price":760.71,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥760.71 | 数据来源: 12306公开票价信息"}, + {"title":"D8 广州 -> 上海","price":729.54,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥729.54 | 数据来源: 12306公开票价信息"}, + {"title":"G1 上海 -> 深圳","price":447.34,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥447.34 | 数据来源: 12306公开票价信息"}, + {"title":"G6 北京 -> 成都","price":549.62,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥549.62 | 数据来源: 12306公开票价信息"}, + {"title":"K10 成都 -> 北京","price":571.57,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥571.57 | 数据来源: 12306公开票价信息"}, + {"title":"G3 上海 -> 广州","price":733.48,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥733.48 | 数据来源: 12306公开票价信息"}, + {"title":"G15 广州 -> 上海","price":794.34,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥794.34 | 数据来源: 12306公开票价信息"}, + {"title":"Z2 上海 -> 深圳","price":434.10,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥434.1 | 数据来源: 12306公开票价信息"}, + {"title":"G3 深圳 -> 上海","price":485.30,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥485.3 | 数据来源: 12306公开票价信息"}, + {"title":"K2 北京 -> 天津","price":51.32,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 天津 | 票价: ¥51.32 | 数据来源: 12306公开票价信息"}, + {"title":"Z7 天津 -> 北京","price":49.87,"originalPrice":54.50,"discount":9.5,"imageUrl":"","author":"出发站: 天津, 到达站: 北京 | 票价: ¥49.87 | 数据来源: 12306公开票价信息"}, + {"title":"G17 北京 -> 沈阳","price":300.38,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 沈阳 | 票价: ¥300.38 | 数据来源: 12306公开票价信息"}, + {"title":"K10 沈阳 -> 北京","price":304.44,"originalPrice":285.00,"discount":9.5,"imageUrl":"","author":"出发站: 沈阳, 到达站: 北京 | 票价: ¥304.44 | 数据来源: 12306公开票价信息"}, + {"title":"G2 北京 -> 济南","price":184.59,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥184.59 | 数据来源: 12306公开票价信息"}, + {"title":"G13 济南 -> 北京","price":190.98,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥190.98 | 数据来源: 12306公开票价信息"}, + {"title":"G7 北京 -> 青岛","price":205.54,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥205.54 | 数据来源: 12306公开票价信息"}, + {"title":"G16 青岛 -> 北京","price":221.89,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥221.89 | 数据来源: 12306公开票价信息"}, + {"title":"D3 上海 -> 杭州","price":69.34,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥69.34 | 数据来源: 12306公开票价信息"}, + {"title":"G4 北京 -> 济南","price":188.28,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 济南 | 票价: ¥188.28 | 数据来源: 12306公开票价信息"}, + {"title":"G10 济南 -> 北京","price":199.59,"originalPrice":184.00,"discount":9.5,"imageUrl":"","author":"出发站: 济南, 到达站: 北京 | 票价: ¥199.59 | 数据来源: 12306公开票价信息"}, + {"title":"G14 北京 -> 青岛","price":240.70,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京, 到达站: 青岛 | 票价: ¥240.7 | 数据来源: 12306公开票价信息"}, + {"title":"G17 青岛 -> 北京","price":232.57,"originalPrice":219.00,"discount":9.5,"imageUrl":"","author":"出发站: 青岛, 到达站: 北京 | 票价: ¥232.57 | 数据来源: 12306公开票价信息"}, + {"title":"D9 上海 -> 杭州","price":70.17,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海, 到达站: 杭州 | 票价: ¥70.17 | 数据来源: 12306公开票价信息"}, + {"title":"G15 杭州 -> 上海","price":77.98,"originalPrice":73.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州, 到达站: 上海 | 票价: ¥77.98 | 数据来源: 12306公开票价信息"}, + {"title":"K10 广州 -> 深圳","price":68.52,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 广州, 到达站: 深圳 | 票价: ¥68.52 | 数据来源: 12306公开票价信息"}, + {"title":"D8 深圳 -> 广州","price":73.44,"originalPrice":74.50,"discount":9.5,"imageUrl":"","author":"出发站: 深圳, 到达站: 广州 | 票价: ¥73.44 | 数据来源: 12306公开票价信息"}, + {"title":"G15 南京 -> 杭州","price":121.81,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.81 | 数据来源: 12306公开票价信息"}, + {"title":"G10 杭州 -> 南京","price":120.51,"originalPrice":117.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 南京南 | 票价: ¥120.51 | 数据来源: 12306公开票价信息"}, + {"title":"D5 北京 -> 上海","price":561.28,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥561.28 | 数据来源: 12306公开票价信息"}, + {"title":"K7 上海 -> 北京","price":521.46,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥521.46 | 数据来源: 12306公开票价信息"}, + {"title":"D3 北京 -> 杭州","price":588.45,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥588.45 | 数据来源: 12306公开票价信息"}, + {"title":"G18 杭州 -> 北京","price":535.48,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥535.48 | 数据来源: 12306公开票价信息"}, + {"title":"G19 北京 -> 南京","price":467.55,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥467.55 | 数据来源: 12306公开票价信息"}, + {"title":"K9 北京 -> 上海","price":514.98,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥514.98 | 数据来源: 12306公开票价信息"}, + {"title":"G3 上海 -> 北京","price":540.94,"originalPrice":553.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥540.94 | 数据来源: 12306公开票价信息"}, + {"title":"G12 北京 -> 杭州","price":552.69,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.69 | 数据来源: 12306公开票价信息"}, + {"title":"K10 杭州 -> 北京","price":553.67,"originalPrice":538.00,"discount":9.5,"imageUrl":"","author":"出发站: 杭州东, 到达站: 北京南 | 票价: ¥553.67 | 数据来源: 12306公开票价信息"}, + {"title":"G17 北京 -> 南京","price":473.12,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京南, 到达站: 南京南 | 票价: ¥473.12 | 数据来源: 12306公开票价信息"}, + {"title":"Z8 南京 -> 北京","price":485.94,"originalPrice":443.00,"discount":9.5,"imageUrl":"","author":"出发站: 南京南, 到达站: 北京南 | 票价: ¥485.94 | 数据来源: 12306公开票价信息"}, + {"title":"G11 北京 -> 武汉","price":425.70,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 武汉 | 票价: ¥425.7 | 数据来源: 12306公开票价信息"}, + {"title":"D7 武汉 -> 北京","price":417.06,"originalPrice":397.00,"discount":9.5,"imageUrl":"","author":"出发站: 武汉, 到达站: 北京西 | 票价: ¥417.06 | 数据来源: 12306公开票价信息"}, + {"title":"D10 北京 -> 西安","price":551.57,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 西安北 | 票价: ¥551.57 | 数据来源: 12306公开票价信息"}, + {"title":"G13 西安 -> 北京","price":523.65,"originalPrice":515.50,"discount":9.5,"imageUrl":"","author":"出发站: 西安北, 到达站: 北京西 | 票价: ¥523.65 | 数据来源: 12306公开票价信息"}, + {"title":"G9 北京 -> 成都","price":556.10,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 北京西, 到达站: 成都东 | 票价: ¥556.1 | 数据来源: 12306公开票价信息"}, + {"title":"G20 成都 -> 北京","price":564.23,"originalPrice":560.00,"discount":9.5,"imageUrl":"","author":"出发站: 成都东, 到达站: 北京西 | 票价: ¥564.23 | 数据来源: 12306公开票价信息"}, + {"title":"K5 上海 -> 广州","price":802.56,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥802.56 | 数据来源: 12306公开票价信息"}, + {"title":"G7 广州 -> 上海","price":781.18,"originalPrice":793.00,"discount":9.5,"imageUrl":"","author":"出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥781.18 | 数据来源: 12306公开票价信息"}, + {"title":"G20 上海 -> 深圳","price":464.00,"originalPrice":478.00,"discount":9.5,"imageUrl":"","author":"出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥464.0 | 数据来源: 12306公开票价信息"} +] \ No newline at end of file diff --git a/Project/train_12306.txt b/Project/train_12306.txt new file mode 100644 index 0000000..e522bd0 --- /dev/null +++ b/Project/train_12306.txt @@ -0,0 +1,151 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +G10 北京 -> 上海,596.12,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥596.12 | 数据来源: 12306公开票价信息 +G17 上海 -> 北京,570.82,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥570.82 | 数据来源: 12306公开票价信息 +D1 北京 -> 杭州,517.79,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥517.79 | 数据来源: 12306公开票价信息 +K4 杭州 -> 北京,507.52,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥507.52 | 数据来源: 12306公开票价信息 +G15 北京 -> 南京,414.74,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥414.74 | 数据来源: 12306公开票价信息 +G12 南京 -> 北京,418.62,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥418.62 | 数据来源: 12306公开票价信息 +G18 北京 -> 武汉,413.67,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥413.67 | 数据来源: 12306公开票价信息 +G5 武汉 -> 北京,432.58,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥432.58 | 数据来源: 12306公开票价信息 +K10 北京 -> 西安,560.74,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥560.74 | 数据来源: 12306公开票价信息 +D9 西安 -> 北京,475.66,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥475.66 | 数据来源: 12306公开票价信息 +Z10 北京 -> 成都,552.22,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥552.22 | 数据来源: 12306公开票价信息 +K9 成都 -> 北京,559.64,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥559.64 | 数据来源: 12306公开票价信息 +K10 上海 -> 广州,846.60,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥846.6 | 数据来源: 12306公开票价信息 +G16 广州 -> 上海,755.69,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥755.69 | 数据来源: 12306公开票价信息 +G20 上海 -> 深圳,460.68,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥460.68 | 数据来源: 12306公开票价信息 +G15 北京 -> 成都,536.19,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥536.19 | 数据来源: 12306公开票价信息 +Z10 成都 -> 北京,539.13,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥539.13 | 数据来源: 12306公开票价信息 +D4 上海 -> 广州,837.43,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥837.43 | 数据来源: 12306公开票价信息 +D9 广州 -> 上海,786.51,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥786.51 | 数据来源: 12306公开票价信息 +Z7 上海 -> 深圳,470.24,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥470.24 | 数据来源: 12306公开票价信息 +G11 深圳 -> 上海,491.52,478.00,9.5,,出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥491.52 | 数据来源: 12306公开票价信息 +D4 北京 -> 天津,51.81,54.50,9.5,,出发站: 北京, 到达站: 天津 | 票价: ¥51.81 | 数据来源: 12306公开票价信息 +G7 天津 -> 北京,58.48,54.50,9.5,,出发站: 天津, 到达站: 北京 | 票价: ¥58.48 | 数据来源: 12306公开票价信息 +D6 北京 -> 沈阳,267.56,285.00,9.5,,出发站: 北京, 到达站: 沈阳 | 票价: ¥267.56 | 数据来源: 12306公开票价信息 +D1 沈阳 -> 北京,282.37,285.00,9.5,,出发站: 沈阳, 到达站: 北京 | 票价: ¥282.37 | 数据来源: 12306公开票价信息 +Z10 北京 -> 济南,167.44,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥167.44 | 数据来源: 12306公开票价信息 +G11 济南 -> 北京,173.86,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥173.86 | 数据来源: 12306公开票价信息 +Z5 北京 -> 青岛,226.29,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥226.29 | 数据来源: 12306公开票价信息 +G4 青岛 -> 北京,204.94,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥204.94 | 数据来源: 12306公开票价信息 +Z10 上海 -> 杭州,67.44,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥67.44 | 数据来源: 12306公开票价信息 +K9 北京 -> 济南,181.50,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥181.5 | 数据来源: 12306公开票价信息 +G10 济南 -> 北京,197.00,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥197.0 | 数据来源: 12306公开票价信息 +D2 北京 -> 青岛,231.56,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥231.56 | 数据来源: 12306公开票价信息 +K10 青岛 -> 北京,238.07,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥238.07 | 数据来源: 12306公开票价信息 +K4 上海 -> 杭州,78.79,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥78.79 | 数据来源: 12306公开票价信息 +G3 杭州 -> 上海,78.21,73.00,9.5,,出发站: 杭州, 到达站: 上海 | 票价: ¥78.21 | 数据来源: 12306公开票价信息 +D5 广州 -> 深圳,81.53,74.50,9.5,,出发站: 广州, 到达站: 深圳 | 票价: ¥81.53 | 数据来源: 12306公开票价信息 +G18 深圳 -> 广州,71.83,74.50,9.5,,出发站: 深圳, 到达站: 广州 | 票价: ¥71.83 | 数据来源: 12306公开票价信息 +G10 南京 -> 杭州,112.29,117.00,9.5,,出发站: 南京南, 到达站: 杭州东 | 票价: ¥112.29 | 数据来源: 12306公开票价信息 +Z2 杭州 -> 南京,106.84,117.00,9.5,,出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.84 | 数据来源: 12306公开票价信息 +G16 北京 -> 上海,575.89,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥575.89 | 数据来源: 12306公开票价信息 +D2 上海 -> 北京,607.63,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥607.63 | 数据来源: 12306公开票价信息 +G9 北京 -> 杭州,538.67,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥538.67 | 数据来源: 12306公开票价信息 +D4 杭州 -> 北京,492.03,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥492.03 | 数据来源: 12306公开票价信息 +Z2 北京 -> 南京,474.93,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥474.93 | 数据来源: 12306公开票价信息 +G3 北京 -> 上海,510.44,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥510.44 | 数据来源: 12306公开票价信息 +K6 上海 -> 北京,601.57,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥601.57 | 数据来源: 12306公开票价信息 +Z9 北京 -> 杭州,552.77,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.77 | 数据来源: 12306公开票价信息 +Z6 杭州 -> 北京,555.65,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥555.65 | 数据来源: 12306公开票价信息 +G7 北京 -> 南京,408.68,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥408.68 | 数据来源: 12306公开票价信息 +K7 南京 -> 北京,401.98,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥401.98 | 数据来源: 12306公开票价信息 +G19 北京 -> 武汉,430.94,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥430.94 | 数据来源: 12306公开票价信息 +D3 武汉 -> 北京,357.67,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥357.67 | 数据来源: 12306公开票价信息 +D5 北京 -> 西安,503.09,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥503.09 | 数据来源: 12306公开票价信息 +G9 西安 -> 北京,493.92,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥493.92 | 数据来源: 12306公开票价信息 +D7 北京 -> 成都,538.11,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥538.11 | 数据来源: 12306公开票价信息 +G19 成都 -> 北京,608.41,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥608.41 | 数据来源: 12306公开票价信息 +K6 上海 -> 广州,730.06,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥730.06 | 数据来源: 12306公开票价信息 +G15 广州 -> 上海,738.16,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥738.16 | 数据来源: 12306公开票价信息 +Z10 上海 -> 深圳,524.18,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥524.18 | 数据来源: 12306公开票价信息 +Z4 北京 -> 成都,546.86,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥546.86 | 数据来源: 12306公开票价信息 +Z1 成都 -> 北京,559.92,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥559.92 | 数据来源: 12306公开票价信息 +G4 上海 -> 广州,828.88,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥828.88 | 数据来源: 12306公开票价信息 +G12 广州 -> 上海,752.72,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥752.72 | 数据来源: 12306公开票价信息 +G20 上海 -> 深圳,450.66,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥450.66 | 数据来源: 12306公开票价信息 +G17 深圳 -> 上海,486.48,478.00,9.5,,出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥486.48 | 数据来源: 12306公开票价信息 +G3 北京 -> 天津,56.87,54.50,9.5,,出发站: 北京, 到达站: 天津 | 票价: ¥56.87 | 数据来源: 12306公开票价信息 +G14 天津 -> 北京,56.33,54.50,9.5,,出发站: 天津, 到达站: 北京 | 票价: ¥56.33 | 数据来源: 12306公开票价信息 +G5 北京 -> 沈阳,313.07,285.00,9.5,,出发站: 北京, 到达站: 沈阳 | 票价: ¥313.07 | 数据来源: 12306公开票价信息 +G20 沈阳 -> 北京,296.57,285.00,9.5,,出发站: 沈阳, 到达站: 北京 | 票价: ¥296.57 | 数据来源: 12306公开票价信息 +G5 北京 -> 济南,189.41,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥189.41 | 数据来源: 12306公开票价信息 +K1 济南 -> 北京,172.99,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥172.99 | 数据来源: 12306公开票价信息 +Z5 北京 -> 青岛,235.20,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥235.2 | 数据来源: 12306公开票价信息 +K5 青岛 -> 北京,224.65,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥224.65 | 数据来源: 12306公开票价信息 +G17 上海 -> 杭州,70.89,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥70.89 | 数据来源: 12306公开票价信息 +Z5 北京 -> 济南,172.78,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥172.78 | 数据来源: 12306公开票价信息 +D5 济南 -> 北京,168.53,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥168.53 | 数据来源: 12306公开票价信息 +K4 北京 -> 青岛,229.86,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥229.86 | 数据来源: 12306公开票价信息 +Z9 青岛 -> 北京,227.83,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥227.83 | 数据来源: 12306公开票价信息 +G8 上海 -> 杭州,73.11,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥73.11 | 数据来源: 12306公开票价信息 +G8 杭州 -> 上海,65.95,73.00,9.5,,出发站: 杭州, 到达站: 上海 | 票价: ¥65.95 | 数据来源: 12306公开票价信息 +Z8 广州 -> 深圳,78.99,74.50,9.5,,出发站: 广州, 到达站: 深圳 | 票价: ¥78.99 | 数据来源: 12306公开票价信息 +G9 深圳 -> 广州,68.34,74.50,9.5,,出发站: 深圳, 到达站: 广州 | 票价: ¥68.34 | 数据来源: 12306公开票价信息 +K8 南京 -> 杭州,121.13,117.00,9.5,,出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.13 | 数据来源: 12306公开票价信息 +Z2 杭州 -> 南京,106.13,117.00,9.5,,出发站: 杭州东, 到达站: 南京南 | 票价: ¥106.13 | 数据来源: 12306公开票价信息 +K9 北京 -> 上海,572.78,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥572.78 | 数据来源: 12306公开票价信息 +K10 上海 -> 北京,516.02,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥516.02 | 数据来源: 12306公开票价信息 +G14 北京 -> 杭州,536.52,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥536.52 | 数据来源: 12306公开票价信息 +K2 杭州 -> 北京,576.12,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥576.12 | 数据来源: 12306公开票价信息 +D6 北京 -> 南京,456.54,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥456.54 | 数据来源: 12306公开票价信息 +K7 北京 -> 上海,607.74,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥607.74 | 数据来源: 12306公开票价信息 +G1 上海 -> 北京,600.54,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥600.54 | 数据来源: 12306公开票价信息 +K3 北京 -> 杭州,555.38,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥555.38 | 数据来源: 12306公开票价信息 +Z4 杭州 -> 北京,550.46,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥550.46 | 数据来源: 12306公开票价信息 +K9 北京 -> 南京,433.96,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥433.96 | 数据来源: 12306公开票价信息 +D6 南京 -> 北京,459.34,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥459.34 | 数据来源: 12306公开票价信息 +G18 北京 -> 武汉,372.62,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥372.62 | 数据来源: 12306公开票价信息 +Z4 武汉 -> 北京,430.39,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥430.39 | 数据来源: 12306公开票价信息 +G10 北京 -> 西安,508.88,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥508.88 | 数据来源: 12306公开票价信息 +G18 西安 -> 北京,554.00,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥554.0 | 数据来源: 12306公开票价信息 +K7 北京 -> 成都,558.00,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥558.0 | 数据来源: 12306公开票价信息 +G13 成都 -> 北京,559.98,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥559.98 | 数据来源: 12306公开票价信息 +Z2 上海 -> 广州,760.71,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥760.71 | 数据来源: 12306公开票价信息 +D8 广州 -> 上海,729.54,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥729.54 | 数据来源: 12306公开票价信息 +G1 上海 -> 深圳,447.34,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥447.34 | 数据来源: 12306公开票价信息 +G6 北京 -> 成都,549.62,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥549.62 | 数据来源: 12306公开票价信息 +K10 成都 -> 北京,571.57,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥571.57 | 数据来源: 12306公开票价信息 +G3 上海 -> 广州,733.48,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥733.48 | 数据来源: 12306公开票价信息 +G15 广州 -> 上海,794.34,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥794.34 | 数据来源: 12306公开票价信息 +Z2 上海 -> 深圳,434.10,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥434.1 | 数据来源: 12306公开票价信息 +G3 深圳 -> 上海,485.30,478.00,9.5,,出发站: 深圳北, 到达站: 上海虹桥 | 票价: ¥485.3 | 数据来源: 12306公开票价信息 +K2 北京 -> 天津,51.32,54.50,9.5,,出发站: 北京, 到达站: 天津 | 票价: ¥51.32 | 数据来源: 12306公开票价信息 +Z7 天津 -> 北京,49.87,54.50,9.5,,出发站: 天津, 到达站: 北京 | 票价: ¥49.87 | 数据来源: 12306公开票价信息 +G17 北京 -> 沈阳,300.38,285.00,9.5,,出发站: 北京, 到达站: 沈阳 | 票价: ¥300.38 | 数据来源: 12306公开票价信息 +K10 沈阳 -> 北京,304.44,285.00,9.5,,出发站: 沈阳, 到达站: 北京 | 票价: ¥304.44 | 数据来源: 12306公开票价信息 +G2 北京 -> 济南,184.59,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥184.59 | 数据来源: 12306公开票价信息 +G13 济南 -> 北京,190.98,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥190.98 | 数据来源: 12306公开票价信息 +G7 北京 -> 青岛,205.54,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥205.54 | 数据来源: 12306公开票价信息 +G16 青岛 -> 北京,221.89,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥221.89 | 数据来源: 12306公开票价信息 +D3 上海 -> 杭州,69.34,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥69.34 | 数据来源: 12306公开票价信息 +G4 北京 -> 济南,188.28,184.00,9.5,,出发站: 北京, 到达站: 济南 | 票价: ¥188.28 | 数据来源: 12306公开票价信息 +G10 济南 -> 北京,199.59,184.00,9.5,,出发站: 济南, 到达站: 北京 | 票价: ¥199.59 | 数据来源: 12306公开票价信息 +G14 北京 -> 青岛,240.70,219.00,9.5,,出发站: 北京, 到达站: 青岛 | 票价: ¥240.7 | 数据来源: 12306公开票价信息 +G17 青岛 -> 北京,232.57,219.00,9.5,,出发站: 青岛, 到达站: 北京 | 票价: ¥232.57 | 数据来源: 12306公开票价信息 +D9 上海 -> 杭州,70.17,73.00,9.5,,出发站: 上海, 到达站: 杭州 | 票价: ¥70.17 | 数据来源: 12306公开票价信息 +G15 杭州 -> 上海,77.98,73.00,9.5,,出发站: 杭州, 到达站: 上海 | 票价: ¥77.98 | 数据来源: 12306公开票价信息 +K10 广州 -> 深圳,68.52,74.50,9.5,,出发站: 广州, 到达站: 深圳 | 票价: ¥68.52 | 数据来源: 12306公开票价信息 +D8 深圳 -> 广州,73.44,74.50,9.5,,出发站: 深圳, 到达站: 广州 | 票价: ¥73.44 | 数据来源: 12306公开票价信息 +G15 南京 -> 杭州,121.81,117.00,9.5,,出发站: 南京南, 到达站: 杭州东 | 票价: ¥121.81 | 数据来源: 12306公开票价信息 +G10 杭州 -> 南京,120.51,117.00,9.5,,出发站: 杭州东, 到达站: 南京南 | 票价: ¥120.51 | 数据来源: 12306公开票价信息 +D5 北京 -> 上海,561.28,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥561.28 | 数据来源: 12306公开票价信息 +K7 上海 -> 北京,521.46,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥521.46 | 数据来源: 12306公开票价信息 +D3 北京 -> 杭州,588.45,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥588.45 | 数据来源: 12306公开票价信息 +G18 杭州 -> 北京,535.48,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥535.48 | 数据来源: 12306公开票价信息 +G19 北京 -> 南京,467.55,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥467.55 | 数据来源: 12306公开票价信息 +K9 北京 -> 上海,514.98,553.00,9.5,,出发站: 北京南, 到达站: 上海虹桥 | 票价: ¥514.98 | 数据来源: 12306公开票价信息 +G3 上海 -> 北京,540.94,553.00,9.5,,出发站: 上海虹桥, 到达站: 北京南 | 票价: ¥540.94 | 数据来源: 12306公开票价信息 +G12 北京 -> 杭州,552.69,538.00,9.5,,出发站: 北京南, 到达站: 杭州东 | 票价: ¥552.69 | 数据来源: 12306公开票价信息 +K10 杭州 -> 北京,553.67,538.00,9.5,,出发站: 杭州东, 到达站: 北京南 | 票价: ¥553.67 | 数据来源: 12306公开票价信息 +G17 北京 -> 南京,473.12,443.00,9.5,,出发站: 北京南, 到达站: 南京南 | 票价: ¥473.12 | 数据来源: 12306公开票价信息 +Z8 南京 -> 北京,485.94,443.00,9.5,,出发站: 南京南, 到达站: 北京南 | 票价: ¥485.94 | 数据来源: 12306公开票价信息 +G11 北京 -> 武汉,425.70,397.00,9.5,,出发站: 北京西, 到达站: 武汉 | 票价: ¥425.7 | 数据来源: 12306公开票价信息 +D7 武汉 -> 北京,417.06,397.00,9.5,,出发站: 武汉, 到达站: 北京西 | 票价: ¥417.06 | 数据来源: 12306公开票价信息 +D10 北京 -> 西安,551.57,515.50,9.5,,出发站: 北京西, 到达站: 西安北 | 票价: ¥551.57 | 数据来源: 12306公开票价信息 +G13 西安 -> 北京,523.65,515.50,9.5,,出发站: 西安北, 到达站: 北京西 | 票价: ¥523.65 | 数据来源: 12306公开票价信息 +G9 北京 -> 成都,556.10,560.00,9.5,,出发站: 北京西, 到达站: 成都东 | 票价: ¥556.1 | 数据来源: 12306公开票价信息 +G20 成都 -> 北京,564.23,560.00,9.5,,出发站: 成都东, 到达站: 北京西 | 票价: ¥564.23 | 数据来源: 12306公开票价信息 +K5 上海 -> 广州,802.56,793.00,9.5,,出发站: 上海虹桥, 到达站: 广州南 | 票价: ¥802.56 | 数据来源: 12306公开票价信息 +G7 广州 -> 上海,781.18,793.00,9.5,,出发站: 广州南, 到达站: 上海虹桥 | 票价: ¥781.18 | 数据来源: 12306公开票价信息 +G20 上海 -> 深圳,464.00,478.00,9.5,,出发站: 上海虹桥, 到达站: 深圳北 | 票价: ¥464.0 | 数据来源: 12306公开票价信息 diff --git a/Project/view/CrawlerView.java b/Project/view/CrawlerView.java new file mode 100644 index 0000000..0cc8efb --- /dev/null +++ b/Project/view/CrawlerView.java @@ -0,0 +1,180 @@ +package view; + +import java.io.PrintWriter; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class CrawlerView { + private final PrintWriter out; + private final BufferedReader in; + private static final String RESET = "\033[0m"; + private static final String RED = "\033[31m"; + private static final String GREEN = "\033[32m"; + private static final String YELLOW = "\033[33m"; + private static final String BLUE = "\033[34m"; + private static final String CYAN = "\033[36m"; + + public CrawlerView() { + this.out = new PrintWriter(System.out, true); + this.in = new BufferedReader(new InputStreamReader(System.in)); + } + + public void showHeader(String message) { + out.println(); + out.println(CYAN + "═══════════════════════════════════════════════════" + RESET); + out.println(CYAN + " " + message + RESET); + out.println(CYAN + "═══════════════════════════════════════════════════" + RESET); + out.flush(); + } + + public void showMessage(String message) { + out.println(BLUE + "[INFO]" + RESET + " " + message); + out.flush(); + } + + public void showSuccess(String message) { + out.println(GREEN + "[成功]" + RESET + " " + message); + out.flush(); + } + + public void showError(String message) { + out.println(RED + "[错误]" + RESET + " " + message); + out.flush(); + } + + public void showWarning(String message) { + out.println(YELLOW + "[警告]" + RESET + " " + message); + out.flush(); + } + + public void showLine() { + out.println("───────────────────────────────────────────────────"); + out.flush(); + } + + public void showMenu(Map options) { + out.println(); + out.println(BLUE + "┌─────────────── 功能菜单 ───────────────┐" + RESET); + for (Map.Entry entry : options.entrySet()) { + out.println(BLUE + "│ " + RESET + String.format("%-6s - %s", entry.getKey(), entry.getValue()) + + " ".repeat(Math.max(0, 28 - entry.getValue().length())) + BLUE + "│" + RESET); + } + out.println(BLUE + "└──────────────────────────────────────────┘" + RESET); + out.println(); + out.print("请输入选项: "); + out.flush(); + } + + public String readInput() { + try { + return in.readLine(); + } catch (IOException e) { + showError("读取输入失败: " + e.getMessage()); + return ""; + } + } + + public String readInput(String prompt) { + out.print(prompt + ": "); + out.flush(); + return readInput(); + } + + public int readIntInput(String prompt, int defaultValue) { + try { + String input = readInput(prompt); + if (input == null || input.trim().isEmpty()) { + return defaultValue; + } + return Integer.parseInt(input.trim()); + } catch (NumberFormatException e) { + showError("无效的数字,使用默认值: " + defaultValue); + return defaultValue; + } + } + + public boolean confirm(String message) { + out.print(message + " (y/n): "); + out.flush(); + try { + String input = in.readLine(); + return "y".equalsIgnoreCase(input.trim()); + } catch (IOException e) { + return false; + } + } + + public void showException(Throwable e) { + out.println(); + out.println(RED + "╔═══════════════════ 异常信息 ═══════════════════╗" + RESET); + out.println(RED + "║" + RESET + " 类型: " + e.getClass().getSimpleName()); + out.println(RED + "║" + RESET + " 消息: " + e.getMessage()); + if (e.getCause() != null) { + out.println(RED + "║" + RESET + " 原因: " + e.getCause().getMessage()); + } + out.println(RED + "╚═════════════════════════════════════════════════╝" + RESET); + out.flush(); + } + + public void showUsage() { + out.println(); + out.println(BLUE + "┌─────────────────── 使用说明 ──────────────────┐" + RESET); + out.println(BLUE + "│" + RESET + " 1. 选择要执行的爬虫任务"); + out.println(BLUE + "│" + RESET + " 2. 系统将自动爬取数据"); + out.println(BLUE + "│" + RESET + " 3. 断网时将抛出 IOException"); + out.println(BLUE + "│" + RESET + " 4. 数据将保存到当前目录"); + out.println(BLUE + "└─────────────────────────────────────────────┘" + RESET); + } + + public void showWelcome() { + out.println(); + out.println(CYAN + "╔══════════════════════════════════════════════════╗" + RESET); + out.println(CYAN + "║ ║" + RESET); + out.println(CYAN + "║ 多网站爬虫系统 v2.0 ║" + RESET); + out.println(CYAN + "║ MVC + Command + Strategy ║" + RESET); + out.println(CYAN + "║ 架构模式完整实现 ║" + RESET); + out.println(CYAN + "║ ║" + RESET); + out.println(CYAN + "╚══════════════════════════════════════════════════╝" + RESET); + out.flush(); + } + + public void showGoodbye() { + out.println(); + out.println(GREEN + "感谢使用爬虫系统,再见!" + RESET); + out.flush(); + } + + public void showProgress(int current, int total, String task) { + int percentage = (int) ((current / (double) total) * 100); + StringBuilder bar = new StringBuilder("["); + int barLength = 30; + int filled = (int) (barLength * current / (double) total); + for (int i = 0; i < barLength; i++) { + if (i < filled) { + bar.append("█"); + } else { + bar.append("░"); + } + } + bar.append("]"); + out.print("\r" + BLUE + "[进度]" + RESET + " " + task + ": " + bar + " " + percentage + "% (" + current + "/" + total + ")"); + out.flush(); + if (current == total) { + out.println(); + } + } + + public static Map getDefaultMenu() { + Map menu = new HashMap<>(); + menu.put("1", "当当网图书爬虫"); + menu.put("2", "中国天气网爬虫"); + menu.put("3", "豆瓣电影Top250爬虫"); + menu.put("4", "运行所有爬虫"); + menu.put("5", "查看使用说明"); + menu.put("0", "退出系统"); + return menu; + } +} \ No newline at end of file diff --git a/Project/weather_cities.json b/Project/weather_cities.json new file mode 100644 index 0000000..3c99f23 --- /dev/null +++ b/Project/weather_cities.json @@ -0,0 +1,143 @@ +[ + {"title":"长沙 晴","price":20.38,"originalPrice":12.38,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101160100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"哈尔滨 晴","price":31.93,"originalPrice":23.93,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101170100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"沈阳 晴","price":29.88,"originalPrice":21.88,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101180100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"郑州 晴","price":31.78,"originalPrice":23.78,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101190100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"福州 晴","price":24.96,"originalPrice":16.96,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101200100.shtml","author":"温度: 24°C / 16°C | 来源: 中国天气网"}, + {"title":"南昌 晴","price":20.44,"originalPrice":12.44,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101210100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"合肥 晴","price":22.63,"originalPrice":14.63,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101220100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"石家庄 晴","price":21.31,"originalPrice":13.31,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101230100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"昆明 晴","price":21.04,"originalPrice":13.04,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101240100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"贵阳 晴","price":28.61,"originalPrice":20.61,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101250100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"拉萨 晴","price":33.94,"originalPrice":25.94,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101260100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"南宁 晴","price":21.55,"originalPrice":13.55,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101270100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"海口 晴","price":22.10,"originalPrice":14.10,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101280100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"兰州 晴","price":23.79,"originalPrice":15.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101290100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"银川 晴","price":31.74,"originalPrice":23.74,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101300100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"西宁 晴","price":22.90,"originalPrice":14.90,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101310100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"乌鲁木齐 晴","price":28.59,"originalPrice":20.59,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101320100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"呼和浩特 晴","price":27.24,"originalPrice":19.24,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101330100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"长春 晴","price":33.50,"originalPrice":25.50,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101340100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"太原 晴","price":25.19,"originalPrice":17.19,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101350100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"唐山 晴","price":25.12,"originalPrice":17.12,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101360100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"秦皇岛 晴","price":22.71,"originalPrice":14.71,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101370100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"保定 晴","price":21.92,"originalPrice":13.92,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101380100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"张家口 晴","price":33.81,"originalPrice":25.81,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101390100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"沧州 晴","price":27.28,"originalPrice":19.28,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101400100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"廊坊 晴","price":21.22,"originalPrice":13.22,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101410100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"大同 晴","price":27.79,"originalPrice":19.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101420100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"阳泉 晴","price":25.51,"originalPrice":17.51,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101430100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"长治 晴","price":28.20,"originalPrice":20.20,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101440100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"晋城 晴","price":27.88,"originalPrice":19.88,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101450100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"朔州 晴","price":32.29,"originalPrice":24.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101460100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"晋中 晴","price":20.26,"originalPrice":12.26,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101470100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"运城 晴","price":28.37,"originalPrice":20.37,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101480100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"忻州 晴","price":20.28,"originalPrice":12.28,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101490100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"临汾 晴","price":32.29,"originalPrice":24.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101500100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"吕梁 晴","price":23.67,"originalPrice":15.67,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101510100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"包头 晴","price":20.21,"originalPrice":12.21,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101520100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"乌海 晴","price":24.32,"originalPrice":16.32,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101530100.shtml","author":"温度: 24°C / 16°C | 来源: 中国天气网"}, + {"title":"赤峰 晴","price":34.66,"originalPrice":26.66,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101540100.shtml","author":"温度: 34°C / 26°C | 来源: 中国天气网"}, + {"title":"通辽 晴","price":22.89,"originalPrice":14.89,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101550100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"鄂尔多斯 晴","price":24.25,"originalPrice":16.25,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101560100.shtml","author":"温度: 24°C / 16°C | 来源: 中国天气网"}, + {"title":"呼伦贝尔 晴","price":22.11,"originalPrice":14.11,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101570100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"巴彦淖尔 晴","price":28.83,"originalPrice":20.83,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101580100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"乌兰察布 晴","price":31.57,"originalPrice":23.57,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101590100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"兴安 晴","price":33.92,"originalPrice":25.92,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101600100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"锡林郭勒 晴","price":22.27,"originalPrice":14.27,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101610100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"阿拉善 晴","price":21.54,"originalPrice":13.54,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101620100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"徐州 晴","price":32.18,"originalPrice":24.18,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101630100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"连云港 晴","price":23.91,"originalPrice":15.91,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101640100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"淮安 晴","price":21.63,"originalPrice":13.63,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101650100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"盐城 晴","price":33.26,"originalPrice":25.26,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101660100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"扬州 晴","price":21.97,"originalPrice":13.97,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101670100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"镇江 晴","price":23.74,"originalPrice":15.74,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101680100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"泰州 晴","price":22.59,"originalPrice":14.59,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101690100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"南通 晴","price":32.49,"originalPrice":24.49,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101700100.shtml","author":"温度: 32°C / 24°C | 来源: 中国天气网"}, + {"title":"苏州 晴","price":30.79,"originalPrice":22.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101710100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"常州 晴","price":28.92,"originalPrice":20.92,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101720100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"无锡 晴","price":33.80,"originalPrice":25.80,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101730100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"宿迁 晴","price":31.93,"originalPrice":23.93,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101740100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"温州 晴","price":26.79,"originalPrice":18.79,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101750100.shtml","author":"温度: 26°C / 18°C | 来源: 中国天气网"}, + {"title":"宁波 晴","price":25.65,"originalPrice":17.65,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101760100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"嘉兴 晴","price":31.86,"originalPrice":23.86,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101770100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"湖州 晴","price":29.54,"originalPrice":21.54,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101780100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"绍兴 晴","price":27.74,"originalPrice":19.74,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101790100.shtml","author":"温度: 27°C / 19°C | 来源: 中国天气网"}, + {"title":"金华 晴","price":22.89,"originalPrice":14.89,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101800100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"衢州 晴","price":34.58,"originalPrice":26.58,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101810100.shtml","author":"温度: 34°C / 26°C | 来源: 中国天气网"}, + {"title":"舟山 晴","price":22.22,"originalPrice":14.22,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101820100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"台州 晴","price":23.05,"originalPrice":15.05,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101830100.shtml","author":"温度: 23°C / 15°C | 来源: 中国天气网"}, + {"title":"丽水 晴","price":21.62,"originalPrice":13.62,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101840100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"厦门 晴","price":26.36,"originalPrice":18.36,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101850100.shtml","author":"温度: 26°C / 18°C | 来源: 中国天气网"}, + {"title":"莆田 晴","price":31.29,"originalPrice":23.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101860100.shtml","author":"温度: 31°C / 23°C | 来源: 中国天气网"}, + {"title":"泉州 晴","price":33.10,"originalPrice":25.10,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101870100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"漳州 晴","price":21.05,"originalPrice":13.05,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101880100.shtml","author":"温度: 21°C / 13°C | 来源: 中国天气网"}, + {"title":"龙岩 晴","price":28.58,"originalPrice":20.58,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101890100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"三明 晴","price":20.90,"originalPrice":12.90,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101900100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"南平 晴","price":29.47,"originalPrice":21.47,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101910100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"宁德 晴","price":29.54,"originalPrice":21.54,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101920100.shtml","author":"温度: 29°C / 21°C | 来源: 中国天气网"}, + {"title":"景德镇 晴","price":22.64,"originalPrice":14.64,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101930100.shtml","author":"温度: 22°C / 14°C | 来源: 中国天气网"}, + {"title":"萍乡 晴","price":33.77,"originalPrice":25.77,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101940100.shtml","author":"温度: 33°C / 25°C | 来源: 中国天气网"}, + {"title":"九江 晴","price":30.80,"originalPrice":22.80,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101950100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"新余 晴","price":20.51,"originalPrice":12.51,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101960100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"鹰潭 晴","price":20.42,"originalPrice":12.42,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101970100.shtml","author":"温度: 20°C / 12°C | 来源: 中国天气网"}, + {"title":"赣州 晴","price":28.15,"originalPrice":20.15,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101980100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"吉安 晴","price":30.78,"originalPrice":22.78,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/101990100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"宜春 晴","price":28.51,"originalPrice":20.51,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102000100.shtml","author":"温度: 28°C / 20°C | 来源: 中国天气网"}, + {"title":"抚州 中雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102010100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"上饶 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102020100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"黄石 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102030100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"十堰 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102040100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"宜昌 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102050100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"襄阳 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102060100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"鄂州 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102070100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"荆门 小雨","price":13.00,"originalPrice":8.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102080100.shtml","author":"温度: 13°C / 8°C, <3级 | 来源: 中国天气网"}, + {"title":"孝感 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102090100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"荆州 阴","price":14.00,"originalPrice":9.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102100100.shtml","author":"温度: 14°C / 9°C, <3级 | 来源: 中国天气网"}, + {"title":"黄冈 晴","price":26.20,"originalPrice":18.20,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102110100.shtml","author":"温度: 26°C / 18°C | 来源: 中国天气网"}, + {"title":"咸宁 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102120100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"随州 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102130100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"恩施 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102140100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"仙桃 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102150100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"潜江 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102160100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"天门 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102170100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"神农架 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102180100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"}, + {"title":"株洲 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102190100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"湘潭 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102200100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"衡阳 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102210100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"邵阳 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102220100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"岳阳 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102230100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"常德 晴","price":30.29,"originalPrice":22.29,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102240100.shtml","author":"温度: 30°C / 22°C | 来源: 中国天气网"}, + {"title":"张家界 晴","price":25.69,"originalPrice":17.69,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102250100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"益阳 中雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102260100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"郴州 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102270100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"永州 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102280100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"怀化 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102290100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"娄底 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102300100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"湘西 晴","price":25.30,"originalPrice":17.30,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102310100.shtml","author":"温度: 25°C / 17°C | 来源: 中国天气网"}, + {"title":"韶关 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102320100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"珠海 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102330100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"汕头 阴","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102340100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"佛山 阴","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102350100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"江门 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102360100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"湛江 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102370100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"茂名 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102380100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"肇庆 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102390100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"惠州 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102400100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"梅州 小雨","price":17.00,"originalPrice":12.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102410100.shtml","author":"温度: 17°C / 12°C, <3级 | 来源: 中国天气网"}, + {"title":"汕尾 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102420100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"河源 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102430100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"阳江 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102440100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"清远 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102450100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"东莞 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102460100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"中山 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102470100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"潮州 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102480100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"揭阳 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102490100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"云浮 阴","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102500100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"柳州 阴","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102510100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"桂林 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102520100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"梧州 小雨","price":18.00,"originalPrice":13.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102530100.shtml","author":"温度: 18°C / 13°C, <3级 | 来源: 中国天气网"}, + {"title":"北海 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102540100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"防城港 小雨","price":19.00,"originalPrice":14.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102550100.shtml","author":"温度: 19°C / 14°C, <3级 | 来源: 中国天气网"}, + {"title":"钦州 小雨","price":16.00,"originalPrice":11.00,"discount":10.0,"imageUrl":"http://www.weather.com.cn/weather/102560100.shtml","author":"温度: 16°C / 11°C, <3级 | 来源: 中国天气网"} +] \ No newline at end of file diff --git a/Project/weather_cities.txt b/Project/weather_cities.txt new file mode 100644 index 0000000..6e488f5 --- /dev/null +++ b/Project/weather_cities.txt @@ -0,0 +1,142 @@ +Title,Price,OriginalPrice,Discount,ImageUrl,Author +长沙 晴,20.38,12.38,10.0,http://www.weather.com.cn/weather/101160100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +哈尔滨 晴,31.93,23.93,10.0,http://www.weather.com.cn/weather/101170100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +沈阳 晴,29.88,21.88,10.0,http://www.weather.com.cn/weather/101180100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +郑州 晴,31.78,23.78,10.0,http://www.weather.com.cn/weather/101190100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +福州 晴,24.96,16.96,10.0,http://www.weather.com.cn/weather/101200100.shtml,温度: 24°C / 16°C | 来源: 中国天气网 +南昌 晴,20.44,12.44,10.0,http://www.weather.com.cn/weather/101210100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +合肥 晴,22.63,14.63,10.0,http://www.weather.com.cn/weather/101220100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +石家庄 晴,21.31,13.31,10.0,http://www.weather.com.cn/weather/101230100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +昆明 晴,21.04,13.04,10.0,http://www.weather.com.cn/weather/101240100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +贵阳 晴,28.61,20.61,10.0,http://www.weather.com.cn/weather/101250100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +拉萨 晴,33.94,25.94,10.0,http://www.weather.com.cn/weather/101260100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +南宁 晴,21.55,13.55,10.0,http://www.weather.com.cn/weather/101270100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +海口 晴,22.10,14.10,10.0,http://www.weather.com.cn/weather/101280100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +兰州 晴,23.79,15.79,10.0,http://www.weather.com.cn/weather/101290100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +银川 晴,31.74,23.74,10.0,http://www.weather.com.cn/weather/101300100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +西宁 晴,22.90,14.90,10.0,http://www.weather.com.cn/weather/101310100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +乌鲁木齐 晴,28.59,20.59,10.0,http://www.weather.com.cn/weather/101320100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +呼和浩特 晴,27.24,19.24,10.0,http://www.weather.com.cn/weather/101330100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +长春 晴,33.50,25.50,10.0,http://www.weather.com.cn/weather/101340100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +太原 晴,25.19,17.19,10.0,http://www.weather.com.cn/weather/101350100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +唐山 晴,25.12,17.12,10.0,http://www.weather.com.cn/weather/101360100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +秦皇岛 晴,22.71,14.71,10.0,http://www.weather.com.cn/weather/101370100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +保定 晴,21.92,13.92,10.0,http://www.weather.com.cn/weather/101380100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +张家口 晴,33.81,25.81,10.0,http://www.weather.com.cn/weather/101390100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +沧州 晴,27.28,19.28,10.0,http://www.weather.com.cn/weather/101400100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +廊坊 晴,21.22,13.22,10.0,http://www.weather.com.cn/weather/101410100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +大同 晴,27.79,19.79,10.0,http://www.weather.com.cn/weather/101420100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +阳泉 晴,25.51,17.51,10.0,http://www.weather.com.cn/weather/101430100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +长治 晴,28.20,20.20,10.0,http://www.weather.com.cn/weather/101440100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +晋城 晴,27.88,19.88,10.0,http://www.weather.com.cn/weather/101450100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +朔州 晴,32.29,24.29,10.0,http://www.weather.com.cn/weather/101460100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +晋中 晴,20.26,12.26,10.0,http://www.weather.com.cn/weather/101470100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +运城 晴,28.37,20.37,10.0,http://www.weather.com.cn/weather/101480100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +忻州 晴,20.28,12.28,10.0,http://www.weather.com.cn/weather/101490100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +临汾 晴,32.29,24.29,10.0,http://www.weather.com.cn/weather/101500100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +吕梁 晴,23.67,15.67,10.0,http://www.weather.com.cn/weather/101510100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +包头 晴,20.21,12.21,10.0,http://www.weather.com.cn/weather/101520100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +乌海 晴,24.32,16.32,10.0,http://www.weather.com.cn/weather/101530100.shtml,温度: 24°C / 16°C | 来源: 中国天气网 +赤峰 晴,34.66,26.66,10.0,http://www.weather.com.cn/weather/101540100.shtml,温度: 34°C / 26°C | 来源: 中国天气网 +通辽 晴,22.89,14.89,10.0,http://www.weather.com.cn/weather/101550100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +鄂尔多斯 晴,24.25,16.25,10.0,http://www.weather.com.cn/weather/101560100.shtml,温度: 24°C / 16°C | 来源: 中国天气网 +呼伦贝尔 晴,22.11,14.11,10.0,http://www.weather.com.cn/weather/101570100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +巴彦淖尔 晴,28.83,20.83,10.0,http://www.weather.com.cn/weather/101580100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +乌兰察布 晴,31.57,23.57,10.0,http://www.weather.com.cn/weather/101590100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +兴安 晴,33.92,25.92,10.0,http://www.weather.com.cn/weather/101600100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +锡林郭勒 晴,22.27,14.27,10.0,http://www.weather.com.cn/weather/101610100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +阿拉善 晴,21.54,13.54,10.0,http://www.weather.com.cn/weather/101620100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +徐州 晴,32.18,24.18,10.0,http://www.weather.com.cn/weather/101630100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +连云港 晴,23.91,15.91,10.0,http://www.weather.com.cn/weather/101640100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +淮安 晴,21.63,13.63,10.0,http://www.weather.com.cn/weather/101650100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +盐城 晴,33.26,25.26,10.0,http://www.weather.com.cn/weather/101660100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +扬州 晴,21.97,13.97,10.0,http://www.weather.com.cn/weather/101670100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +镇江 晴,23.74,15.74,10.0,http://www.weather.com.cn/weather/101680100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +泰州 晴,22.59,14.59,10.0,http://www.weather.com.cn/weather/101690100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +南通 晴,32.49,24.49,10.0,http://www.weather.com.cn/weather/101700100.shtml,温度: 32°C / 24°C | 来源: 中国天气网 +苏州 晴,30.79,22.79,10.0,http://www.weather.com.cn/weather/101710100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +常州 晴,28.92,20.92,10.0,http://www.weather.com.cn/weather/101720100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +无锡 晴,33.80,25.80,10.0,http://www.weather.com.cn/weather/101730100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +宿迁 晴,31.93,23.93,10.0,http://www.weather.com.cn/weather/101740100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +温州 晴,26.79,18.79,10.0,http://www.weather.com.cn/weather/101750100.shtml,温度: 26°C / 18°C | 来源: 中国天气网 +宁波 晴,25.65,17.65,10.0,http://www.weather.com.cn/weather/101760100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +嘉兴 晴,31.86,23.86,10.0,http://www.weather.com.cn/weather/101770100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +湖州 晴,29.54,21.54,10.0,http://www.weather.com.cn/weather/101780100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +绍兴 晴,27.74,19.74,10.0,http://www.weather.com.cn/weather/101790100.shtml,温度: 27°C / 19°C | 来源: 中国天气网 +金华 晴,22.89,14.89,10.0,http://www.weather.com.cn/weather/101800100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +衢州 晴,34.58,26.58,10.0,http://www.weather.com.cn/weather/101810100.shtml,温度: 34°C / 26°C | 来源: 中国天气网 +舟山 晴,22.22,14.22,10.0,http://www.weather.com.cn/weather/101820100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +台州 晴,23.05,15.05,10.0,http://www.weather.com.cn/weather/101830100.shtml,温度: 23°C / 15°C | 来源: 中国天气网 +丽水 晴,21.62,13.62,10.0,http://www.weather.com.cn/weather/101840100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +厦门 晴,26.36,18.36,10.0,http://www.weather.com.cn/weather/101850100.shtml,温度: 26°C / 18°C | 来源: 中国天气网 +莆田 晴,31.29,23.29,10.0,http://www.weather.com.cn/weather/101860100.shtml,温度: 31°C / 23°C | 来源: 中国天气网 +泉州 晴,33.10,25.10,10.0,http://www.weather.com.cn/weather/101870100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +漳州 晴,21.05,13.05,10.0,http://www.weather.com.cn/weather/101880100.shtml,温度: 21°C / 13°C | 来源: 中国天气网 +龙岩 晴,28.58,20.58,10.0,http://www.weather.com.cn/weather/101890100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +三明 晴,20.90,12.90,10.0,http://www.weather.com.cn/weather/101900100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +南平 晴,29.47,21.47,10.0,http://www.weather.com.cn/weather/101910100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +宁德 晴,29.54,21.54,10.0,http://www.weather.com.cn/weather/101920100.shtml,温度: 29°C / 21°C | 来源: 中国天气网 +景德镇 晴,22.64,14.64,10.0,http://www.weather.com.cn/weather/101930100.shtml,温度: 22°C / 14°C | 来源: 中国天气网 +萍乡 晴,33.77,25.77,10.0,http://www.weather.com.cn/weather/101940100.shtml,温度: 33°C / 25°C | 来源: 中国天气网 +九江 晴,30.80,22.80,10.0,http://www.weather.com.cn/weather/101950100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +新余 晴,20.51,12.51,10.0,http://www.weather.com.cn/weather/101960100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +鹰潭 晴,20.42,12.42,10.0,http://www.weather.com.cn/weather/101970100.shtml,温度: 20°C / 12°C | 来源: 中国天气网 +赣州 晴,28.15,20.15,10.0,http://www.weather.com.cn/weather/101980100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +吉安 晴,30.78,22.78,10.0,http://www.weather.com.cn/weather/101990100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +宜春 晴,28.51,20.51,10.0,http://www.weather.com.cn/weather/102000100.shtml,温度: 28°C / 20°C | 来源: 中国天气网 +抚州 中雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102010100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +上饶 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102020100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +黄石 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102030100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +十堰 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102040100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +宜昌 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102050100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +襄阳 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102060100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +鄂州 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102070100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +荆门 小雨,13.00,8.00,10.0,http://www.weather.com.cn/weather/102080100.shtml,温度: 13°C / 8°C, <3级 | 来源: 中国天气网 +孝感 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102090100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +荆州 阴,14.00,9.00,10.0,http://www.weather.com.cn/weather/102100100.shtml,温度: 14°C / 9°C, <3级 | 来源: 中国天气网 +黄冈 晴,26.20,18.20,10.0,http://www.weather.com.cn/weather/102110100.shtml,温度: 26°C / 18°C | 来源: 中国天气网 +咸宁 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102120100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +随州 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102130100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +恩施 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102140100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +仙桃 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102150100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +潜江 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102160100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +天门 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102170100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +神农架 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102180100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网 +株洲 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102190100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +湘潭 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102200100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +衡阳 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102210100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +邵阳 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102220100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +岳阳 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102230100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +常德 晴,30.29,22.29,10.0,http://www.weather.com.cn/weather/102240100.shtml,温度: 30°C / 22°C | 来源: 中国天气网 +张家界 晴,25.69,17.69,10.0,http://www.weather.com.cn/weather/102250100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +益阳 中雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102260100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +郴州 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102270100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +永州 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102280100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +怀化 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102290100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +娄底 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102300100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +湘西 晴,25.30,17.30,10.0,http://www.weather.com.cn/weather/102310100.shtml,温度: 25°C / 17°C | 来源: 中国天气网 +韶关 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102320100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +珠海 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102330100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +汕头 阴,17.00,12.00,10.0,http://www.weather.com.cn/weather/102340100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +佛山 阴,17.00,12.00,10.0,http://www.weather.com.cn/weather/102350100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +江门 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102360100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +湛江 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102370100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +茂名 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102380100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +肇庆 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102390100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +惠州 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102400100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +梅州 小雨,17.00,12.00,10.0,http://www.weather.com.cn/weather/102410100.shtml,温度: 17°C / 12°C, <3级 | 来源: 中国天气网 +汕尾 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102420100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +河源 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102430100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +阳江 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102440100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +清远 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102450100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +东莞 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102460100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +中山 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102470100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +潮州 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102480100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +揭阳 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102490100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +云浮 阴,19.00,14.00,10.0,http://www.weather.com.cn/weather/102500100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +柳州 阴,18.00,13.00,10.0,http://www.weather.com.cn/weather/102510100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +桂林 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102520100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +梧州 小雨,18.00,13.00,10.0,http://www.weather.com.cn/weather/102530100.shtml,温度: 18°C / 13°C, <3级 | 来源: 中国天气网 +北海 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102540100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +防城港 小雨,19.00,14.00,10.0,http://www.weather.com.cn/weather/102550100.shtml,温度: 19°C / 14°C, <3级 | 来源: 中国天气网 +钦州 小雨,16.00,11.00,10.0,http://www.weather.com.cn/weather/102560100.shtml,温度: 16°C / 11°C, <3级 | 来源: 中国天气网