diff --git a/project/.gitignore b/project/.gitignore new file mode 100644 index 0000000..480bdf5 --- /dev/null +++ b/project/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/project/.idea/.gitignore b/project/.idea/.gitignore new file mode 100644 index 0000000..b6b1ecf --- /dev/null +++ b/project/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 已忽略包含查询文件的默认文件夹 +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ diff --git a/project/.idea/encodings.xml b/project/.idea/encodings.xml new file mode 100644 index 0000000..2998ed5 --- /dev/null +++ b/project/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/project/.idea/misc.xml b/project/.idea/misc.xml new file mode 100644 index 0000000..d2b5d0f --- /dev/null +++ b/project/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/project/README.md b/project/README.md new file mode 100644 index 0000000..e1a9229 --- /dev/null +++ b/project/README.md @@ -0,0 +1,87 @@ +# Web Crawler Application + +基于 Java 的多网站爬虫应用,采用 MVC、Command 模式、策略模式和完整的异常体系设计。 + +## 功能特性 + +- 爬取豆瓣电影排行榜 +- 爬取豆瓣读书排行榜 +- 爬取 Books to Scrape 网站 +- 数据保存为 JSON 格式文件 +- 支持交互式和命令行模式 + +## 项目架构 + +### 设计模式 + +1. **MVC 模式** + - Model: `Movie`, `Book`, `ScrapeBook` + - View: `ConsoleView` + - Controller: `CrawlerController` + +2. **策略模式 (Strategy Pattern)** + - `CrawlerStrategy` 接口 + - `DoubanMovieStrategy` - 豆瓣电影策略 + - `DoubanBookStrategy` - 豆瓣读书策略 + - `BooksToScrapeStrategy` - Books to Scrape 策略 + +3. **命令模式 (Command Pattern)** + - `Command` 接口 + - `CrawlCommand` - 单个爬虫命令 + - `CrawlAllCommand` - 组合命令,执行所有爬虫 + +4. **异常体系** + - `CrawlerException` - 基类异常 + - `NetworkException` - 网络异常 + - `ParseException` - 解析异常 + - `FileException` - 文件操作异常 + +## 使用方法 + +### 编译项目 + +```bash +mvn clean package +``` + +### 运行方式 + +#### 1. 交互式模式 + +```bash +java -jar target/web-crawler-1.0-SNAPSHOT.jar -i +``` + +#### 2. 命令行模式 + +爬取所有网站: +```bash +java -jar target/web-crawler-1.0-SNAPSHOT.jar +``` + +爬取指定网站: +```bash +java -jar target/web-crawler-1.0-SNAPSHOT.jar -s douban-movie +java -jar target/web-crawler-1.0-SNAPSHOT.jar -s douban-book +java -jar target/web-crawler-1.0-SNAPSHOT.jar -s books-to-scrape +``` + +查看帮助: +```bash +java -jar target/web-crawler-1.0-SNAPSHOT.jar --help +``` + +## 输出文件 + +爬取的数据将保存到 `data/` 目录下: + +- `douban_movies.json` - 豆瓣电影数据 +- `douban_books.json` - 豆瓣读书数据 +- `books_to_scrape.json` - Books to Scrape 数据 + +## 依赖项 + +- Jsoup - HTML 解析 +- Gson - JSON 处理 +- Picocli - 命令行解析 +- SLF4J - 日志框架 diff --git a/project/build.log b/project/build.log new file mode 100644 index 0000000..2371dba --- /dev/null +++ b/project/build.log @@ -0,0 +1,96 @@ +mvn : WARNING: A restricted method in java.lang.System has been called +所在位置 行:1 字符: 72 ++ ... 嘻哈哈\Git\java爬虫\TestMaven"; mvn clean package -DskipTests 2>&1 | Out-F ... ++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : NotSpecified: (WARNING: A rest...has been called + :String) [], RemoteException + + FullyQualifiedErrorId : NativeCommandError + +WARNING: java.lang.System::load has been called by org.fusesource.jansi.interna +l.JansiLoader in an unnamed module (file:/D:/嘻嘻哈哈/Git/java/apache-maven-3.9.6/l +ib/jansi-2.4.0.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers +in this module +WARNING: Restricted methods will be blocked in a future release unless native a +ccess is enabled + +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called +WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.commo +n.util.concurrent.AbstractFuture$UnsafeAtomicHelper (file:/D:/嘻嘻哈哈/Git/java/apa +che-maven-3.9.6/lib/guava-32.0.1-jre.jar) +WARNING: Please consider reporting this to the maintainers of class com.google. +common.util.concurrent.AbstractFuture$UnsafeAtomicHelper +WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release +[INFO] Scanning for projects... +[INFO] +[INFO] -----------------------< com.example:TestMaven >------------------------ +[INFO] Building TestMaven 1.0-SNAPSHOT +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] --- clean:3.2.0:clean (default-clean) @ TestMaven --- +[INFO] Deleting D:\鍢诲樆鍝堝搱\Git\java鐖櫕\TestMaven\target +[INFO] +[INFO] --- resources:3.3.1:resources (default-resources) @ TestMaven --- +[INFO] Copying 0 resource from src\main\resources to target\classes +[INFO] +[INFO] --- compiler:3.11.0:compile (default-compile) @ TestMaven --- +[INFO] Changes detected - recompiling the module! :source +[INFO] Compiling 41 source files with javac [debug target 8] to target\classes +[INFO] ------------------------------------------------------------- +[WARNING] COMPILATION WARNING : +[INFO] ------------------------------------------------------------- +[WARNING] 鏈笌 -source 8 涓€璧疯缃紩瀵肩被璺緞 + 涓嶈缃紩瀵肩被璺緞鍙兘浼氬鑷寸被鏂囦欢鏃犳硶鍦?JDK 8 涓婅繍琛? 寤鸿浣跨敤 --release 8 鑰屼笉鏄?-source 8 -target 8锛屽洜涓哄畠浼氳嚜鍔ㄨ缃紩瀵肩被璺緞 +[WARNING] 婧愬€?8 宸茶繃鏃讹紝灏嗗湪鏈潵鍙戣鐗堜腑鍒犻櫎 +[WARNING] 鐩爣鍊?8 宸茶繃鏃讹紝灏嗗湪鏈潵鍙戣鐗堜腑鍒犻櫎 +[WARNING] 瑕侀殣钘忔湁鍏冲凡杩囨椂閫夐」鐨勮鍛? 璇蜂娇鐢?-Xlint:-options銆? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[106,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[112,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[118,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[124,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[INFO] 8 warnings +[INFO] ------------------------------------------------------------- +[INFO] ------------------------------------------------------------- +[ERROR] COMPILATION ERROR : +[INFO] ------------------------------------------------------------- +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/main/CrawlerManager.java:[178,20] main.CrawlerManager.MultiStorage涓嶆槸鎶借薄鐨? 骞朵笖鏈鐩杝torage.DataStorage涓殑鎶借薄鏂规硶findBooksBySource(java.lang.String) +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[106,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[112,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[118,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[124,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/storage/SQLiteStorage.java:[12,8] storage.SQLiteStorage涓嶆槸鎶借薄鐨? 骞朵笖鏈鐩杝torage.DataStorage涓殑鎶借薄鏂规硶findBooksBySource(java.lang.String) +[INFO] 6 errors +[INFO] ------------------------------------------------------------- +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 15.493 s +[INFO] Finished at: 2026-05-31T23:13:59+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project TestMaven: Compilation failure: Compilation failure: +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/main/CrawlerManager.java:[178,20] main.CrawlerManager.MultiStorage涓嶆槸鎶借薄鐨? 骞朵笖鏈鐩杝torage.DataStorage涓殑鎶借薄鏂规硶findBooksBySource(java.lang.String) +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[106,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[112,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[118,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[124,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/storage/SQLiteStorage.java:[12,8] storage.SQLiteStorage涓嶆槸鎶借薄鐨? 骞朵笖鏈鐩杝torage.DataStorage涓殑鎶借薄鏂规硶findBooksBySource(java.lang.String) +[ERROR] -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException diff --git a/project/build_log.txt b/project/build_log.txt new file mode 100644 index 0000000..f60effc --- /dev/null +++ b/project/build_log.txt @@ -0,0 +1,92 @@ +mvn : WARNING: A restricted method in java.lang.System has been called +所在位置 行:1 字符: 72 ++ ... JAVA_HOME = "D:\嘻嘻哈哈\Git"; mvn clean package -DskipTests 2>&1 | Out-F ... ++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : NotSpecified: (WARNING: A rest...has been called + :String) [], RemoteException + + FullyQualifiedErrorId : NativeCommandError + +WARNING: java.lang.System::load has been called by org.fusesource.jansi.interna +l.JansiLoader in an unnamed module (file:/D:/嘻嘻哈哈/Git/java/apache-maven-3.9.6/l +ib/jansi-2.4.0.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers +in this module +WARNING: Restricted methods will be blocked in a future release unless native a +ccess is enabled + +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called +WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.commo +n.util.concurrent.AbstractFuture$UnsafeAtomicHelper (file:/D:/嘻嘻哈哈/Git/java/apa +che-maven-3.9.6/lib/guava-32.0.1-jre.jar) +WARNING: Please consider reporting this to the maintainers of class com.google. +common.util.concurrent.AbstractFuture$UnsafeAtomicHelper +WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release +[INFO] Scanning for projects... +[INFO] +[INFO] -----------------------< com.example:TestMaven >------------------------ +[INFO] Building TestMaven 1.0-SNAPSHOT +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] --- clean:3.2.0:clean (default-clean) @ TestMaven --- +[INFO] Deleting D:\鍢诲樆鍝堝搱\Git\java鐖櫕\TestMaven\target +[INFO] +[INFO] --- resources:3.3.1:resources (default-resources) @ TestMaven --- +[INFO] Copying 0 resource from src\main\resources to target\classes +[INFO] +[INFO] --- compiler:3.11.0:compile (default-compile) @ TestMaven --- +[INFO] Changes detected - recompiling the module! :source +[INFO] Compiling 36 source files with javac [debug target 8] to target\classes +[INFO] ------------------------------------------------------------- +[WARNING] COMPILATION WARNING : +[INFO] ------------------------------------------------------------- +[WARNING] 鏈笌 -source 8 涓€璧疯缃紩瀵肩被璺緞 + 涓嶈缃紩瀵肩被璺緞鍙兘浼氬鑷寸被鏂囦欢鏃犳硶鍦?JDK 8 涓婅繍琛? 寤鸿浣跨敤 --release 8 鑰屼笉鏄?-source 8 -target 8锛屽洜涓哄畠浼氳嚜鍔ㄨ缃紩瀵肩被璺緞 +[WARNING] 婧愬€?8 宸茶繃鏃讹紝灏嗗湪鏈潵鍙戣鐗堜腑鍒犻櫎 +[WARNING] 鐩爣鍊?8 宸茶繃鏃讹紝灏嗗湪鏈潵鍙戣鐗堜腑鍒犻櫎 +[WARNING] 瑕侀殣钘忔湁鍏冲凡杩囨椂閫夐」鐨勮鍛? 璇蜂娇鐢?-Xlint:-options銆? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[106,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[112,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[118,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[WARNING] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[124,13] 浠庡彂琛岀増 10 寮€濮嬶紝'var' 鏄彈闄愮被鍨嬪悕绉帮紝涓嶈兘鐢ㄤ簬绫诲瀷澹版槑锛屼篃涓嶈兘鐢ㄤ綔鏁扮粍鐨勫厓绱犵被鍨? +[INFO] 8 warnings +[INFO] ------------------------------------------------------------- +[INFO] ------------------------------------------------------------- +[ERROR] COMPILATION ERROR : +[INFO] ------------------------------------------------------------- +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[106,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[112,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[118,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[124,9] 鎵句笉鍒扮鍙? 绗﹀彿: 绫?var + 浣嶇疆: 绫?cli.CrawlerCLI +[INFO] 4 errors +[INFO] ------------------------------------------------------------- +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 15.527 s +[INFO] Finished at: 2026-05-31T22:16:51+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project TestMaven: Compilation failure: Compilation failure: +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[106,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[112,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[118,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] /D:/鍢诲樆鍝堝搱/Git/java鐖櫕/TestMaven/src/main/java/cli/CrawlerCLI.java:[124,9] 鎵句笉鍒扮鍙? +[ERROR] 绗﹀彿: 绫?var +[ERROR] 浣嶇疆: 绫?cli.CrawlerCLI +[ERROR] -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException diff --git a/project/build_output.txt b/project/build_output.txt new file mode 100644 index 0000000..bbbdc0b Binary files /dev/null and b/project/build_output.txt differ diff --git a/project/crawler.properties b/project/crawler.properties new file mode 100644 index 0000000..00eb9d5 --- /dev/null +++ b/project/crawler.properties @@ -0,0 +1,22 @@ +# 爬虫配置文件 + +# 请求延迟(毫秒)- 避免请求过快被封 +delay.ms=1500 + +# 请求超时时间(毫秒) +timeout.ms=15000 + +# User-Agent +user.agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 + +# 数据库路径 +db.path=crawler.db + +# 输出目录 +output.dir=output + +# 是否启用数据库存储 +enable.database=true + +# 是否启用文件输出 +enable.file=true diff --git a/project/data/books_to_scrape.json b/project/data/books_to_scrape.json new file mode 100644 index 0000000..e56accc --- /dev/null +++ b/project/data/books_to_scrape.json @@ -0,0 +1,162 @@ +[ + { + "title": "A Light in the Attic", + "price": "£51.77", + "rating": "3", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg", + "productUrl": "http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html" + }, + { + "title": "Tipping the Velvet", + "price": "£53.74", + "rating": "1", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/26/0c/260c6ae16bce31c8f8c95daddd9f4a1c.jpg", + "productUrl": "http://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html" + }, + { + "title": "Soumission", + "price": "£50.10", + "rating": "1", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/3e/ef/3eef99c9d9adef34639f510662022830.jpg", + "productUrl": "http://books.toscrape.com/catalogue/soumission_998/index.html" + }, + { + "title": "Sharp Objects", + "price": "£47.82", + "rating": "4", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/32/51/3251cf3a3412f53f339e42cac2134093.jpg", + "productUrl": "http://books.toscrape.com/catalogue/sharp-objects_997/index.html" + }, + { + "title": "Sapiens: A Brief History of Humankind", + "price": "£54.23", + "rating": "5", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/be/a5/bea5697f2534a2f86a3ef27b5a8c12a6.jpg", + "productUrl": "http://books.toscrape.com/catalogue/sapiens-a-brief-history-of-humankind_996/index.html" + }, + { + "title": "The Requiem Red", + "price": "£22.65", + "rating": "1", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/68/33/68339b4c9bc034267e1da611ab3b34f8.jpg", + "productUrl": "http://books.toscrape.com/catalogue/the-requiem-red_995/index.html" + }, + { + "title": "The Dirty Little Secrets of Getting Your Dream Job", + "price": "£33.34", + "rating": "4", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/92/27/92274a95b7c251fea59a2b8a78275ab4.jpg", + "productUrl": "http://books.toscrape.com/catalogue/the-dirty-little-secrets-of-getting-your-dream-job_994/index.html" + }, + { + "title": "The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull", + "price": "£17.93", + "rating": "3", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/3d/54/3d54940e57e662c4dd1f3ff00c78cc64.jpg", + "productUrl": "http://books.toscrape.com/catalogue/the-coming-woman-a-novel-based-on-the-life-of-the-infamous-feminist-victoria-woodhull_993/index.html" + }, + { + "title": "The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics", + "price": "£22.60", + "rating": "4", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/66/88/66883b91f6804b2323c8369331cb7dd1.jpg", + "productUrl": "http://books.toscrape.com/catalogue/the-boys-in-the-boat-nine-americans-and-their-epic-quest-for-gold-at-the-1936-berlin-olympics_992/index.html" + }, + { + "title": "The Black Maria", + "price": "£52.15", + "rating": "1", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/58/46/5846057e28022268153beff6d352b06c.jpg", + "productUrl": "http://books.toscrape.com/catalogue/the-black-maria_991/index.html" + }, + { + "title": "Starving Hearts (Triangular Trade Trilogy, #1)", + "price": "£13.99", + "rating": "2", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/be/f4/bef44da28c98f905a3ebec0b87be8530.jpg", + "productUrl": "http://books.toscrape.com/catalogue/starving-hearts-triangular-trade-trilogy-1_990/index.html" + }, + { + "title": "Shakespeare\u0027s Sonnets", + "price": "£20.66", + "rating": "4", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/10/48/1048f63d3b5061cd2f424d20b3f9b666.jpg", + "productUrl": "http://books.toscrape.com/catalogue/shakespeares-sonnets_989/index.html" + }, + { + "title": "Set Me Free", + "price": "£17.46", + "rating": "5", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/5b/88/5b88c52633f53cacf162c15f4f823153.jpg", + "productUrl": "http://books.toscrape.com/catalogue/set-me-free_988/index.html" + }, + { + "title": "Scott Pilgrim\u0027s Precious Little Life (Scott Pilgrim #1)", + "price": "£52.29", + "rating": "5", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/94/b1/94b1b8b244bce9677c2f29ccc890d4d2.jpg", + "productUrl": "http://books.toscrape.com/catalogue/scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html" + }, + { + "title": "Rip it Up and Start Again", + "price": "£35.02", + "rating": "5", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/81/c4/81c4a973364e17d01f217e1188253d5e.jpg", + "productUrl": "http://books.toscrape.com/catalogue/rip-it-up-and-start-again_986/index.html" + }, + { + "title": "Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991", + "price": "£57.25", + "rating": "3", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/54/60/54607fe8945897cdcced0044103b10b6.jpg", + "productUrl": "http://books.toscrape.com/catalogue/our-band-could-be-your-life-scenes-from-the-american-indie-underground-1981-1991_985/index.html" + }, + { + "title": "Olio", + "price": "£23.88", + "rating": "1", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/55/33/553310a7162dfbc2c6d19a84da0df9e1.jpg", + "productUrl": "http://books.toscrape.com/catalogue/olio_984/index.html" + }, + { + "title": "Mesaerion: The Best Science Fiction Stories 1800-1849", + "price": "£37.59", + "rating": "1", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/09/a3/09a3aef48557576e1a85ba7efea8ecb7.jpg", + "productUrl": "http://books.toscrape.com/catalogue/mesaerion-the-best-science-fiction-stories-1800-1849_983/index.html" + }, + { + "title": "Libertarianism for Beginners", + "price": "£51.33", + "rating": "2", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/0b/bc/0bbcd0a6f4bcd81ccb1049a52736406e.jpg", + "productUrl": "http://books.toscrape.com/catalogue/libertarianism-for-beginners_982/index.html" + }, + { + "title": "It\u0027s Only the Himalayas", + "price": "£45.17", + "rating": "2", + "availability": "In stock", + "imageUrl": "http://books.toscrape.com/media/cache/27/a5/27a53d0bb95bdd88288eaf66c9230d7e.jpg", + "productUrl": "http://books.toscrape.com/catalogue/its-only-the-himalayas_981/index.html" + } +] \ No newline at end of file diff --git a/project/data/douban_books.json b/project/data/douban_books.json new file mode 100644 index 0000000..cc2cf77 --- /dev/null +++ b/project/data/douban_books.json @@ -0,0 +1,82 @@ +[ + { + "title": "安定此心:我当精神科医生的12000天", + "url": "https://book.douban.com/subject/37502923/" + }, + { + "title": "挽救计划", + "url": "https://book.douban.com/subject/38210508/" + }, + { + "title": "咸的玩笑", + "url": "https://book.douban.com/subject/37833272/" + }, + { + "title": "真事隐:康熙废储与正史虚构", + "url": "https://book.douban.com/subject/37920184/" + }, + { + "title": "大厂小民:我在互联网公司的1480天", + "url": "https://book.douban.com/subject/38208793/" + }, + { + "title": "天色已晚", + "url": "https://book.douban.com/subject/37890167/" + }, + { + "title": "她和她的决心", + "url": "https://book.douban.com/subject/38178826/" + }, + { + "title": "凯罗斯", + "url": "https://book.douban.com/subject/37825000/" + }, + { + "title": "幸福蒙太奇", + "url": "https://book.douban.com/subject/37841159/" + }, + { + "title": "螃蟹的邀请", + "url": "https://book.douban.com/subject/37496217/" + }, + { + "title": "抄写员巴托比", + "url": "https://book.douban.com/subject/38392174/" + }, + { + "title": "我收养了一个朋友", + "url": "https://book.douban.com/subject/37938861/" + }, + { + "title": "哈萨比斯:谷歌AI之脑", + "url": "https://book.douban.com/subject/38357884/" + }, + { + "title": "像女孩那样丢球", + "url": "https://book.douban.com/subject/37126780/" + }, + { + "title": "刚刚离开的世界", + "url": "https://book.douban.com/subject/37447242/" + }, + { + "title": "故纸浮生.1-2", + "url": "https://book.douban.com/subject/37648813/" + }, + { + "title": "在世与认知", + "url": "https://book.douban.com/subject/37112076/" + }, + { + "title": "呼啸山庄", + "url": "https://book.douban.com/subject/30471282/" + }, + { + "title": "我们如何理解这个世界:与齐格蒙特·鲍曼对谈", + "url": "https://book.douban.com/subject/37930972/" + }, + { + "title": "刮风下雨", + "url": "https://book.douban.com/subject/38240709/" + } +] \ No newline at end of file diff --git a/project/data/douban_movies.json b/project/data/douban_movies.json new file mode 100644 index 0000000..c65c411 --- /dev/null +++ b/project/data/douban_movies.json @@ -0,0 +1,62 @@ +[ + { + "title": "爱情抓马", + "rating": "6.9", + "ratingCount": "(34363人评价)", + "url": "https://movie.douban.com/subject/36995126/" + }, + { + "title": "世界的主人", + "rating": "9.1", + "ratingCount": "(116736人评价)", + "url": "https://movie.douban.com/subject/37116612/" + }, + { + "title": "木乃伊", + "rating": "6.2", + "ratingCount": "(13705人评价)", + "url": "https://movie.douban.com/subject/36929221/" + }, + { + "title": "蜂蜜的针", + "rating": "6.7", + "ratingCount": "(48214人评价)", + "url": "https://movie.douban.com/subject/26022233/" + }, + { + "title": "杀的就是你", + "rating": "6.9", + "ratingCount": "(21794人评价)", + "url": "https://movie.douban.com/subject/36926954/" + }, + { + "title": "惩罚者:最后一击", + "rating": "6.8", + "ratingCount": "(5478人评价)", + "url": "https://movie.douban.com/subject/37259325/" + }, + { + "title": "蒙特利尔,我的美人", + "rating": "7.6", + "ratingCount": "(14162人评价)", + "url": "https://movie.douban.com/subject/37019075/" + }, + { + "title": "与王生活的男人", + "rating": "7.4", + "ratingCount": "(10007人评价)", + "url": "https://movie.douban.com/subject/36978169/" + }, + { + "title": "挽救计划", + "rating": "8.6", + "ratingCount": "(463129人评价)", + "url": "https://movie.douban.com/subject/35010610/" + }, + { + "title": "长夜将尽", + "rating": "6.5", + "ratingCount": "(10878人评价)", + "url": "https://movie.douban.com/subject/35590993/" + } +] \ No newline at end of file diff --git a/project/douban_top250.txt b/project/douban_top250.txt new file mode 100644 index 0000000..bf642c7 --- /dev/null +++ b/project/douban_top250.txt @@ -0,0 +1,250 @@ +排名:1 电影:肖申克的救赎 评分:9.7 +排名:2 电影:霸王别姬 评分:9.6 +排名:3 电影:泰坦尼克号 评分:9.5 +排名:4 电影:阿甘正传 评分:9.5 +排名:5 电影:千与千寻 评分:9.4 +排名:6 电影:美丽人生 评分:9.5 +排名:7 电影:星际穿越 评分:9.4 +排名:8 电影:这个杀手不太冷 评分:9.4 +排名:9 电影:盗梦空间 评分:9.4 +排名:10 电影:楚门的世界 评分:9.4 +排名:11 电影:辛德勒的名单 评分:9.5 +排名:12 电影:忠犬八公的故事 评分:9.4 +排名:13 电影:海上钢琴师 评分:9.3 +排名:14 电影:疯狂动物城 评分:9.3 +排名:15 电影:三傻大闹宝莱坞 评分:9.2 +排名:16 电影:机器人总动员 评分:9.3 +排名:17 电影:放牛班的春天 评分:9.3 +排名:18 电影:无间道 评分:9.3 +排名:19 电影:控方证人 评分:9.6 +排名:20 电影:寻梦环游记 评分:9.1 +排名:21 电影:大话西游之大圣娶亲 评分:9.2 +排名:22 电影:熔炉 评分:9.3 +排名:23 电影:触不可及 评分:9.3 +排名:24 电影:教父 评分:9.3 +排名:25 电影:末代皇帝 评分:9.3 +排名:26 电影:哈利·波特与魔法石 评分:9.2 +排名:27 电影:当幸福来敲门 评分:9.1 +排名:28 电影:龙猫 评分:9.2 +排名:29 电影:活着 评分:9.3 +排名:30 电影:怦然心动 评分:9.1 +排名:31 电影:蝙蝠侠:黑暗骑士 评分:9.2 +排名:32 电影:指环王3:王者无敌 评分:9.3 +排名:33 电影:我不是药神 评分:9.0 +排名:34 电影:乱世佳人 评分:9.3 +排名:35 电影:飞屋环游记 评分:9.1 +排名:36 电影:让子弹飞 评分:9.0 +排名:37 电影:哈尔的移动城堡 评分:9.1 +排名:38 电影:十二怒汉 评分:9.4 +排名:39 电影:海蒂和爷爷 评分:9.3 +排名:40 电影:素媛 评分:9.3 +排名:41 电影:猫鼠游戏 评分:9.1 +排名:42 电影:天空之城 评分:9.2 +排名:43 电影:鬼子来了 评分:9.3 +排名:44 电影:摔跤吧!爸爸 评分:9.0 +排名:45 电影:少年派的奇幻漂流 评分:9.1 +排名:46 电影:钢琴家 评分:9.3 +排名:47 电影:指环王2:双塔奇兵 评分:9.2 +排名:48 电影:死亡诗社 评分:9.2 +排名:49 电影:大话西游之月光宝盒 评分:9.0 +排名:50 电影:绿皮书 评分:8.9 +排名:51 电影:何以为家 评分:9.1 +排名:52 电影:闻香识女人 评分:9.1 +排名:53 电影:大闹天宫 评分:9.4 +排名:54 电影:黑客帝国 评分:9.1 +排名:55 电影:指环王1:护戒使者 评分:9.1 +排名:56 电影:罗马假日 评分:9.1 +排名:57 电影:教父2 评分:9.3 +排名:58 电影:狮子王 评分:9.1 +排名:59 电影:天堂电影院 评分:9.2 +排名:60 电影:饮食男女 评分:9.2 +排名:61 电影:辩护人 评分:9.2 +排名:62 电影:本杰明·巴顿奇事 评分:9.0 +排名:63 电影:搏击俱乐部 评分:9.0 +排名:64 电影:美丽心灵 评分:9.1 +排名:65 电影:穿条纹睡衣的男孩 评分:9.2 +排名:66 电影:哈利·波特与死亡圣器(下) 评分:9.0 +排名:67 电影:情书 评分:8.9 +排名:68 电影:两杆大烟枪 评分:9.1 +排名:69 电影:窃听风暴 评分:9.2 +排名:70 电影:音乐之声 评分:9.1 +排名:71 电影:功夫 评分:8.9 +排名:72 电影:哈利·波特与阿兹卡班的囚徒 评分:9.0 +排名:73 电影:阿凡达 评分:8.8 +排名:74 电影:西西里的美丽传说 评分:8.9 +排名:75 电影:看不见的客人 评分:8.8 +排名:76 电影:拯救大兵瑞恩 评分:9.1 +排名:77 电影:沉默的羔羊 评分:8.9 +排名:78 电影:小鞋子 评分:9.2 +排名:79 电影:布达佩斯大饭店 评分:8.9 +排名:80 电影:蝴蝶效应 评分:8.9 +排名:81 电影:飞越疯人院 评分:9.1 +排名:82 电影:还有明天 评分:9.3 +排名:83 电影:禁闭岛 评分:8.9 +排名:84 电影:心灵捕手 评分:9.0 +排名:85 电影:致命魔术 评分:8.9 +排名:86 电影:低俗小说 评分:8.9 +排名:87 电影:哈利·波特与密室 评分:8.9 +排名:88 电影:超脱 评分:9.0 +排名:89 电影:一一 评分:9.1 +排名:90 电影:喜剧之王 评分:8.8 +排名:91 电影:杀人回忆 评分:8.9 +排名:92 电影:致命ID 评分:8.9 +排名:93 电影:摩登时代 评分:9.3 +排名:94 电影:春光乍泄 评分:9.0 +排名:95 电影:加勒比海盗 评分:8.8 +排名:96 电影:海豚湾 评分:9.3 +排名:97 电影:美国往事 评分:9.1 +排名:98 电影:红辣椒 评分:9.0 +排名:99 电影:七宗罪 评分:8.8 +排名:100 电影:唐伯虎点秋香 评分:8.8 +排名:101 电影:狩猎 评分:9.1 +排名:102 电影:幽灵公主 评分:8.9 +排名:103 电影:甜蜜蜜 评分:8.9 +排名:104 电影:寄生虫 评分:8.8 +排名:105 电影:天书奇谭 评分:9.2 +排名:106 电影:蝙蝠侠:黑暗骑士崛起 评分:8.9 +排名:107 电影:超能陆战队 评分:8.8 +排名:108 电影:7号房的礼物 评分:8.9 +排名:109 电影:茶馆 评分:9.5 +排名:110 电影:第六感 评分:8.9 +排名:111 电影:爱在黎明破晓前 评分:8.8 +排名:112 电影:爱在日落黄昏时 评分:8.9 +排名:113 电影:被嫌弃的松子的一生 评分:8.8 +排名:114 电影:头脑特工队 评分:8.8 +排名:115 电影:哈利·波特与火焰杯 评分:8.8 +排名:116 电影:未麻的部屋 评分:9.1 +排名:117 电影:重庆森林 评分:8.8 +排名:118 电影:借东西的小人阿莉埃蒂 评分:8.9 +排名:119 电影:菊次郎的夏天 评分:8.9 +排名:120 电影:入殓师 评分:8.9 +排名:121 电影:断背山 评分:8.8 +排名:122 电影:剪刀手爱德华 评分:8.7 +排名:123 电影:勇敢的心 评分:8.9 +排名:124 电影:时空恋旅人 评分:8.8 +排名:125 电影:驯龙高手 评分:8.8 +排名:126 电影:消失的爱人 评分:8.7 +排名:127 电影:无人知晓 评分:9.1 +排名:128 电影:傲慢与偏见 评分:8.7 +排名:129 电影:倩女幽魂 评分:8.8 +排名:130 电影:新世界 评分:8.9 +排名:131 电影:花样年华 评分:8.8 +排名:132 电影:玩具总动员3 评分:8.9 +排名:133 电影:一个叫欧维的男人决定去死 评分:8.9 +排名:134 电影:色,戒 评分:8.7 +排名:135 电影:完美的世界 评分:9.1 +排名:136 电影:阳光灿烂的日子 评分:8.8 +排名:137 电影:怪兽电力公司 评分:8.8 +排名:138 电影:教父3 评分:9.0 +排名:139 电影:小森林 夏秋篇 评分:9.0 +排名:140 电影:天使爱美丽 评分:8.7 +排名:141 电影:侧耳倾听 评分:8.9 +排名:142 电影:哪吒闹海 评分:9.2 +排名:143 电影:九品芝麻官 评分:8.8 +排名:144 电影:被解救的姜戈 评分:8.8 +排名:145 电影:请以你的名字呼唤我 评分:8.8 +排名:146 电影:幸福终点站 评分:8.8 +排名:147 电影:釜山行 评分:8.6 +排名:148 电影:神偷奶爸 评分:8.7 +排名:149 电影:小森林 冬春篇 评分:9.0 +排名:150 电影:喜宴 评分:9.0 +排名:151 电影:萤火之森 评分:8.8 +排名:152 电影:告白 评分:8.8 +排名:153 电影:玛丽和麦克斯 评分:9.0 +排名:154 电影:七武士 评分:9.3 +排名:155 电影:头号玩家 评分:8.6 +排名:156 电影:模仿游戏 评分:8.8 +排名:157 电影:惊魂记 评分:9.0 +排名:158 电影:大鱼 评分:8.8 +排名:159 电影:机器人之梦 评分:9.1 +排名:160 电影:心灵奇旅 评分:8.7 +排名:161 电影:背靠背,脸对脸 评分:9.5 +排名:162 电影:射雕英雄传之东成西就 评分:8.7 +排名:163 电影:血战钢锯岭 评分:8.7 +排名:164 电影:你的名字。 评分:8.5 +排名:165 电影:我是山姆 评分:9.0 +排名:166 电影:阳光姐妹淘 评分:8.8 +排名:167 电影:恐怖直播 评分:8.7 +排名:168 电影:黑客帝国3:矩阵革命 评分:8.8 +排名:169 电影:末路狂花 评分:9.0 +排名:170 电影:高山下的花环 评分:9.5 +排名:171 电影:小丑 评分:8.7 +排名:172 电影:谍影重重3 评分:8.9 +排名:173 电影:三块广告牌 评分:8.7 +排名:174 电影:电锯惊魂 评分:8.7 +排名:175 电影:无间道2 评分:8.8 +排名:176 电影:达拉斯买家俱乐部 评分:8.8 +排名:177 电影:疯狂原始人 评分:8.7 +排名:178 电影:绿里奇迹 评分:8.9 +排名:179 电影:爱在午夜降临前 评分:8.9 +排名:180 电影:疯狂的石头 评分:8.6 +排名:181 电影:雨中曲 评分:9.1 +排名:182 电影:2001太空漫游 评分:8.9 +排名:183 电影:海街日记 评分:8.8 +排名:184 电影:风之谷 评分:8.9 +排名:185 电影:上帝之城 评分:9.0 +排名:186 电影:心迷宫 评分:8.7 +排名:187 电影:英雄本色 评分:8.6 +排名:188 电影:记忆碎片 评分:8.7 +排名:189 电影:纵横四海 评分:8.8 +排名:190 电影:无敌破坏王 评分:8.7 +排名:191 电影:卢旺达饭店 评分:8.9 +排名:192 电影:牯岭街少年杀人事件 评分:8.9 +排名:193 电影:恐怖游轮 评分:8.5 +排名:194 电影:东京教父 评分:9.0 +排名:195 电影:小偷家族 评分:8.7 +排名:196 电影:魔女宅急便 评分:8.7 +排名:197 电影:冰川时代 评分:8.7 +排名:198 电影:芙蓉镇 评分:9.3 +排名:199 电影:忠犬八公物语 评分:9.2 +排名:200 电影:岁月神偷 评分:8.7 +排名:201 电影:遗愿清单 评分:8.7 +排名:202 电影:荒蛮故事 评分:8.7 +排名:203 电影:大佛普拉斯 评分:8.7 +排名:204 电影:源代码 评分:8.6 +排名:205 电影:花束般的恋爱 评分:8.6 +排名:206 电影:白日梦想家 评分:8.6 +排名:207 电影:爱乐之城 评分:8.4 +排名:208 电影:疯狂的麦克斯4:狂暴之路 评分:8.7 +排名:209 电影:可可西里 评分:8.9 +排名:210 电影:你看起来好像很好吃 评分:8.9 +排名:211 电影:贫民窟的百万富翁 评分:8.6 +排名:212 电影:波西米亚狂想曲 评分:8.6 +排名:213 电影:城市之光 评分:9.3 +排名:214 电影:爆裂鼓手 评分:8.6 +排名:215 电影:青蛇 评分:8.6 +排名:216 电影:哈利·波特与死亡圣器(上) 评分:8.6 +排名:217 电影:无耻混蛋 评分:8.7 +排名:218 电影:东邪西毒 评分:8.6 +排名:219 电影:终结者2:审判日 评分:8.8 +排名:220 电影:大红灯笼高高挂 评分:8.8 +排名:221 电影:黑天鹅 评分:8.6 +排名:222 电影:新龙门客栈 评分:8.7 +排名:223 电影:初恋这件小事 评分:8.5 +排名:224 电影:千钧一发 评分:8.8 +排名:225 电影:人工智能 评分:8.7 +排名:226 电影:崖上的波妞 评分:8.6 +排名:227 电影:雨人 评分:8.7 +排名:228 电影:虎口脱险 评分:8.9 +排名:229 电影:哈利·波特与凤凰社 评分:8.6 +排名:230 电影:彗星来的那一夜 评分:8.6 +排名:231 电影:罗生门 评分:8.8 +排名:232 电影:海边的曼彻斯特 评分:8.6 +排名:233 电影:恋恋笔记本 评分:8.5 +排名:234 电影:火星救援 评分:8.5 +排名:235 电影:真爱至上 评分:8.5 +排名:236 电影:黑客帝国2:重装上阵 评分:8.7 +排名:237 电影:冰雪奇缘 评分:8.5 +排名:238 电影:步履不停 评分:8.8 +排名:239 电影:奇迹男孩 评分:8.6 +排名:240 电影:千年女优 评分:8.8 +排名:241 电影:谍影重重2 评分:8.7 +排名:242 电影:战争之王 评分:8.7 +排名:243 电影:蜘蛛侠:平行宇宙 评分:8.6 +排名:244 电影:攻壳机动队 评分:9.0 +排名:245 电影:血钻 评分:8.7 +排名:246 电影:小姐 评分:8.5 +排名:247 电影:隐藏人物 评分:8.9 +排名:248 电影:血观音 评分:8.6 +排名:249 电影:魂断蓝桥 评分:8.8 +排名:250 电影:房间 评分:8.7 diff --git a/project/output/BooksToScrape_20260531_233112.json b/project/output/BooksToScrape_20260531_233112.json new file mode 100644 index 0000000..02e7729 --- /dev/null +++ b/project/output/BooksToScrape_20260531_233112.json @@ -0,0 +1,9002 @@ +[ + { + "source": "BooksToScrape", + "rank": 1, + "title": "A Light in the Attic", + "price": 51.77, + "rating": 3.0, + "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Tipping the Velvet", + "price": 53.74, + "rating": 1.0, + "url": "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/26/0c/260c6ae16bce31c8f8c95daddd9f4a1c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Soumission", + "price": 50.1, + "rating": 1.0, + "url": "https://books.toscrape.com/catalogue/soumission_998/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3e/ef/3eef99c9d9adef34639f510662022830.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Sharp Objects", + "price": 47.82, + "rating": 4.0, + "url": "https://books.toscrape.com/catalogue/sharp-objects_997/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/32/51/3251cf3a3412f53f339e42cac2134093.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Sapiens: A Brief History of Humankind", + "price": 54.23, + "rating": 5.0, + "url": "https://books.toscrape.com/catalogue/sapiens-a-brief-history-of-humankind_996/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/be/a5/bea5697f2534a2f86a3ef27b5a8c12a6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Requiem Red", + "price": 22.65, + "rating": 1.0, + "url": "https://books.toscrape.com/catalogue/the-requiem-red_995/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/68/33/68339b4c9bc034267e1da611ab3b34f8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Dirty Little Secrets of Getting Your Dream Job", + "price": 33.34, + "rating": 4.0, + "url": "https://books.toscrape.com/catalogue/the-dirty-little-secrets-of-getting-your-dream-job_994/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/92/27/92274a95b7c251fea59a2b8a78275ab4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull", + "price": 17.93, + "rating": 3.0, + "url": "https://books.toscrape.com/catalogue/the-coming-woman-a-novel-based-on-the-life-of-the-infamous-feminist-victoria-woodhull_993/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3d/54/3d54940e57e662c4dd1f3ff00c78cc64.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics", + "price": 22.6, + "rating": 4.0, + "url": "https://books.toscrape.com/catalogue/the-boys-in-the-boat-nine-americans-and-their-epic-quest-for-gold-at-the-1936-berlin-olympics_992/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/66/88/66883b91f6804b2323c8369331cb7dd1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Black Maria", + "price": 52.15, + "rating": 1.0, + "url": "https://books.toscrape.com/catalogue/the-black-maria_991/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/58/46/5846057e28022268153beff6d352b06c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Starving Hearts (Triangular Trade Trilogy, #1)", + "price": 13.99, + "rating": 2.0, + "url": "https://books.toscrape.com/catalogue/starving-hearts-triangular-trade-trilogy-1_990/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/be/f4/bef44da28c98f905a3ebec0b87be8530.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Shakespeare\u0027s Sonnets", + "price": 20.66, + "rating": 4.0, + "url": "https://books.toscrape.com/catalogue/shakespeares-sonnets_989/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/10/48/1048f63d3b5061cd2f424d20b3f9b666.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Set Me Free", + "price": 17.46, + "rating": 5.0, + "url": "https://books.toscrape.com/catalogue/set-me-free_988/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5b/88/5b88c52633f53cacf162c15f4f823153.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Scott Pilgrim\u0027s Precious Little Life (Scott Pilgrim #1)", + "price": 52.29, + "rating": 5.0, + "url": "https://books.toscrape.com/catalogue/scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/94/b1/94b1b8b244bce9677c2f29ccc890d4d2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Rip it Up and Start Again", + "price": 35.02, + "rating": 5.0, + "url": "https://books.toscrape.com/catalogue/rip-it-up-and-start-again_986/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/81/c4/81c4a973364e17d01f217e1188253d5e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991", + "price": 57.25, + "rating": 3.0, + "url": "https://books.toscrape.com/catalogue/our-band-could-be-your-life-scenes-from-the-american-indie-underground-1981-1991_985/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/54/60/54607fe8945897cdcced0044103b10b6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Olio", + "price": 23.88, + "rating": 1.0, + "url": "https://books.toscrape.com/catalogue/olio_984/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/55/33/553310a7162dfbc2c6d19a84da0df9e1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Mesaerion: The Best Science Fiction Stories 1800-1849", + "price": 37.59, + "rating": 1.0, + "url": "https://books.toscrape.com/catalogue/mesaerion-the-best-science-fiction-stories-1800-1849_983/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/09/a3/09a3aef48557576e1a85ba7efea8ecb7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Libertarianism for Beginners", + "price": 51.33, + "rating": 2.0, + "url": "https://books.toscrape.com/catalogue/libertarianism-for-beginners_982/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/bc/0bbcd0a6f4bcd81ccb1049a52736406e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "It\u0027s Only the Himalayas", + "price": 45.17, + "rating": 2.0, + "url": "https://books.toscrape.com/catalogue/its-only-the-himalayas_981/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/27/a5/27a53d0bb95bdd88288eaf66c9230d7e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "In Her Wake", + "price": 12.84, + "rating": 1.0, + "url": "https://books.toscrape.com/in-her-wake_980/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5d/72/5d72709c6a7a9584a4d1cf07648bfce1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "How Music Works", + "price": 37.32, + "rating": 2.0, + "url": "https://books.toscrape.com/how-music-works_979/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5c/c8/5cc8e107246cb478960d4f0aba1e1c8e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Foolproof Preserving: A Guide to Small Batch Jams, Jellies, Pickles, Condiments, and More: A Foolproof Guide to Making Small Batch Jams, Jellies, Pickles, Condiments, and More", + "price": 30.52, + "rating": 3.0, + "url": "https://books.toscrape.com/foolproof-preserving-a-guide-to-small-batch-jams-jellies-pickles-condiments-and-more-a-foolproof-guide-to-making-small-batch-jams-jellies-pickles-condiments-and-more_978/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9f/59/9f59f01fa916a7bb8f0b28a4012179a4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Chase Me (Paris Nights #2)", + "price": 25.27, + "rating": 5.0, + "url": "https://books.toscrape.com/chase-me-paris-nights-2_977/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9c/2e/9c2e0eb8866b8e3f3b768994fd3d1c1a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Black Dust", + "price": 34.53, + "rating": 5.0, + "url": "https://books.toscrape.com/black-dust_976/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/44/cc/44ccc99c8f82c33d4f9d2afa4ef25787.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Birdsong: A Story in Pictures", + "price": 54.64, + "rating": 3.0, + "url": "https://books.toscrape.com/birdsong-a-story-in-pictures_975/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/af/6e/af6e796160fe63e0cf19d44395c7ddf2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "America\u0027s Cradle of Quarterbacks: Western Pennsylvania\u0027s Football Factory from Johnny Unitas to Joe Montana", + "price": 22.5, + "rating": 3.0, + "url": "https://books.toscrape.com/americas-cradle-of-quarterbacks-western-pennsylvanias-football-factory-from-johnny-unitas-to-joe-montana_974/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ef/0b/ef0bed08de4e083dba5e20fdb98d9c36.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Aladdin and His Wonderful Lamp", + "price": 53.13, + "rating": 3.0, + "url": "https://books.toscrape.com/aladdin-and-his-wonderful-lamp_973/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d6/da/d6da0371958068bbaf39ea9c174275cd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Worlds Elsewhere: Journeys Around Shakespeare’s Globe", + "price": 40.3, + "rating": 5.0, + "url": "https://books.toscrape.com/worlds-elsewhere-journeys-around-shakespeares-globe_972/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2e/98/2e98c332bf8563b584784971541c4445.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Wall and Piece", + "price": 44.18, + "rating": 4.0, + "url": "https://books.toscrape.com/wall-and-piece_971/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a5/41/a5416b9646aaa7287baa287ec2590270.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Four Agreements: A Practical Guide to Personal Freedom", + "price": 17.66, + "rating": 5.0, + "url": "https://books.toscrape.com/the-four-agreements-a-practical-guide-to-personal-freedom_970/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0f/7e/0f7ee69495c0df1d35723f012624a9f8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Five Love Languages: How to Express Heartfelt Commitment to Your Mate", + "price": 31.05, + "rating": 3.0, + "url": "https://books.toscrape.com/the-five-love-languages-how-to-express-heartfelt-commitment-to-your-mate_969/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/38/c5/38c56fba316c07305643a8065269594e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Elephant Tree", + "price": 23.82, + "rating": 5.0, + "url": "https://books.toscrape.com/the-elephant-tree_968/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5d/7e/5d7ecde8e81513eba8a64c9fe000744b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Bear and the Piano", + "price": 36.89, + "rating": 1.0, + "url": "https://books.toscrape.com/the-bear-and-the-piano_967/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cf/bb/cfbb5e62715c6d888fd07794c9bab5d6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Sophie\u0027s World", + "price": 15.94, + "rating": 5.0, + "url": "https://books.toscrape.com/sophies-world_966/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/65/71/6571919836ec51ed54f0050c31d8a0cd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Penny Maybe", + "price": 33.29, + "rating": 3.0, + "url": "https://books.toscrape.com/penny-maybe_965/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/12/53/1253c21c5ef3c6d075c5fa3f5fecee6a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Maude (1883-1993):She Grew Up with the country", + "price": 18.02, + "rating": 2.0, + "url": "https://books.toscrape.com/maude-1883-1993she-grew-up-with-the-country_964/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f5/88/f5889d038f5d8e949b494d147c2dcf54.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "In a Dark, Dark Wood", + "price": 19.63, + "rating": 1.0, + "url": "https://books.toscrape.com/in-a-dark-dark-wood_963/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/23/85/238570a1c284e730dbc737a7e631ae2b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Behind Closed Doors", + "price": 52.22, + "rating": 4.0, + "url": "https://books.toscrape.com/behind-closed-doors_962/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e1/5c/e15c289ba58cea38519e1281e859f0c1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "You can\u0027t bury them all: Poems", + "price": 33.63, + "rating": 2.0, + "url": "https://books.toscrape.com/you-cant-bury-them-all-poems_961/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e9/20/e9203b733126c4a0832a1c7885dc27cf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Slow States of Collapse: Poems", + "price": 57.31, + "rating": 3.0, + "url": "https://books.toscrape.com/slow-states-of-collapse-poems_960/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/72/41/72417db983862010ef0c1a25de98c7d7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Reasons to Stay Alive", + "price": 26.41, + "rating": 2.0, + "url": "https://books.toscrape.com/reasons-to-stay-alive_959/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cb/bd/cbbdb0222ee8a0f6ab61657412a15794.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Private Paris (Private #10)", + "price": 47.61, + "rating": 5.0, + "url": "https://books.toscrape.com/private-paris-private-10_958/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9d/05/9d0533bae1578846d728a82913b95c26.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "#HigherSelfie: Wake Up Your Life. Free Your Soul. Find Your Tribe.", + "price": 23.11, + "rating": 5.0, + "url": "https://books.toscrape.com/higherselfie-wake-up-your-life-free-your-soul-find-your-tribe_957/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9c/46/9c463c7631c82401160fd3b554b8f0e1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Without Borders (Wanderlove #1)", + "price": 45.07, + "rating": 2.0, + "url": "https://books.toscrape.com/without-borders-wanderlove-1_956/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/24/e2/24e2f5c9d325c4004d8190c054da86dd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "When We Collided", + "price": 31.77, + "rating": 1.0, + "url": "https://books.toscrape.com/when-we-collided_955/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/08/04/08044269fc197645268a6197c57e6173.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "We Love You, Charlie Freeman", + "price": 50.27, + "rating": 5.0, + "url": "https://books.toscrape.com/we-love-you-charlie-freeman_954/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5f/15/5f152afdbc42356ecba02f61058a7e5b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Untitled Collection: Sabbath Poems 2014", + "price": 14.27, + "rating": 4.0, + "url": "https://books.toscrape.com/untitled-collection-sabbath-poems-2014_953/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f9/3b/f93b4a650f03a5d21f2436d7813f42c2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Unseen City: The Majesty of Pigeons, the Discreet Charm of Snails \u0026 Other Wonders of the Urban Wilderness", + "price": 44.18, + "rating": 4.0, + "url": "https://books.toscrape.com/unseen-city-the-majesty-of-pigeons-the-discreet-charm-of-snails-other-wonders-of-the-urban-wilderness_952/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/a2/41a20f35adf0caea24f208dc01ad7681.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Unicorn Tracks", + "price": 18.78, + "rating": 3.0, + "url": "https://books.toscrape.com/unicorn-tracks_951/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/76/8e/768ea5924ac1ef6297c2be9959c796c2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Unbound: How Eight Technologies Made Us Human, Transformed Society, and Brought Our World to the Brink", + "price": 25.52, + "rating": 1.0, + "url": "https://books.toscrape.com/unbound-how-eight-technologies-made-us-human-transformed-society-and-brought-our-world-to-the-brink_950/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4a/3b/4a3b055f9e378a95fedbef55e7bab7ce.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Tsubasa: WoRLD CHRoNiCLE 2 (Tsubasa WoRLD CHRoNiCLE #2)", + "price": 16.28, + "rating": 1.0, + "url": "https://books.toscrape.com/tsubasa-world-chronicle-2-tsubasa-world-chronicle-2_949/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/36/df/36df4caaf1420b1183a8235355d39e69.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Throwing Rocks at the Google Bus: How Growth Became the Enemy of Prosperity", + "price": 31.12, + "rating": 3.0, + "url": "https://books.toscrape.com/throwing-rocks-at-the-google-bus-how-growth-became-the-enemy-of-prosperity_948/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/03/86/038650c9e7517b4baf2a423cd8eed38f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "This One Summer", + "price": 19.49, + "rating": 4.0, + "url": "https://books.toscrape.com/this-one-summer_947/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c4/dd/c4ddd9ced89966b0602ec85e00cd5b61.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Thirst", + "price": 17.27, + "rating": 5.0, + "url": "https://books.toscrape.com/thirst_946/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c4/0a/c40a64f59e7487b1a80a049f6ceb2ba5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Torch Is Passed: A Harding Family Story", + "price": 19.09, + "rating": 1.0, + "url": "https://books.toscrape.com/the-torch-is-passed-a-harding-family-story_945/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/33/e5/33e507172541628acfd421503196b578.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Secret of Dreadwillow Carse", + "price": 56.13, + "rating": 1.0, + "url": "https://books.toscrape.com/the-secret-of-dreadwillow-carse_944/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c4/a2/c4a2a1a026c67bcceb5a411c724d7d0c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Pioneer Woman Cooks: Dinnertime: Comfort Classics, Freezer Food, 16-Minute Meals, and Other Delicious Ways to Solve Supper!", + "price": 56.41, + "rating": 1.0, + "url": "https://books.toscrape.com/the-pioneer-woman-cooks-dinnertime-comfort-classics-freezer-food-16-minute-meals-and-other-delicious-ways-to-solve-supper_943/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b7/f4/b7f4843dbe062d44be1ffcfa16b2faa4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Past Never Ends", + "price": 56.5, + "rating": 4.0, + "url": "https://books.toscrape.com/the-past-never-ends_942/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/89/b8/89b850edb01851a91f64ba114b96acb6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Natural History of Us (The Fine Art of Pretending #2)", + "price": 45.22, + "rating": 3.0, + "url": "https://books.toscrape.com/the-natural-history-of-us-the-fine-art-of-pretending-2_941/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5d/7f/5d7f496cdf5e5962a73ecdcc1505c1d5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Nameless City (The Nameless City #1)", + "price": 38.16, + "rating": 4.0, + "url": "https://books.toscrape.com/the-nameless-city-the-nameless-city-1_940/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f4/79/f479de5f305c2ac0512702cf7155bb74.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Murder That Never Was (Forensic Instincts #5)", + "price": 54.11, + "rating": 3.0, + "url": "https://books.toscrape.com/the-murder-that-never-was-forensic-instincts-5_939/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/dc/44/dc44f8e2aebac48ca8553814d9b021a8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Most Perfect Thing: Inside (and Outside) a Bird\u0027s Egg", + "price": 42.96, + "rating": 4.0, + "url": "https://books.toscrape.com/the-most-perfect-thing-inside-and-outside-a-birds-egg_938/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d4/8d/d48d5122a15347e9fe2b15ad354d69bf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Mindfulness and Acceptance Workbook for Anxiety: A Guide to Breaking Free from Anxiety, Phobias, and Worry Using Acceptance and Commitment Therapy", + "price": 23.89, + "rating": 4.0, + "url": "https://books.toscrape.com/the-mindfulness-and-acceptance-workbook-for-anxiety-a-guide-to-breaking-free-from-anxiety-phobias-and-worry-using-acceptance-and-commitment-therapy_937/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f8/6d/f86d08178e3788563ac17be5aefd29f0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Life-Changing Magic of Tidying Up: The Japanese Art of Decluttering and Organizing", + "price": 16.77, + "rating": 3.0, + "url": "https://books.toscrape.com/the-life-changing-magic-of-tidying-up-the-japanese-art-of-decluttering-and-organizing_936/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/95/64/95647d6a526bf54120b9445e124794e1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Inefficiency Assassin: Time Management Tactics for Working Smarter, Not Longer", + "price": 20.59, + "rating": 5.0, + "url": "https://books.toscrape.com/the-inefficiency-assassin-time-management-tactics-for-working-smarter-not-longer_935/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/75/dc/75dce2f5949b407161f37f0af249b018.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Gutsy Girl: Escapades for Your Life of Epic Adventure", + "price": 37.13, + "rating": 1.0, + "url": "https://books.toscrape.com/the-gutsy-girl-escapades-for-your-life-of-epic-adventure_934/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/64/15/641570cd7e7aded53c7d33d78a9629f1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Electric Pencil: Drawings from Inside State Hospital No. 3", + "price": 56.06, + "rating": 1.0, + "url": "https://books.toscrape.com/the-electric-pencil-drawings-from-inside-state-hospital-no-3_933/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2e/23/2e236e23ad52aa74505f224f6552eda8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Death of Humanity: and the Case for Life", + "price": 58.11, + "rating": 4.0, + "url": "https://books.toscrape.com/the-death-of-humanity-and-the-case-for-life_932/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/71/df/71df730cf38c232ee58a2e407135f055.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Bulletproof Diet: Lose up to a Pound a Day, Reclaim Energy and Focus, Upgrade Your Life", + "price": 49.05, + "rating": 3.0, + "url": "https://books.toscrape.com/the-bulletproof-diet-lose-up-to-a-pound-a-day-reclaim-energy-and-focus-upgrade-your-life_931/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/3e/ee3e219d23e73ba71c79b700f183aaed.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Art Forger", + "price": 40.76, + "rating": 3.0, + "url": "https://books.toscrape.com/the-art-forger_930/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/70/fa/70fa6c0437d9c97dbeada6bd32bf9d2c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Age of Genius: The Seventeenth Century and the Birth of the Modern Mind", + "price": 19.73, + "rating": 1.0, + "url": "https://books.toscrape.com/the-age-of-genius-the-seventeenth-century-and-the-birth-of-the-modern-mind_929/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2d/4e/2d4e358712e6c9f1d3bdd78d1a16e5a8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Activist\u0027s Tao Te Ching: Ancient Advice for a Modern Revolution", + "price": 32.24, + "rating": 5.0, + "url": "https://books.toscrape.com/the-activists-tao-te-ching-ancient-advice-for-a-modern-revolution_928/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/96/db/96db61bb53930c560fb4c1c62b583816.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Spark Joy: An Illustrated Master Class on the Art of Organizing and Tidying Up", + "price": 41.83, + "rating": 4.0, + "url": "https://books.toscrape.com/spark-joy-an-illustrated-master-class-on-the-art-of-organizing-and-tidying-up_927/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f3/4f/f34ffb24cc21c9f9f52dad4fd8f3ac21.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Soul Reader", + "price": 39.58, + "rating": 2.0, + "url": "https://books.toscrape.com/soul-reader_926/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/69/85/69852567cf97264a1442cbc882c84903.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Security", + "price": 39.25, + "rating": 2.0, + "url": "https://books.toscrape.com/security_925/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/da/df/dadfac66a89774b46b10225362724c83.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Saga, Volume 6 (Saga (Collected Editions) #6)", + "price": 25.02, + "rating": 3.0, + "url": "https://books.toscrape.com/saga-volume-6-saga-collected-editions-6_924/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/43/ae/43aee83ebb31e2122a7215e413770e5c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Saga, Volume 5 (Saga (Collected Editions) #5)", + "price": 51.04, + "rating": 2.0, + "url": "https://books.toscrape.com/saga-volume-5-saga-collected-editions-5_923/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e1/ea/e1ea6cb36e62ae6dc7b805f68ab9a700.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Reskilling America: Learning to Labor in the Twenty-First Century", + "price": 19.83, + "rating": 2.0, + "url": "https://books.toscrape.com/reskilling-america-learning-to-labor-in-the-twenty-first-century_922/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/97/f8/97f8debeeaaece9603267653076e760f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Rat Queens, Vol. 3: Demons (Rat Queens (Collected Editions) #11-15)", + "price": 50.4, + "rating": 3.0, + "url": "https://books.toscrape.com/rat-queens-vol-3-demons-rat-queens-collected-editions-11-15_921/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f3/ef/f3efd43ae0fa85d9b325d5e8783e7af5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Princess Jellyfish 2-in-1 Omnibus, Vol. 01 (Princess Jellyfish 2-in-1 Omnibus #1)", + "price": 13.61, + "rating": 5.0, + "url": "https://books.toscrape.com/princess-jellyfish-2-in-1-omnibus-vol-01-princess-jellyfish-2-in-1-omnibus-1_920/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/78/0b/780b2c28122750c2c383846155815bf7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Princess Between Worlds (Wide-Awake Princess #5)", + "price": 13.34, + "rating": 5.0, + "url": "https://books.toscrape.com/princess-between-worlds-wide-awake-princess-5_919/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b7/e8/b7e84b78be3d9bb79b71156a5e5d4e42.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Pop Gun War, Volume 1: Gift", + "price": 18.97, + "rating": 1.0, + "url": "https://books.toscrape.com/pop-gun-war-volume-1-gift_918/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c8/2f/c82f629a31b3f47bdb17ac14aa51076d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics", + "price": 36.28, + "rating": 2.0, + "url": "https://books.toscrape.com/political-suicide-missteps-peccadilloes-bad-calls-backroom-hijinx-sordid-pasts-rotten-breaks-and-just-plain-dumb-mistakes-in-the-annals-of-american-politics_917/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/64/44/6444dacdcb9edaadbbd691524622aeb8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Patience", + "price": 10.16, + "rating": 3.0, + "url": "https://books.toscrape.com/patience_916/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/01/72/01726c619a05114dca75bd840095016d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Outcast, Vol. 1: A Darkness Surrounds Him (Outcast #1)", + "price": 15.44, + "rating": 4.0, + "url": "https://books.toscrape.com/outcast-vol-1-a-darkness-surrounds-him-outcast-1_915/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cb/00/cb004189f548d75ad430d3ed19e6daa9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "orange: The Complete Collection 1 (orange: The Complete Collection #1)", + "price": 48.41, + "rating": 1.0, + "url": "https://books.toscrape.com/orange-the-complete-collection-1-orange-the-complete-collection-1_914/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/03/88/03886a8502ca54dbce0d91c2568ab69d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Online Marketing for Busy Authors: A Step-By-Step Guide", + "price": 46.35, + "rating": 1.0, + "url": "https://books.toscrape.com/online-marketing-for-busy-authors-a-step-by-step-guide_913/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ea/9b/ea9b2cb8abbb317402e618445bade1e1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "On a Midnight Clear", + "price": 14.07, + "rating": 3.0, + "url": "https://books.toscrape.com/on-a-midnight-clear_912/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a1/14/a114d70e7babf110ba42a389078e9a45.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Obsidian (Lux #1)", + "price": 14.86, + "rating": 2.0, + "url": "https://books.toscrape.com/obsidian-lux-1_911/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fc/72/fc72f158554b4b4164701e1dfa1153c7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "My Paris Kitchen: Recipes and Stories", + "price": 33.37, + "rating": 2.0, + "url": "https://books.toscrape.com/my-paris-kitchen-recipes-and-stories_910/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f5/65/f565af3d9dd20a1ad72a1e7c4157387d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Masks and Shadows", + "price": 56.4, + "rating": 2.0, + "url": "https://books.toscrape.com/masks-and-shadows_909/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ff/e8/ffe81bf98f8386ef29e193abfb6f9c1e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Mama Tried: Traditional Italian Cooking for the Screwed, Crude, Vegan, and Tattooed", + "price": 14.02, + "rating": 4.0, + "url": "https://books.toscrape.com/mama-tried-traditional-italian-cooking-for-the-screwed-crude-vegan-and-tattooed_908/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/10/c6/10c61093002db1fec4089d8076678624.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Lumberjanes, Vol. 2: Friendship to the Max (Lumberjanes #5-8)", + "price": 46.91, + "rating": 2.0, + "url": "https://books.toscrape.com/lumberjanes-vol-2-friendship-to-the-max-lumberjanes-5-8_907/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d3/15/d3158e8d3546fb90cced3c1d44a92a34.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Lumberjanes, Vol. 1: Beware the Kitten Holy (Lumberjanes #1-4)", + "price": 45.61, + "rating": 3.0, + "url": "https://books.toscrape.com/lumberjanes-vol-1-beware-the-kitten-holy-lumberjanes-1-4_906/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7e/a0/7ea062007ef00107e3c16d336b41fab2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Lumberjanes Vol. 3: A Terrible Plan (Lumberjanes #9-12)", + "price": 19.92, + "rating": 2.0, + "url": "https://books.toscrape.com/lumberjanes-vol-3-a-terrible-plan-lumberjanes-9-12_905/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5f/b1/5fb1bf88dcfda795606745ce35be5975.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Layered: Baking, Building, and Styling Spectacular Cakes", + "price": 40.11, + "rating": 1.0, + "url": "https://books.toscrape.com/layered-baking-building-and-styling-spectacular-cakes_904/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/98/d1/98d1c979c4bac9e147a6718946578b0f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Judo: Seven Steps to Black Belt (an Introductory Guide for Beginners)", + "price": 53.9, + "rating": 2.0, + "url": "https://books.toscrape.com/judo-seven-steps-to-black-belt-an-introductory-guide-for-beginners_903/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5f/52/5f52b1bc6d45daab2e330c744feb0359.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Join", + "price": 35.67, + "rating": 5.0, + "url": "https://books.toscrape.com/join_902/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/93/63/9363f0065fbad5689f44fcf6e203eef3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "In the Country We Love: My Family Divided", + "price": 22.0, + "rating": 4.0, + "url": "https://books.toscrape.com/in-the-country-we-love-my-family-divided_901/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fe/ea/feeafd2ad7b3077f8e74cbb1da9e3c7d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Immunity: How Elie Metchnikoff Changed the Course of Modern Medicine", + "price": 57.36, + "rating": 5.0, + "url": "https://books.toscrape.com/immunity-how-elie-metchnikoff-changed-the-course-of-modern-medicine_900/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/26/1c/261c4eaf957ae4aacf2229b482e76dbe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "I Hate Fairyland, Vol. 1: Madly Ever After (I Hate Fairyland (Compilations) #1-5)", + "price": 29.17, + "rating": 2.0, + "url": "https://books.toscrape.com/i-hate-fairyland-vol-1-madly-ever-after-i-hate-fairyland-compilations-1-5_899/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/aa/74/aa74004807e97a79aa084b5db329a99b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "I am a Hero Omnibus Volume 1", + "price": 54.63, + "rating": 3.0, + "url": "https://books.toscrape.com/i-am-a-hero-omnibus-volume-1_898/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/16/d4/16d443437126bf6d536a89312c1995a5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "How to Be Miserable: 40 Strategies You Already Use", + "price": 46.03, + "rating": 1.0, + "url": "https://books.toscrape.com/how-to-be-miserable-40-strategies-you-already-use_897/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/da/8b/da8bc9b824dd3f446ef63e438ddbfc85.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Her Backup Boyfriend (The Sorensen Family #1)", + "price": 33.97, + "rating": 1.0, + "url": "https://books.toscrape.com/her-backup-boyfriend-the-sorensen-family-1_896/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1e/bb/1ebbbc3e2d3249b111033cfc40763b0b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Giant Days, Vol. 2 (Giant Days #5-8)", + "price": 22.11, + "rating": 2.0, + "url": "https://books.toscrape.com/giant-days-vol-2-giant-days-5-8_895/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/90/6f/906f0168b0e155a7077625499b1737b5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Forever and Forever: The Courtship of Henry Longfellow and Fanny Appleton", + "price": 29.69, + "rating": 3.0, + "url": "https://books.toscrape.com/forever-and-forever-the-courtship-of-henry-longfellow-and-fanny-appleton_894/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d6/58/d658a1485b130ff26ca5fb0d5975ed2e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "First and First (Five Boroughs #3)", + "price": 15.97, + "rating": 4.0, + "url": "https://books.toscrape.com/first-and-first-five-boroughs-3_893/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c4/d1/c4d1517cc9370e292366b6132ca9ca36.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Fifty Shades Darker (Fifty Shades #2)", + "price": 21.96, + "rating": 1.0, + "url": "https://books.toscrape.com/fifty-shades-darker-fifty-shades-2_892/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cc/bd/ccbdae9e29b3594301528fa2c876ec29.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Everydata: The Misinformation Hidden in the Little Data You Consume Every Day", + "price": 54.35, + "rating": 2.0, + "url": "https://books.toscrape.com/everydata-the-misinformation-hidden-in-the-little-data-you-consume-every-day_891/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/64/94/6494bf61176ca73b61255909230030be.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Don\u0027t Be a Jerk: And Other Practical Advice from Dogen, Japan\u0027s Greatest Zen Master", + "price": 37.97, + "rating": 2.0, + "url": "https://books.toscrape.com/dont-be-a-jerk-and-other-practical-advice-from-dogen-japans-greatest-zen-master_890/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/95/30/953013d044aa313cc162dec414f3969a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Danganronpa Volume 1", + "price": 51.99, + "rating": 4.0, + "url": "https://books.toscrape.com/danganronpa-volume-1_889/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/78/97/7897eea91c4a85aca58d925861d4afec.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Crown of Midnight (Throne of Glass #2)", + "price": 43.29, + "rating": 3.0, + "url": "https://books.toscrape.com/crown-of-midnight-throne-of-glass-2_888/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/66/25/6625e3bbb050de3e42a0c302c0d69f1f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Codename Baboushka, Volume 1: The Conclave of Death", + "price": 36.72, + "rating": 4.0, + "url": "https://books.toscrape.com/codename-baboushka-volume-1-the-conclave-of-death_887/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f6/88/f688a9d6a89fdf38e4e88439ee9eda69.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Camp Midnight", + "price": 17.08, + "rating": 4.0, + "url": "https://books.toscrape.com/camp-midnight_886/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/dd/c9/ddc95df6754df8e71bf969c088056188.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Call the Nurse: True Stories of a Country Nurse on a Scottish Isle", + "price": 29.14, + "rating": 5.0, + "url": "https://books.toscrape.com/call-the-nurse-true-stories-of-a-country-nurse-on-a-scottish-isle_885/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/88/9e/889e0bac4c7c0e7178f0165b8d3b4617.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Burning", + "price": 28.81, + "rating": 3.0, + "url": "https://books.toscrape.com/burning_884/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/26/95/269507c7bb35d2cec9b61a03d1c28e67.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Bossypants", + "price": 49.46, + "rating": 2.0, + "url": "https://books.toscrape.com/bossypants_883/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/27/d2/27d20361745ec2f7be668b18a4da29da.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Bitch Planet, Vol. 1: Extraordinary Machine (Bitch Planet (Collected Editions))", + "price": 37.92, + "rating": 2.0, + "url": "https://books.toscrape.com/bitch-planet-vol-1-extraordinary-machine-bitch-planet-collected-editions_882/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e4/1d/e41d34204a1fffbf825d8beb3dbf4cbc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Avatar: The Last Airbender: Smoke and Shadow, Part 3 (Smoke and Shadow #3)", + "price": 28.09, + "rating": 2.0, + "url": "https://books.toscrape.com/avatar-the-last-airbender-smoke-and-shadow-part-3-smoke-and-shadow-3_881/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/18/061811c5845d0e13bc04b2a755f0830f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Algorithms to Live By: The Computer Science of Human Decisions", + "price": 30.81, + "rating": 1.0, + "url": "https://books.toscrape.com/algorithms-to-live-by-the-computer-science-of-human-decisions_880/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/23/b4/23b42e094c02d52b14b11a960d49610e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "A World of Flavor: Your Gluten Free Passport", + "price": 42.95, + "rating": 1.0, + "url": "https://books.toscrape.com/a-world-of-flavor-your-gluten-free-passport_879/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/78/2e/782e315667ec50759b8603527ee33dec.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "A Piece of Sky, a Grain of Rice: A Memoir in Four Meditations", + "price": 56.76, + "rating": 5.0, + "url": "https://books.toscrape.com/a-piece-of-sky-a-grain-of-rice-a-memoir-in-four-meditations_878/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/08/89/088995e862aac86c88c608d763f6390e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "A Murder in Time", + "price": 16.64, + "rating": 1.0, + "url": "https://books.toscrape.com/a-murder-in-time_877/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/11/aa/11aaad48b5f15e262456ca65294084da.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "A Flight of Arrows (The Pathfinders #2)", + "price": 55.53, + "rating": 5.0, + "url": "https://books.toscrape.com/a-flight-of-arrows-the-pathfinders-2_876/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/82/96/8296f92b70fb1dafefecda92c1d51941.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "A Fierce and Subtle Poison", + "price": 28.13, + "rating": 4.0, + "url": "https://books.toscrape.com/a-fierce-and-subtle-poison_875/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/12/f1/12f1963957f27fa83d51f76b183ef490.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "A Court of Thorns and Roses (A Court of Thorns and Roses #1)", + "price": 52.37, + "rating": 1.0, + "url": "https://books.toscrape.com/a-court-of-thorns-and-roses-a-court-of-thorns-and-roses-1_874/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c0/88/c08816960890396213a423941af65b8f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "(Un)Qualified: How God Uses Broken People to Do Big Things", + "price": 54.0, + "rating": 5.0, + "url": "https://books.toscrape.com/unqualified-how-god-uses-broken-people-to-do-big-things_873/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cd/db/cddb3eb483ef11a088d519205b7098fb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "You Are What You Love: The Spiritual Power of Habit", + "price": 21.87, + "rating": 4.0, + "url": "https://books.toscrape.com/you-are-what-you-love-the-spiritual-power-of-habit_872/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6b/70/6b70f2cdb17d9ab7551240a88b9211fe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "William Shakespeare\u0027s Star Wars: Verily, A New Hope (William Shakespeare\u0027s Star Wars #4)", + "price": 43.3, + "rating": 4.0, + "url": "https://books.toscrape.com/william-shakespeares-star-wars-verily-a-new-hope-william-shakespeares-star-wars-4_871/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/02/37/0237b445efc18c5562355a5a2c40889c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Tuesday Nights in 1980", + "price": 21.04, + "rating": 2.0, + "url": "https://books.toscrape.com/tuesday-nights-in-1980_870/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6b/da/6bdae061cb92c32b0b83cda8dd10275d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Tracing Numbers on a Train", + "price": 41.6, + "rating": 3.0, + "url": "https://books.toscrape.com/tracing-numbers-on-a-train_869/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/a6/06a6cfcf89afd1601cbba1a16cda57fb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Throne of Glass (Throne of Glass #1)", + "price": 35.07, + "rating": 3.0, + "url": "https://books.toscrape.com/throne-of-glass-throne-of-glass-1_868/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/32/d6/32d6aa560e8ddf2a4da1526b95d4c7ab.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Thomas Jefferson and the Tripoli Pirates: The Forgotten War That Changed American History", + "price": 59.64, + "rating": 1.0, + "url": "https://books.toscrape.com/thomas-jefferson-and-the-tripoli-pirates-the-forgotten-war-that-changed-american-history_867/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/97/47/974709d437b08e74649b5744471bf472.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Thirteen Reasons Why", + "price": 52.72, + "rating": 1.0, + "url": "https://books.toscrape.com/thirteen-reasons-why_866/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8a/83/8a83b6ce350f01bab21f85e6ba539316.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The White Cat and the Monk: A Retelling of the Poem “Pangur Bán”", + "price": 58.08, + "rating": 4.0, + "url": "https://books.toscrape.com/the-white-cat-and-the-monk-a-retelling-of-the-poem-pangur-ban_865/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/26/32/2632a1e12f2c085fabbe022ae4cd6933.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Wedding Dress", + "price": 24.12, + "rating": 1.0, + "url": "https://books.toscrape.com/the-wedding-dress_864/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/28/99/28992d89f4abf54fba183fc8d074adf3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Vacationers", + "price": 42.15, + "rating": 4.0, + "url": "https://books.toscrape.com/the-vacationers_863/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/37/25/372578cc073efae80cf284b56040a488.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Third Wave: An Entrepreneur’s Vision of the Future", + "price": 12.61, + "rating": 5.0, + "url": "https://books.toscrape.com/the-third-wave-an-entrepreneurs-vision-of-the-future_862/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d0/77/d077a30042df6b916bfc8d257345c69e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Stranger", + "price": 17.44, + "rating": 4.0, + "url": "https://books.toscrape.com/the-stranger_861/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ea/04/ea0476a6f4c318ceccf5e2f2b39f2b15.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Shadow Hero (The Shadow Hero)", + "price": 33.14, + "rating": 1.0, + "url": "https://books.toscrape.com/the-shadow-hero-the-shadow-hero_860/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1f/62/1f621dda1b302fc16d83d94b0b5ac31c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Secret (The Secret #1)", + "price": 27.37, + "rating": 4.0, + "url": "https://books.toscrape.com/the-secret-the-secret-1_859/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4e/0f/4e0f05ae01d8fb6bd0d3901edd06de16.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Regional Office Is Under Attack!", + "price": 51.36, + "rating": 5.0, + "url": "https://books.toscrape.com/the-regional-office-is-under-attack_858/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f8/31/f8314c7fdaa79fb7191a583e9a852db8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Psychopath Test: A Journey Through the Madness Industry", + "price": 36.0, + "rating": 2.0, + "url": "https://books.toscrape.com/the-psychopath-test-a-journey-through-the-madness-industry_857/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/34/f5/34f5f8e513c5f048241f5695e61b2483.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Project", + "price": 10.65, + "rating": 1.0, + "url": "https://books.toscrape.com/the-project_856/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/10/6e/106e2fc7160712edf8e2ff996dc8cd6c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Power of Now: A Guide to Spiritual Enlightenment", + "price": 43.54, + "rating": 2.0, + "url": "https://books.toscrape.com/the-power-of-now-a-guide-to-spiritual-enlightenment_855/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/03/38/0338682e76bad3216cd4c6c28b2b625a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Omnivore\u0027s Dilemma: A Natural History of Four Meals", + "price": 38.21, + "rating": 2.0, + "url": "https://books.toscrape.com/the-omnivores-dilemma-a-natural-history-of-four-meals_854/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/14/f3/14f3d525e2a114cd71e27201a16af188.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Nerdy Nummies Cookbook: Sweet Treats for the Geek in All of Us", + "price": 37.34, + "rating": 5.0, + "url": "https://books.toscrape.com/the-nerdy-nummies-cookbook-sweet-treats-for-the-geek-in-all-of-us_853/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/bd/61bdfe3950643c47d70c37c4123530f3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Murder of Roger Ackroyd (Hercule Poirot #4)", + "price": 44.1, + "rating": 4.0, + "url": "https://books.toscrape.com/the-murder-of-roger-ackroyd-hercule-poirot-4_852/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/29/fe/29fe70b1b2e5a9ba61d4bd331255e19e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Mistake (Off-Campus #2)", + "price": 43.29, + "rating": 3.0, + "url": "https://books.toscrape.com/the-mistake-off-campus-2_851/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a5/43/a543b100a8c1861c1bf5374ca6b576fe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Matchmaker\u0027s Playbook (Wingmen Inc. #1)", + "price": 55.85, + "rating": 1.0, + "url": "https://books.toscrape.com/the-matchmakers-playbook-wingmen-inc-1_850/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/84/ac/84acb0606c96e55dc729a9d6572a08fb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Love and Lemons Cookbook: An Apple-to-Zucchini Celebration of Impromptu Cooking", + "price": 37.6, + "rating": 2.0, + "url": "https://books.toscrape.com/the-love-and-lemons-cookbook-an-apple-to-zucchini-celebration-of-impromptu-cooking_849/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0d/1f/0d1f3f934460f5a50aaa8c366641234c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Long Shadow of Small Ghosts: Murder and Memory in an American City", + "price": 10.97, + "rating": 1.0, + "url": "https://books.toscrape.com/the-long-shadow-of-small-ghosts-murder-and-memory-in-an-american-city_848/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f2/e5/f2e51dd2b26600459f8eaeb6b9eecaa7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Kite Runner", + "price": 41.82, + "rating": 4.0, + "url": "https://books.toscrape.com/the-kite-runner_847/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/58/9d/589d73503d9a23d224de836134fae553.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The House by the Lake", + "price": 36.95, + "rating": 1.0, + "url": "https://books.toscrape.com/the-house-by-the-lake_846/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0d/cb/0dcb33d60b0e79adf8ab9842e697ea2e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Glittering Court (The Glittering Court #1)", + "price": 44.28, + "rating": 1.0, + "url": "https://books.toscrape.com/the-glittering-court-the-glittering-court-1_845/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3e/0b/3e0b16851bec08b6cbf78d5f64af9114.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Girl on the Train", + "price": 55.02, + "rating": 2.0, + "url": "https://books.toscrape.com/the-girl-on-the-train_844/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/25/6c/256c946dd0962095f66c6de3b15ab300.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Genius of Birds", + "price": 17.24, + "rating": 1.0, + "url": "https://books.toscrape.com/the-genius-of-birds_843/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/13/57/1357c6aa40c9e63d2f931927fbf81f3f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Emerald Mystery", + "price": 23.15, + "rating": 2.0, + "url": "https://books.toscrape.com/the-emerald-mystery_842/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/81/58/81586cd0bf8743e1f5ed80b6a0e1fabe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Cookies \u0026 Cups Cookbook: 125+ sweet \u0026 savory recipes reminding you to Always Eat Dessert First", + "price": 41.25, + "rating": 1.0, + "url": "https://books.toscrape.com/the-cookies-cups-cookbook-125-sweet-savory-recipes-reminding-you-to-always-eat-dessert-first_841/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/54/89/54899b4584e941ceced511d81092c88a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Bridge to Consciousness: I\u0027m Writing the Bridge Between Science and Our Old and New Beliefs.", + "price": 32.0, + "rating": 3.0, + "url": "https://books.toscrape.com/the-bridge-to-consciousness-im-writing-the-bridge-between-science-and-our-old-and-new-beliefs_840/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fe/b7/feb764b2afa54991cfdbbffdf501b333.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Artist\u0027s Way: A Spiritual Path to Higher Creativity", + "price": 38.49, + "rating": 5.0, + "url": "https://books.toscrape.com/the-artists-way-a-spiritual-path-to-higher-creativity_839/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0e/6d/0e6dc2484322c5b9e7854ced66fdf62d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Art of War", + "price": 33.34, + "rating": 5.0, + "url": "https://books.toscrape.com/the-art-of-war_838/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6d/71/6d71e36c8b1b9c885e1bb6c72cd8bcf8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Argonauts", + "price": 10.93, + "rating": 2.0, + "url": "https://books.toscrape.com/the-argonauts_837/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0a/15/0a1567cd04a6582d333db71337b4e2a6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The 10% Entrepreneur: Live Your Startup Dream Without Quitting Your Day Job", + "price": 27.55, + "rating": 3.0, + "url": "https://books.toscrape.com/the-10-entrepreneur-live-your-startup-dream-without-quitting-your-day-job_836/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/82/93/82939ca78da0b724f16ec814849514fd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Suddenly in Love (Lake Haven #1)", + "price": 55.99, + "rating": 2.0, + "url": "https://books.toscrape.com/suddenly-in-love-lake-haven-1_835/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e9/f4/e9f4bc8cf5ffaea1504623c936e90a48.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Something More Than This", + "price": 16.24, + "rating": 4.0, + "url": "https://books.toscrape.com/something-more-than-this_834/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/59/10/5910fbd8a95e8e9de9c660b71e0694e2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Soft Apocalypse", + "price": 26.12, + "rating": 2.0, + "url": "https://books.toscrape.com/soft-apocalypse_833/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f0/06/f0060c756556b855184fa32f66280961.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "So You\u0027ve Been Publicly Shamed", + "price": 12.23, + "rating": 2.0, + "url": "https://books.toscrape.com/so-youve-been-publicly-shamed_832/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6e/d4/6ed4991d97f60db29ec7b421e61a2cf3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Shoe Dog: A Memoir by the Creator of NIKE", + "price": 23.99, + "rating": 2.0, + "url": "https://books.toscrape.com/shoe-dog-a-memoir-by-the-creator-of-nike_831/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/19/aa/19aa1184a3565b1dae6092146018e109.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Shobu Samurai, Project Aryoku (#3)", + "price": 29.06, + "rating": 3.0, + "url": "https://books.toscrape.com/shobu-samurai-project-aryoku-3_830/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/0c/ae0ccc307568b6d7699786411f3cbcc4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Secrets and Lace (Fatal Hearts #1)", + "price": 20.27, + "rating": 1.0, + "url": "https://books.toscrape.com/secrets-and-lace-fatal-hearts-1_829/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/84/7c/847c06b541e2a3b2228b96d97a5fe7a6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Scarlett Epstein Hates It Here", + "price": 43.55, + "rating": 5.0, + "url": "https://books.toscrape.com/scarlett-epstein-hates-it-here_828/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0f/d3/0fd306891f8fd3196653022fd67d6c87.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Romero and Juliet: A Tragic Tale of Love and Zombies", + "price": 36.94, + "rating": 1.0, + "url": "https://books.toscrape.com/romero-and-juliet-a-tragic-tale-of-love-and-zombies_827/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/12/f8/12f8002e5aab6d783e29b31aad36b5ba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Redeeming Love", + "price": 20.47, + "rating": 5.0, + "url": "https://books.toscrape.com/redeeming-love_826/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/21/21/2121ba78e26194d92c334fde3850f840.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Poses for Artists Volume 1 - Dynamic and Sitting Poses: An Essential Reference for Figure Drawing and the Human Form", + "price": 41.06, + "rating": 1.0, + "url": "https://books.toscrape.com/poses-for-artists-volume-1-dynamic-and-sitting-poses-an-essential-reference-for-figure-drawing-and-the-human-form_825/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5a/89/5a89e2dd7866dda6660fe508bc4b5249.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Poems That Make Grown Women Cry", + "price": 14.19, + "rating": 4.0, + "url": "https://books.toscrape.com/poems-that-make-grown-women-cry_824/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/38/64/386468a8c3e6b880664bf7885bf6f726.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Nightingale, Sing", + "price": 38.28, + "rating": 1.0, + "url": "https://books.toscrape.com/nightingale-sing_823/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/18/08/18086e581ad354aa65f945c2b5c51350.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Night Sky with Exit Wounds", + "price": 41.05, + "rating": 1.0, + "url": "https://books.toscrape.com/night-sky-with-exit-wounds_822/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/25/54/2554431c797ec725eea50b3f8a83758c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Mrs. Houdini", + "price": 30.25, + "rating": 5.0, + "url": "https://books.toscrape.com/mrs-houdini_821/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0e/fe/0efe86960cdff718aed01a5c3f65b1c3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Modern Romance", + "price": 28.26, + "rating": 5.0, + "url": "https://books.toscrape.com/modern-romance_820/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/28/78/2878538a1039d9c4649110499a1393fb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Miss Peregrine’s Home for Peculiar Children (Miss Peregrine’s Peculiar Children #1)", + "price": 10.76, + "rating": 1.0, + "url": "https://books.toscrape.com/miss-peregrines-home-for-peculiar-children-miss-peregrines-peculiar-children-1_819/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/01/26/01264865c12ed6d987d6f0858cd1d0ba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Louisa: The Extraordinary Life of Mrs. Adams", + "price": 16.85, + "rating": 2.0, + "url": "https://books.toscrape.com/louisa-the-extraordinary-life-of-mrs-adams_818/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6f/d9/6fd92e5143cbd5bb8bcf034e5f007dde.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Little Red", + "price": 13.47, + "rating": 3.0, + "url": "https://books.toscrape.com/little-red_817/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/80/25/8025b80a40178f2a6dd4f99ad88e0fba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Library of Souls (Miss Peregrine’s Peculiar Children #3)", + "price": 48.56, + "rating": 5.0, + "url": "https://books.toscrape.com/library-of-souls-miss-peregrines-peculiar-children-3_816/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f8/54/f85417465a73e33604624205ba8306cc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Large Print Heart of the Pride", + "price": 19.15, + "rating": 2.0, + "url": "https://books.toscrape.com/large-print-heart-of-the-pride_815/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bd/e9/bde95ab9f776c911a7aa759cad60bb41.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "I Had a Nice Time And Other Lies...: How to find love \u0026 sh*t like that", + "price": 57.36, + "rating": 4.0, + "url": "https://books.toscrape.com/i-had-a-nice-time-and-other-lies-how-to-find-love-sht-like-that_814/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5f/72/5f72c8a0d5a7292e2929a354ec8a022f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Hollow City (Miss Peregrine’s Peculiar Children #2)", + "price": 42.98, + "rating": 1.0, + "url": "https://books.toscrape.com/hollow-city-miss-peregrines-peculiar-children-2_813/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e2/60/e260b008b7ea7970562295b7bc64b0cb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Grumbles", + "price": 22.16, + "rating": 2.0, + "url": "https://books.toscrape.com/grumbles_812/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d6/1b/d61b12ef0e69d49e2645537dd6a8472a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Full Moon over Noah’s Ark: An Odyssey to Mount Ararat and Beyond", + "price": 49.43, + "rating": 4.0, + "url": "https://books.toscrape.com/full-moon-over-noahs-ark-an-odyssey-to-mount-ararat-and-beyond_811/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/57/77/57770cac1628f4407636635f4b85e88c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Frostbite (Vampire Academy #2)", + "price": 29.99, + "rating": 5.0, + "url": "https://books.toscrape.com/frostbite-vampire-academy-2_810/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/71/76/7176317f1915fa0658bb2fe400441207.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Follow You Home", + "price": 21.36, + "rating": 1.0, + "url": "https://books.toscrape.com/follow-you-home_809/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a7/4b/a74b35375ce874153fd352e33bc7bac9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "First Steps for New Christians (Print Edition)", + "price": 29.0, + "rating": 1.0, + "url": "https://books.toscrape.com/first-steps-for-new-christians-print-edition_808/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f1/73/f1731459b1e2f4becf2c52b8f30b8cd7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Finders Keepers (Bill Hodges Trilogy #2)", + "price": 53.53, + "rating": 5.0, + "url": "https://books.toscrape.com/finders-keepers-bill-hodges-trilogy-2_807/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6a/81/6a81103b1c01a3f6c56e5718a838a4c8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Fables, Vol. 1: Legends in Exile (Fables #1)", + "price": 41.62, + "rating": 4.0, + "url": "https://books.toscrape.com/fables-vol-1-legends-in-exile-fables-1_806/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/51/8c/518c184a793b751b43045637c8002eb7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Eureka Trivia 6.0", + "price": 54.59, + "rating": 4.0, + "url": "https://books.toscrape.com/eureka-trivia-60_805/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/96/17/96173470df6fc6fef4d0008e957653ce.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Drive: The Surprising Truth About What Motivates Us", + "price": 34.95, + "rating": 4.0, + "url": "https://books.toscrape.com/drive-the-surprising-truth-about-what-motivates-us_804/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8a/49/8a490347afdc10abe7c2099e466de32f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Done Rubbed Out (Reightman \u0026 Bailey #1)", + "price": 37.72, + "rating": 5.0, + "url": "https://books.toscrape.com/done-rubbed-out-reightman-bailey-1_803/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/08/4d/084da0199a717cb6c1eda30f98d0ea4c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Doing It Over (Most Likely To #1)", + "price": 35.61, + "rating": 3.0, + "url": "https://books.toscrape.com/doing-it-over-most-likely-to-1_802/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e9/25/e9250495a525eb203652ad9da85ccb8e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Deliciously Ella Every Day: Quick and Easy Recipes for Gluten-Free Snacks, Packed Lunches, and Simple Meals", + "price": 42.16, + "rating": 3.0, + "url": "https://books.toscrape.com/deliciously-ella-every-day-quick-and-easy-recipes-for-gluten-free-snacks-packed-lunches-and-simple-meals_801/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/20/f2/20f28657b49f8cb24ed2ec6448bb6df3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Dark Notes", + "price": 19.19, + "rating": 5.0, + "url": "https://books.toscrape.com/dark-notes_800/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6e/4e/6e4e8f4f4abd94356a9be840e4681e65.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Daring Greatly: How the Courage to Be Vulnerable Transforms the Way We Live, Love, Parent, and Lead", + "price": 19.43, + "rating": 3.0, + "url": "https://books.toscrape.com/daring-greatly-how-the-courage-to-be-vulnerable-transforms-the-way-we-live-love-parent-and-lead_799/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/55/ce/55ced903becc59121d6edb47a4dcfb56.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Close to You", + "price": 49.46, + "rating": 4.0, + "url": "https://books.toscrape.com/close-to-you_798/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fa/f6/faf6d69a42f477e1da80a71f05a4dc25.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Chasing Heaven: What Dying Taught Me About Living", + "price": 37.8, + "rating": 2.0, + "url": "https://books.toscrape.com/chasing-heaven-what-dying-taught-me-about-living_797/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b7/6a/b76a73640d26b09c4a6f373b09050bed.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Big Magic: Creative Living Beyond Fear", + "price": 30.8, + "rating": 3.0, + "url": "https://books.toscrape.com/big-magic-creative-living-beyond-fear_796/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/62/ad/62ad9b4077416ddc0c4908062bca0e5e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Becoming Wise: An Inquiry into the Mystery and Art of Living", + "price": 27.43, + "rating": 2.0, + "url": "https://books.toscrape.com/becoming-wise-an-inquiry-into-the-mystery-and-art-of-living_795/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ff/69/ff69c96b05affa03f647287e46210bf9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Beauty Restored (Riley Family Legacy Novellas #3)", + "price": 11.11, + "rating": 2.0, + "url": "https://books.toscrape.com/beauty-restored-riley-family-legacy-novellas-3_794/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/51/6f/516f605a957a1f5592b81f4e06c491bb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Batman: The Long Halloween (Batman)", + "price": 36.5, + "rating": 2.0, + "url": "https://books.toscrape.com/batman-the-long-halloween-batman_793/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/78/a7/78a7f184a4d6d62412861c68f1c3ad90.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Batman: The Dark Knight Returns (Batman)", + "price": 15.38, + "rating": 5.0, + "url": "https://books.toscrape.com/batman-the-dark-knight-returns-batman_792/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/be/a9/bea95dbd7b2a843519c9a1dcfc433f9b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Ayumi\u0027s Violin", + "price": 15.48, + "rating": 2.0, + "url": "https://books.toscrape.com/ayumis-violin_791/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fa/18/fa18c44fba20b8191f6a88e2e28092fd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Anonymous", + "price": 46.82, + "rating": 4.0, + "url": "https://books.toscrape.com/anonymous_790/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fb/75/fb75a0ce3e0b01fa3852806c6d1f1af6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Amy Meets the Saints and Sages", + "price": 18.46, + "rating": 3.0, + "url": "https://books.toscrape.com/amy-meets-the-saints-and-sages_789/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/00/53/0053efa8515b8e2ad9b029c298766e9f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Amid the Chaos", + "price": 36.58, + "rating": 1.0, + "url": "https://books.toscrape.com/amid-the-chaos_788/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/52/46/524655fade1d9fe1475395a3eaff827a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Amatus", + "price": 50.54, + "rating": 5.0, + "url": "https://books.toscrape.com/amatus_787/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8f/92/8f92c3b5dc8f5c1a23324bda7477b19c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Agnostic: A Spirited Manifesto", + "price": 12.51, + "rating": 5.0, + "url": "https://books.toscrape.com/agnostic-a-spirited-manifesto_786/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9f/fc/9ffc43826233092d2acb4414f86627eb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Zealot: The Life and Times of Jesus of Nazareth", + "price": 24.7, + "rating": 3.0, + "url": "https://books.toscrape.com/zealot-the-life-and-times-of-jesus-of-nazareth_785/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3d/60/3d6003fc37b842a07c2dbe28e47448e1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "You (You #1)", + "price": 43.61, + "rating": 5.0, + "url": "https://books.toscrape.com/you-you-1_784/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d6/97/d697268540fa982f4dce39f61ed3a342.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Wonder Woman: Earth One, Volume One (Wonder Woman: Earth One #1)", + "price": 37.34, + "rating": 4.0, + "url": "https://books.toscrape.com/wonder-woman-earth-one-volume-one-wonder-woman-earth-one-1_783/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/19/39/19396172462f4cc0504d4e6e8b0e1647.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Wild Swans", + "price": 14.36, + "rating": 2.0, + "url": "https://books.toscrape.com/wild-swans_782/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bb/72/bb723ad463531c602ad8bcb244253bf3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Why the Right Went Wrong: Conservatism--From Goldwater to the Tea Party and Beyond", + "price": 52.65, + "rating": 4.0, + "url": "https://books.toscrape.com/why-the-right-went-wrong-conservatism-from-goldwater-to-the-tea-party-and-beyond_781/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/1b/db1babd3c09b84da800b0e9897fe0097.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Whole Lotta Creativity Going On: 60 Fun and Unusual Exercises to Awaken and Strengthen Your Creativity", + "price": 38.2, + "rating": 4.0, + "url": "https://books.toscrape.com/whole-lotta-creativity-going-on-60-fun-and-unusual-exercises-to-awaken-and-strengthen-your-creativity_780/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ba/36/ba368dfb2b6ae9979ff59d049c626167.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "What\u0027s It Like in Space?: Stories from Astronauts Who\u0027ve Been There", + "price": 19.6, + "rating": 2.0, + "url": "https://books.toscrape.com/whats-it-like-in-space-stories-from-astronauts-whove-been-there_779/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/43/b7/43b70859e93901b019791cef86539ffc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "We Are Robin, Vol. 1: The Vigilante Business (We Are Robin #1)", + "price": 53.9, + "rating": 1.0, + "url": "https://books.toscrape.com/we-are-robin-vol-1-the-vigilante-business-we-are-robin-1_778/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/66/d6/66d6d2b4c0acfa8f40ad0285186ed2d8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Walt Disney\u0027s Alice in Wonderland", + "price": 12.96, + "rating": 5.0, + "url": "https://books.toscrape.com/walt-disneys-alice-in-wonderland_777/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/28/50/2850439c2ba103fb69dba9cd2dd9f0c2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "V for Vendetta (V for Vendetta Complete)", + "price": 37.1, + "rating": 4.0, + "url": "https://books.toscrape.com/v-for-vendetta-v-for-vendetta-complete_776/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cc/8f/cc8fb914bfee31a7903a5cabaae64796.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Until Friday Night (The Field Party #1)", + "price": 46.31, + "rating": 2.0, + "url": "https://books.toscrape.com/until-friday-night-the-field-party-1_775/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/19/cf/19cf50aea5bf0e8f4bc016f3745b3dfe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Unbroken: A World War II Story of Survival, Resilience, and Redemption", + "price": 45.95, + "rating": 2.0, + "url": "https://books.toscrape.com/unbroken-a-world-war-ii-story-of-survival-resilience-and-redemption_774/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/74/cd/74cd3f345b50452c3be6631669f13aa8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Twenty Yawns", + "price": 22.08, + "rating": 2.0, + "url": "https://books.toscrape.com/twenty-yawns_773/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2b/38/2b380f77723c797c0389f978afa6db58.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Through the Woods", + "price": 25.38, + "rating": 2.0, + "url": "https://books.toscrape.com/through-the-woods_772/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4c/af/4caf8f2a5ee8828d408cc8faadd3419c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "This Is Where It Ends", + "price": 27.12, + "rating": 2.0, + "url": "https://books.toscrape.com/this-is-where-it-ends_771/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/18/0b/180bfe1902cb3c0eb77d7c712efa2a96.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Year of Magical Thinking", + "price": 43.04, + "rating": 2.0, + "url": "https://books.toscrape.com/the-year-of-magical-thinking_770/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bf/e5/bfe526c22c7c08235c27a6474ebb4db9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Wright Brothers", + "price": 56.8, + "rating": 4.0, + "url": "https://books.toscrape.com/the-wright-brothers_769/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/02/2e/022e8b81ba1405991401bb46d6330c73.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The White Queen (The Cousins\u0027 War #1)", + "price": 25.91, + "rating": 5.0, + "url": "https://books.toscrape.com/the-white-queen-the-cousins-war-1_768/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/72/d8/72d861617b6d3aababe6e61e8d3c1056.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Wedding Pact (The O\u0027Malleys #2)", + "price": 32.61, + "rating": 3.0, + "url": "https://books.toscrape.com/the-wedding-pact-the-omalleys-2_767/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7e/67/7e67addd80caaf8a9f9e9daa9cf66bb2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Time Keeper", + "price": 27.88, + "rating": 5.0, + "url": "https://books.toscrape.com/the-time-keeper_766/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8f/f8/8ff8680dde59ea739d6978a01e4d7fe5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Testament of Mary", + "price": 52.67, + "rating": 4.0, + "url": "https://books.toscrape.com/the-testament-of-mary_765/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/83/05/8305154438c91a02cefacf4ec8b53393.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Star-Touched Queen", + "price": 46.02, + "rating": 5.0, + "url": "https://books.toscrape.com/the-star-touched-queen_764/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/53/5e/535e2be0b423797c2cdc7d98882c820a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Songs of the Gods", + "price": 44.48, + "rating": 5.0, + "url": "https://books.toscrape.com/the-songs-of-the-gods_763/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6c/a3/6ca34db7c01e554ad17bd3be74b561e3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Song of Achilles", + "price": 37.4, + "rating": 5.0, + "url": "https://books.toscrape.com/the-song-of-achilles_762/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/66/f7/66f79b76d6c6b64fcc8110515c454e09.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Rosie Project (Don Tillman #1)", + "price": 54.04, + "rating": 1.0, + "url": "https://books.toscrape.com/the-rosie-project-don-tillman-1_761/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f0/db/f0db1cf76d45f0522d4c8c3c39aa0dd8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Power of Habit: Why We Do What We Do in Life and Business", + "price": 16.88, + "rating": 3.0, + "url": "https://books.toscrape.com/the-power-of-habit-why-we-do-what-we-do-in-life-and-business_760/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/52/df/52dfc44f48cf29e7a9e305bcb63e1899.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Marriage of Opposites", + "price": 28.08, + "rating": 4.0, + "url": "https://books.toscrape.com/the-marriage-of-opposites_759/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0f/c2/0fc21ec3489cb23116778ee84f425eca.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Lucifer Effect: Understanding How Good People Turn Evil", + "price": 10.4, + "rating": 1.0, + "url": "https://books.toscrape.com/the-lucifer-effect-understanding-how-good-people-turn-evil_758/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a6/c8/a6c8256b123493472591c5855c7de704.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Long Haul (Diary of a Wimpy Kid #9)", + "price": 44.07, + "rating": 1.0, + "url": "https://books.toscrape.com/the-long-haul-diary-of-a-wimpy-kid-9_757/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/46/bd/46bdee520b8136972262fd040533772d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Loney", + "price": 23.4, + "rating": 1.0, + "url": "https://books.toscrape.com/the-loney_756/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6d/10/6d10387a0175701d4ff456a0c7eee67b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Literature Book (Big Ideas Simply Explained)", + "price": 17.43, + "rating": 3.0, + "url": "https://books.toscrape.com/the-literature-book-big-ideas-simply-explained_755/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9e/ea/9eea51ac4a15d18aa976be459da30c47.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Last Mile (Amos Decker #2)", + "price": 54.21, + "rating": 2.0, + "url": "https://books.toscrape.com/the-last-mile-amos-decker-2_754/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/37/f1/37f118b4a56d866e1e8b563759d6966c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Immortal Life of Henrietta Lacks", + "price": 40.67, + "rating": 2.0, + "url": "https://books.toscrape.com/the-immortal-life-of-henrietta-lacks_753/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/94/ac/94ac87da7b40853013093f08356efa3b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Hidden Oracle (The Trials of Apollo #1)", + "price": 52.26, + "rating": 2.0, + "url": "https://books.toscrape.com/the-hidden-oracle-the-trials-of-apollo-1_752/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b4/67/b467a4f01ca6ae8464b9425a156c7c32.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Help Yourself Cookbook for Kids: 60 Easy Plant-Based Recipes Kids Can Make to Stay Healthy and Save the Earth", + "price": 28.77, + "rating": 3.0, + "url": "https://books.toscrape.com/the-help-yourself-cookbook-for-kids-60-easy-plant-based-recipes-kids-can-make-to-stay-healthy-and-save-the-earth_751/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c4/dc/c4dcec6f513eaca3f0f3c748d834c46d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Guilty (Will Robie #4)", + "price": 13.82, + "rating": 2.0, + "url": "https://books.toscrape.com/the-guilty-will-robie-4_750/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/76/de/76deee06ffe45e646c0113af01f4f401.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The First Hostage (J.B. Collins #2)", + "price": 25.85, + "rating": 3.0, + "url": "https://books.toscrape.com/the-first-hostage-jb-collins-2_749/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/38/34/3834572e651cdc14b18d348fa4875aa9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Dovekeepers", + "price": 48.78, + "rating": 1.0, + "url": "https://books.toscrape.com/the-dovekeepers_748/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8f/3f/8f3f4d67e30a8129577ccc4664998345.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Darkest Lie", + "price": 35.35, + "rating": 5.0, + "url": "https://books.toscrape.com/the-darkest-lie_747/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1d/3c/1d3c05b772ab846c111970232360d2c5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Bane Chronicles (The Bane Chronicles #1-11)", + "price": 44.73, + "rating": 4.0, + "url": "https://books.toscrape.com/the-bane-chronicles-the-bane-chronicles-1-11_746/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9a/33/9a333c4a06ce187c5c9d2f5969ddcac2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Bad-Ass Librarians of Timbuktu: And Their Race to Save the World’s Most Precious Manuscripts", + "price": 15.77, + "rating": 1.0, + "url": "https://books.toscrape.com/the-bad-ass-librarians-of-timbuktu-and-their-race-to-save-the-worlds-most-precious-manuscripts_745/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/88/90/8890073a9c9e3bb696f6baa84fb4dd95.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The 14th Colony (Cotton Malone #11)", + "price": 39.24, + "rating": 1.0, + "url": "https://books.toscrape.com/the-14th-colony-cotton-malone-11_744/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d9/1a/d91aae72af6c1cb2c63163acabe7895c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "That Darkness (Gardiner and Renner #1)", + "price": 13.92, + "rating": 1.0, + "url": "https://books.toscrape.com/that-darkness-gardiner-and-renner-1_743/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/44/9e/449ed681142bc336646abee754e96639.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Tastes Like Fear (DI Marnie Rome #3)", + "price": 10.69, + "rating": 1.0, + "url": "https://books.toscrape.com/tastes-like-fear-di-marnie-rome-3_742/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3c/91/3c91d97266bd6dda322089695fb46daf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Take Me with You", + "price": 45.21, + "rating": 3.0, + "url": "https://books.toscrape.com/take-me-with-you_741/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d8/a4/d8a44eda7cbe7bd1207f868e9adc06f3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Swell: A Year of Waves", + "price": 45.58, + "rating": 1.0, + "url": "https://books.toscrape.com/swell-a-year-of-waves_740/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/10/28/1028b2cf417e49dc1c14609e437a98e0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Superman Vol. 1: Before Truth (Superman by Gene Luen Yang #1)", + "price": 11.89, + "rating": 5.0, + "url": "https://books.toscrape.com/superman-vol-1-before-truth-superman-by-gene-luen-yang-1_739/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7e/c0/7ec0e9ca6153a23b2024b7df7407ee84.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Still Life with Bread Crumbs", + "price": 26.41, + "rating": 3.0, + "url": "https://books.toscrape.com/still-life-with-bread-crumbs_738/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8e/c7/8ec7f310b74ddd7ec3c859e9b0da7389.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Steve Jobs", + "price": 39.5, + "rating": 5.0, + "url": "https://books.toscrape.com/steve-jobs_737/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/86/31/86313c225719ac946894d780c4ff0839.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Sorting the Beef from the Bull: The Science of Food Fraud Forensics", + "price": 44.74, + "rating": 4.0, + "url": "https://books.toscrape.com/sorting-the-beef-from-the-bull-the-science-of-food-fraud-forensics_736/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/68/ca/68caaf9ac41964d5167a3eb67c638393.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Someone Like You (The Harrisons #2)", + "price": 52.79, + "rating": 5.0, + "url": "https://books.toscrape.com/someone-like-you-the-harrisons-2_735/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e3/d0/e3d05227f3fc24f0e0c84ccebe108fb0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "So Cute It Hurts!!, Vol. 6 (So Cute It Hurts!! #6)", + "price": 35.43, + "rating": 4.0, + "url": "https://books.toscrape.com/so-cute-it-hurts-vol-6-so-cute-it-hurts-6_734/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b2/48/b2484d13793ff1c4271a3d4023d4d24e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Shtum", + "price": 55.84, + "rating": 4.0, + "url": "https://books.toscrape.com/shtum_733/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/03/16/0316bb6f4785ac69c0643109201bad5d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "See America: A Celebration of Our National Parks \u0026 Treasured Sites", + "price": 48.87, + "rating": 3.0, + "url": "https://books.toscrape.com/see-america-a-celebration-of-our-national-parks-treasured-sites_732/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9a/7e/9a7e63f12829df4b43b31d110bf3dc2e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "salt.", + "price": 46.78, + "rating": 4.0, + "url": "https://books.toscrape.com/salt_731/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3f/41/3f4160ada0b16e3c64cd2d0dffe781c8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Robin War", + "price": 47.82, + "rating": 3.0, + "url": "https://books.toscrape.com/robin-war_730/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/45/1d/451d3543022242b8b245793e6b5c26bb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Red Hood/Arsenal, Vol. 1: Open for Business (Red Hood/Arsenal #1)", + "price": 25.48, + "rating": 2.0, + "url": "https://books.toscrape.com/red-hoodarsenal-vol-1-open-for-business-red-hoodarsenal-1_729/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/da/78/da78757466c3b0a2c89f0ddf6b5e642f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Rain Fish", + "price": 23.57, + "rating": 3.0, + "url": "https://books.toscrape.com/rain-fish_728/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bb/e2/bbe26db72b8a32117bfe4981b7cc8147.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Quarter Life Poetry: Poems for the Young, Broke and Hangry", + "price": 50.89, + "rating": 5.0, + "url": "https://books.toscrape.com/quarter-life-poetry-poems-for-the-young-broke-and-hangry_727/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c8/f2/c8f297fab080ddd02b3ed5c17b83af85.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Pet Sematary", + "price": 10.56, + "rating": 3.0, + "url": "https://books.toscrape.com/pet-sematary_726/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7a/72/7a72465b21dbf998323e37b31f9a3f4a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Overload: How to Unplug, Unwind, and Unleash Yourself from the Pressure of Stress", + "price": 52.15, + "rating": 3.0, + "url": "https://books.toscrape.com/overload-how-to-unplug-unwind-and-unleash-yourself-from-the-pressure-of-stress_725/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9c/da/9cda4893c7fce0c1c8eaa34fb092aa04.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Once Was a Time", + "price": 18.28, + "rating": 2.0, + "url": "https://books.toscrape.com/once-was-a-time_724/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/97/12/971212afa8e4ff49d92f678bc889d8b7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Old School (Diary of a Wimpy Kid #10)", + "price": 11.83, + "rating": 5.0, + "url": "https://books.toscrape.com/old-school-diary-of-a-wimpy-kid-10_723/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/df/5d/df5d172abe87deda6d533e3e908d27d8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "No Dream Is Too High: Life Lessons From a Man Who Walked on the Moon", + "price": 21.95, + "rating": 2.0, + "url": "https://books.toscrape.com/no-dream-is-too-high-life-lessons-from-a-man-who-walked-on-the-moon_722/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b5/6f/b56ff04effb66fe701a22abd4a7f1667.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Naruto (3-in-1 Edition), Vol. 14: Includes Vols. 40, 41 \u0026 42 (Naruto: Omnibus #14)", + "price": 38.39, + "rating": 2.0, + "url": "https://books.toscrape.com/naruto-3-in-1-edition-vol-14-includes-vols-40-41-42-naruto-omnibus-14_721/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c8/22/c822360ce0f91c40f7a0491c22287646.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "My Name Is Lucy Barton", + "price": 41.56, + "rating": 1.0, + "url": "https://books.toscrape.com/my-name-is-lucy-barton_720/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ca/b1/cab150e556b5fab663a9fec00ed97943.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "My Mrs. Brown", + "price": 24.48, + "rating": 3.0, + "url": "https://books.toscrape.com/my-mrs-brown_719/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e0/79/e07906c1e507055da9a2260a74f58273.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "My Kind of Crazy", + "price": 40.36, + "rating": 1.0, + "url": "https://books.toscrape.com/my-kind-of-crazy_718/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/46/6e/466e9636819aad1126ac6cefb5313ba8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Mr. Mercedes (Bill Hodges Trilogy #1)", + "price": 28.9, + "rating": 1.0, + "url": "https://books.toscrape.com/mr-mercedes-bill-hodges-trilogy-1_717/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a7/f0/a7f092a7b79f848df0226f808fed489b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "More Than Music (Chasing the Dream #1)", + "price": 37.61, + "rating": 2.0, + "url": "https://books.toscrape.com/more-than-music-chasing-the-dream-1_716/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3f/e7/3fe7073a5caac81929524d2d9488f928.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Made to Stick: Why Some Ideas Survive and Others Die", + "price": 38.85, + "rating": 5.0, + "url": "https://books.toscrape.com/made-to-stick-why-some-ideas-survive-and-others-die_715/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e2/2e/e22e4a82d97f9f0689d5295a98f5dcff.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Luis Paints the World", + "price": 53.95, + "rating": 3.0, + "url": "https://books.toscrape.com/luis-paints-the-world_714/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/85/e7/85e75d5a9309da5807c82decf3d90263.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Luckiest Girl Alive", + "price": 49.83, + "rating": 3.0, + "url": "https://books.toscrape.com/luckiest-girl-alive_713/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/81/c0/81c0a1ce03db82568e2496db945a8227.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Lowriders to the Center of the Earth (Lowriders in Space #2)", + "price": 51.51, + "rating": 2.0, + "url": "https://books.toscrape.com/lowriders-to-the-center-of-the-earth-lowriders-in-space-2_712/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b2/97/b2978e96069dd91785e5ab0bc99c022e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Love Is a Mix Tape (Music #1)", + "price": 18.03, + "rating": 1.0, + "url": "https://books.toscrape.com/love-is-a-mix-tape-music-1_711/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a2/6d/a26d8449abb3381e09126eda5f4e8151.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Looking for Lovely: Collecting the Moments that Matter", + "price": 29.14, + "rating": 5.0, + "url": "https://books.toscrape.com/looking-for-lovely-collecting-the-moments-that-matter_710/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/1e/611e1804ad968e309a5f788d4ebc1cb4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Living Leadership by Insight: A Good Leader Achieves, a Great Leader Builds Monuments", + "price": 46.91, + "rating": 4.0, + "url": "https://books.toscrape.com/living-leadership-by-insight-a-good-leader-achieves-a-great-leader-builds-monuments_709/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e9/5e/e95e82f09681709bb0f927341dda274e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Let It Out: A Journey Through Journaling", + "price": 26.79, + "rating": 5.0, + "url": "https://books.toscrape.com/let-it-out-a-journey-through-journaling_708/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/51/fc/51fcd3e9384894e6a53a753d2ab856ee.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Lady Midnight (The Dark Artifices #1)", + "price": 16.28, + "rating": 5.0, + "url": "https://books.toscrape.com/lady-midnight-the-dark-artifices-1_707/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/89/a6/89a61d48e93bc92537c0a2cb2c0094bb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "It\u0027s All Easy: Healthy, Delicious Weeknight Meals in under 30 Minutes", + "price": 19.55, + "rating": 1.0, + "url": "https://books.toscrape.com/its-all-easy-healthy-delicious-weeknight-meals-in-under-30-minutes_706/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fe/67/fe67c381d6a0c4c00a7c191d16939554.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Island of Dragons (Unwanteds #7)", + "price": 29.65, + "rating": 1.0, + "url": "https://books.toscrape.com/island-of-dragons-unwanteds-7_705/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/75/b9/75b99691594fde72ccb1831624cfeff6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "I Know What I\u0027m Doing -- and Other Lies I Tell Myself: Dispatches from a Life Under Construction", + "price": 25.98, + "rating": 4.0, + "url": "https://books.toscrape.com/i-know-what-im-doing-and-other-lies-i-tell-myself-dispatches-from-a-life-under-construction_704/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ea/7b/ea7bcac4b27a5bf6d4f8125bb7af3361.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "I Am Pilgrim (Pilgrim #1)", + "price": 10.6, + "rating": 4.0, + "url": "https://books.toscrape.com/i-am-pilgrim-pilgrim-1_703/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ed/07/ed07c9e7c53d4f33a6eb7d41eb0e6d4a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Hyperbole and a Half: Unfortunate Situations, Flawed Coping Mechanisms, Mayhem, and Other Things That Happened", + "price": 14.75, + "rating": 5.0, + "url": "https://books.toscrape.com/hyperbole-and-a-half-unfortunate-situations-flawed-coping-mechanisms-mayhem-and-other-things-that-happened_702/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b5/a9/b5a90d1c36a96513942f006345ace3d2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Hush, Hush (Hush, Hush #1)", + "price": 47.02, + "rating": 3.0, + "url": "https://books.toscrape.com/hush-hush-hush-hush-1_701/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2a/b9/2ab91479fe480e964f319fa8ac6991b2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Hold Your Breath (Search and Rescue #1)", + "price": 28.82, + "rating": 1.0, + "url": "https://books.toscrape.com/hold-your-breath-search-and-rescue-1_700/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/89/0b89c3b317d0f89da48356a0b5959c1e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Hamilton: The Revolution", + "price": 58.79, + "rating": 3.0, + "url": "https://books.toscrape.com/hamilton-the-revolution_699/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/34/ef/34ef0844cb1fbca6ab73444087fcf0e6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Greek Mythic History", + "price": 10.23, + "rating": 5.0, + "url": "https://books.toscrape.com/greek-mythic-history_698/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/36/cf/36cf56c7bdf35aadbcc6f05a8e8d8fcb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "God: The Most Unpleasant Character in All Fiction", + "price": 30.03, + "rating": 5.0, + "url": "https://books.toscrape.com/god-the-most-unpleasant-character-in-all-fiction_697/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1f/db/1fdb125bcb8cee71f3404b4dc293348c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Glory over Everything: Beyond The Kitchen House", + "price": 45.84, + "rating": 3.0, + "url": "https://books.toscrape.com/glory-over-everything-beyond-the-kitchen-house_696/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/96/41/964194a317f8ce5ed031bf4c9ceb43ab.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Feathers: Displays of Brilliant Plumage", + "price": 49.05, + "rating": 3.0, + "url": "https://books.toscrape.com/feathers-displays-of-brilliant-plumage_695/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f2/ee/f2ee668cf593ff13a9560c2801e9c2a2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Far \u0026 Away: Places on the Brink of Change: Seven Continents, Twenty-Five Years", + "price": 15.06, + "rating": 4.0, + "url": "https://books.toscrape.com/far-away-places-on-the-brink-of-change-seven-continents-twenty-five-years_694/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/11/e2/11e227bdb5fe8b43dcc2366a157a47c2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Every Last Word", + "price": 46.47, + "rating": 3.0, + "url": "https://books.toscrape.com/every-last-word_693/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/92/e7/92e7f0a8ca38964fea93e911aefbf6c9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Eligible (The Austen Project #4)", + "price": 27.09, + "rating": 3.0, + "url": "https://books.toscrape.com/eligible-the-austen-project-4_692/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/26/3b/263bf5d128bf18553ea8da8bb19e9a0c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "El Deafo", + "price": 57.62, + "rating": 5.0, + "url": "https://books.toscrape.com/el-deafo_691/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/34/eb/34eb0f1b570d4f1f6ad106652f1ac6ff.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Eight Hundred Grapes", + "price": 14.39, + "rating": 4.0, + "url": "https://books.toscrape.com/eight-hundred-grapes_690/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8c/01/8c011092f05791961d25ec3cfcf0a832.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Eaternity: More than 150 Deliciously Easy Vegan Recipes for a Long, Healthy, Satisfied, Joyful Life", + "price": 51.75, + "rating": 5.0, + "url": "https://books.toscrape.com/eaternity-more-than-150-deliciously-easy-vegan-recipes-for-a-long-healthy-satisfied-joyful-life_689/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b1/e1/b1e15eef42c0d71596f9f9ad4e9f48b0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Eat Fat, Get Thin", + "price": 54.07, + "rating": 2.0, + "url": "https://books.toscrape.com/eat-fat-get-thin_688/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/62/3f/623f8e7f7432ce744f4318aae8166ce4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Don\u0027t Get Caught", + "price": 55.35, + "rating": 1.0, + "url": "https://books.toscrape.com/dont-get-caught_687/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b2/df/b2df2ea409c5cf28538b67aff424b11f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Doctor Sleep (The Shining #2)", + "price": 40.12, + "rating": 2.0, + "url": "https://books.toscrape.com/doctor-sleep-the-shining-2_686/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/55/bf/55bfc858c1cb19867e41415532ae43c6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Demigods \u0026 Magicians: Percy and Annabeth Meet the Kanes (Percy Jackson \u0026 Kane Chronicles Crossover #1-3)", + "price": 37.51, + "rating": 5.0, + "url": "https://books.toscrape.com/demigods-magicians-percy-and-annabeth-meet-the-kanes-percy-jackson-kane-chronicles-crossover-1-3_685/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8f/80/8f8074d9f035c2a0ef8595ad89f7bcc8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Dear Mr. Knightley", + "price": 11.21, + "rating": 5.0, + "url": "https://books.toscrape.com/dear-mr-knightley_684/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/78/87/78873811f8c1d75a0c26d8cc8e6a9dbc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Daily Fantasy Sports", + "price": 36.58, + "rating": 1.0, + "url": "https://books.toscrape.com/daily-fantasy-sports_683/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/44/ff/44ff81a2ea37d3946605e205ddd538eb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Crazy Love: Overwhelmed by a Relentless God", + "price": 47.72, + "rating": 2.0, + "url": "https://books.toscrape.com/crazy-love-overwhelmed-by-a-relentless-god_682/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/03/f1/03f1e337afadba35687672b5625a9757.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Cometh the Hour (The Clifton Chronicles #6)", + "price": 25.01, + "rating": 3.0, + "url": "https://books.toscrape.com/cometh-the-hour-the-clifton-chronicles-6_681/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/55/11/5511a4296fbd484dcaa89c8a2d25965d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Code Name Verity (Code Name Verity #1)", + "price": 22.13, + "rating": 4.0, + "url": "https://books.toscrape.com/code-name-verity-code-name-verity-1_680/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f5/58/f55886d1bf600529a35e1bd932c78ca0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Clockwork Angel (The Infernal Devices #1)", + "price": 44.14, + "rating": 1.0, + "url": "https://books.toscrape.com/clockwork-angel-the-infernal-devices-1_679/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ff/0e/ff0ee0002f510112b6d7a88f53366e1d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "City of Glass (The Mortal Instruments #3)", + "price": 56.02, + "rating": 4.0, + "url": "https://books.toscrape.com/city-of-glass-the-mortal-instruments-3_678/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/00/08/0008e65aa431ed3625ad3a4352f8e90d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "City of Fallen Angels (The Mortal Instruments #4)", + "price": 11.23, + "rating": 4.0, + "url": "https://books.toscrape.com/city-of-fallen-angels-the-mortal-instruments-4_677/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c9/40/c940b6c329ecc39aaed2ab0140592a4b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "City of Bones (The Mortal Instruments #1)", + "price": 43.28, + "rating": 1.0, + "url": "https://books.toscrape.com/city-of-bones-the-mortal-instruments-1_676/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/96/af/96af4aaf25ab49b057c10b5b7eb7652c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "City of Ashes (The Mortal Instruments #2)", + "price": 47.27, + "rating": 1.0, + "url": "https://books.toscrape.com/city-of-ashes-the-mortal-instruments-2_675/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/68/da/68dab382d535305ca6025be9921df0d1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Cell", + "price": 20.29, + "rating": 4.0, + "url": "https://books.toscrape.com/cell_674/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/97/0b97282ed82b771ed328e05386a84adb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Catching Jordan (Hundred Oaks)", + "price": 50.83, + "rating": 3.0, + "url": "https://books.toscrape.com/catching-jordan-hundred-oaks_673/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ad/ac/adac97366586d261feab30bf5220756e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Carry On, Warrior: Thoughts on Life Unarmed", + "price": 31.85, + "rating": 3.0, + "url": "https://books.toscrape.com/carry-on-warrior-thoughts-on-life-unarmed_672/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/dd/f5/ddf5da673bb34a74a81faf7271c7ca13.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Carrie", + "price": 46.23, + "rating": 2.0, + "url": "https://books.toscrape.com/carrie_671/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c5/6f/c56f37eb53888765eb55f86fb7381c2f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Buying In: The Secret Dialogue Between What We Buy and Who We Are", + "price": 37.8, + "rating": 4.0, + "url": "https://books.toscrape.com/buying-in-the-secret-dialogue-between-what-we-buy-and-who-we-are_670/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f2/fa/f2faa289117546efa0b4068a07778ab0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Brain on Fire: My Month of Madness", + "price": 49.32, + "rating": 5.0, + "url": "https://books.toscrape.com/brain-on-fire-my-month-of-madness_669/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/88/aa/88aad1204951e0900906173b086e6695.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Batman: Europa", + "price": 32.01, + "rating": 2.0, + "url": "https://books.toscrape.com/batman-europa_668/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f1/fe/f1fecf0ce9b5771e4d2c9619e8550988.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Barefoot Contessa Back to Basics", + "price": 28.01, + "rating": 1.0, + "url": "https://books.toscrape.com/barefoot-contessa-back-to-basics_667/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b8/38/b838b65e0e1ac3a9b498dfb1bf004420.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Barefoot Contessa at Home: Everyday Recipes You\u0027ll Make Over and Over Again", + "price": 50.62, + "rating": 5.0, + "url": "https://books.toscrape.com/barefoot-contessa-at-home-everyday-recipes-youll-make-over-and-over-again_666/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/74/aa/74aa29b1ba4147eaf5b46671bf235861.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Balloon Animals", + "price": 17.03, + "rating": 3.0, + "url": "https://books.toscrape.com/balloon-animals_665/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6e/23/6e2324cae6335e8e98c8b46597afc9a3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Art Ops Vol. 1", + "price": 48.8, + "rating": 3.0, + "url": "https://books.toscrape.com/art-ops-vol-1_664/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/b4/0bb4c64f1522c033368df5567a349472.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Aristotle and Dante Discover the Secrets of the Universe (Aristotle and Dante Discover the Secrets of the Universe #1)", + "price": 58.14, + "rating": 4.0, + "url": "https://books.toscrape.com/aristotle-and-dante-discover-the-secrets-of-the-universe-aristotle-and-dante-discover-the-secrets-of-the-universe-1_663/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/1a/611aba0ef5b859ba1977ef30677b0194.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Angels Walking (Angels Walking #1)", + "price": 34.2, + "rating": 2.0, + "url": "https://books.toscrape.com/angels-walking-angels-walking-1_662/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/50/0e/500eeb810e940424827580574e46852c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Angels \u0026 Demons (Robert Langdon #1)", + "price": 51.48, + "rating": 3.0, + "url": "https://books.toscrape.com/angels-demons-robert-langdon-1_661/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b4/2a/b42a187c37de904f776070c57f51c756.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "All the Light We Cannot See", + "price": 29.87, + "rating": 5.0, + "url": "https://books.toscrape.com/all-the-light-we-cannot-see_660/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/c3/41c37f7f0e03ee1144dd6fa89483b5d9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Adulthood Is a Myth: A \"Sarah\u0027s Scribbles\" Collection", + "price": 10.9, + "rating": 2.0, + "url": "https://books.toscrape.com/adulthood-is-a-myth-a-sarahs-scribbles-collection_659/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a2/b9/a2b974e5a66e7502c77d2e4632abe033.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Abstract City", + "price": 56.37, + "rating": 5.0, + "url": "https://books.toscrape.com/abstract-city_658/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e7/70/e77019ebd71bcf6badb085bddf47c413.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "A Time of Torment (Charlie Parker #14)", + "price": 48.35, + "rating": 5.0, + "url": "https://books.toscrape.com/a-time-of-torment-charlie-parker-14_657/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e8/c0/e8c0ba15066bab950ae161fd60949b9a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "A Study in Scarlet (Sherlock Holmes #1)", + "price": 16.73, + "rating": 2.0, + "url": "https://books.toscrape.com/a-study-in-scarlet-sherlock-holmes-1_656/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8f/a4/8fa41d6caa10e427356b8a590eb4d96b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "A Series of Catastrophes and Miracles: A True Story of Love, Science, and Cancer", + "price": 56.48, + "rating": 2.0, + "url": "https://books.toscrape.com/a-series-of-catastrophes-and-miracles-a-true-story-of-love-science-and-cancer_655/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9b/20/9b2076ce7414103a093ce2459d089969.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "A People\u0027s History of the United States", + "price": 40.79, + "rating": 2.0, + "url": "https://books.toscrape.com/a-peoples-history-of-the-united-states_654/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/75/20/75200336c141156746000f7055df344a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "A Man Called Ove", + "price": 39.72, + "rating": 1.0, + "url": "https://books.toscrape.com/a-man-called-ove_653/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9c/f1/9cf1f4a47b8d08909fc092e6ae598d83.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "A Distant Mirror: The Calamitous 14th Century", + "price": 14.58, + "rating": 3.0, + "url": "https://books.toscrape.com/a-distant-mirror-the-calamitous-14th-century_652/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/d5/41d5fa6a81cdbcbe6b0b15757a4c9144.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "A Brush of Wings (Angels Walking #3)", + "price": 55.51, + "rating": 1.0, + "url": "https://books.toscrape.com/a-brush-of-wings-angels-walking-3_651/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4d/16/4d163d43cb4aa624e599330a39abace5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "1491: New Revelations of the Americas Before Columbus", + "price": 21.8, + "rating": 3.0, + "url": "https://books.toscrape.com/1491-new-revelations-of-the-americas-before-columbus_650/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/88/75/8875f384ce9103281b7f6e86a2b8204d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Three Searches, Meaning, and the Story", + "price": 13.33, + "rating": 3.0, + "url": "https://books.toscrape.com/the-three-searches-meaning-and-the-story_649/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/83/35/8335b71599b5a257a56cfabdd79080a4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Searching for Meaning in Gailana", + "price": 38.73, + "rating": 1.0, + "url": "https://books.toscrape.com/searching-for-meaning-in-gailana_648/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3b/04/3b045fe0394dc192950a0ec9e3812fe4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Rook", + "price": 37.86, + "rating": 4.0, + "url": "https://books.toscrape.com/rook_647/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/55/33/5533595a623c3bb947c4a5171fc2df08.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "My Kitchen Year: 136 Recipes That Saved My Life", + "price": 11.53, + "rating": 2.0, + "url": "https://books.toscrape.com/my-kitchen-year-136-recipes-that-saved-my-life_646/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/76/a1/76a1516c8d9c3e620626f30840013a85.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "13 Hours: The Inside Account of What Really Happened In Benghazi", + "price": 27.06, + "rating": 1.0, + "url": "https://books.toscrape.com/13-hours-the-inside-account-of-what-really-happened-in-benghazi_645/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/15/f7/15f78e0b04feb9b94e88865803cb5e9e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Will You Won\u0027t You Want Me?", + "price": 13.86, + "rating": 3.0, + "url": "https://books.toscrape.com/will-you-wont-you-want-me_644/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/16/e3/16e3ca741956485119251e7442a67e2e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Tipping Point for Planet Earth: How Close Are We to the Edge?", + "price": 37.55, + "rating": 1.0, + "url": "https://books.toscrape.com/tipping-point-for-planet-earth-how-close-are-we-to-the-edge_643/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/56/97/5697f2f8f628129df01c5790985ffd9b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Star-Touched Queen", + "price": 32.3, + "rating": 5.0, + "url": "https://books.toscrape.com/the-star-touched-queen_642/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d3/0d/d30dd8b6be6f9fcfd17178e8083238b6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Silent Sister (Riley MacPherson #1)", + "price": 46.29, + "rating": 5.0, + "url": "https://books.toscrape.com/the-silent-sister-riley-macpherson-1_641/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/30/2c/302cd9c84442e139145ec0993880d7e0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Midnight Watch: A Novel of the Titanic and the Californian", + "price": 26.2, + "rating": 1.0, + "url": "https://books.toscrape.com/the-midnight-watch-a-novel-of-the-titanic-and-the-californian_640/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/97/3a/973a2c3462a18fc90d3b9662d959df37.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Lonely City: Adventures in the Art of Being Alone", + "price": 33.26, + "rating": 2.0, + "url": "https://books.toscrape.com/the-lonely-city-adventures-in-the-art-of-being-alone_639/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5c/5e/5c5e527fea6b17199773bb175b515aee.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Gray Rhino: How to Recognize and Act on the Obvious Dangers We Ignore", + "price": 59.15, + "rating": 4.0, + "url": "https://books.toscrape.com/the-gray-rhino-how-to-recognize-and-act-on-the-obvious-dangers-we-ignore_638/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9f/25/9f255826f354776dda9afbd5576a7add.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Golden Condom: And Other Essays on Love Lost and Found", + "price": 39.43, + "rating": 1.0, + "url": "https://books.toscrape.com/the-golden-condom-and-other-essays-on-love-lost-and-found_637/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/dc/4d/dc4d070e33813a07a4e02f069e6d482f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Epidemic (The Program 0.6)", + "price": 14.44, + "rating": 5.0, + "url": "https://books.toscrape.com/the-epidemic-the-program-06_636/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/87/cd/87cd652c35e2a78535c83becae33cff2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Dinner Party", + "price": 56.54, + "rating": 2.0, + "url": "https://books.toscrape.com/the-dinner-party_635/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ba/76/ba761d23c5c0e5a0638e04739c69c5d0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Diary of a Young Girl", + "price": 59.9, + "rating": 3.0, + "url": "https://books.toscrape.com/the-diary-of-a-young-girl_634/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/83/d5/83d5526864a108d27fd4b03dd31ec18b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Children", + "price": 11.88, + "rating": 3.0, + "url": "https://books.toscrape.com/the-children_633/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d8/03/d803ab341d3020a3bb280d6135e4ae65.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Stars Above (The Lunar Chronicles #4.5)", + "price": 48.05, + "rating": 2.0, + "url": "https://books.toscrape.com/stars-above-the-lunar-chronicles-45_632/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fd/5b/fd5b14399052ab552e240ed18ab03c6d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Snatched: How A Drug Queen Went Undercover for the DEA and Was Kidnapped By Colombian Guerillas", + "price": 21.21, + "rating": 3.0, + "url": "https://books.toscrape.com/snatched-how-a-drug-queen-went-undercover-for-the-dea-and-was-kidnapped-by-colombian-guerillas_631/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2a/f3/2af39796852729270fb23e05a662a42c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Raspberry Pi Electronics Projects for the Evil Genius", + "price": 49.67, + "rating": 4.0, + "url": "https://books.toscrape.com/raspberry-pi-electronics-projects-for-the-evil-genius_630/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a2/da/a2da8957b9cb8265d7f1dfeb0651f1c7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Quench Your Own Thirst: Business Lessons Learned Over a Beer or Two", + "price": 43.14, + "rating": 1.0, + "url": "https://books.toscrape.com/quench-your-own-thirst-business-lessons-learned-over-a-beer-or-two_629/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2d/fd/2dfdc52bcdbd82dee50372bc46c83e15.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Psycho: Sanitarium (Psycho #1.5)", + "price": 36.97, + "rating": 5.0, + "url": "https://books.toscrape.com/psycho-sanitarium-psycho-15_628/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/02/5c/025c30a378e2a4190e84f1429e81b803.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Poisonous (Max Revere Novels #3)", + "price": 26.8, + "rating": 3.0, + "url": "https://books.toscrape.com/poisonous-max-revere-novels-3_627/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/23/52/2352718971d5e166fa9541a5a7d716fa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "One with You (Crossfire #5)", + "price": 15.71, + "rating": 4.0, + "url": "https://books.toscrape.com/one-with-you-crossfire-5_626/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b8/29/b829181ae95c8f020c1ad3273192de30.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "No Love Allowed (Dodge Cove #1)", + "price": 54.65, + "rating": 4.0, + "url": "https://books.toscrape.com/no-love-allowed-dodge-cove-1_625/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/70/3e/703e053877204a396ec6e7beac863118.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Murder at the 42nd Street Library (Raymond Ambler #1)", + "price": 54.36, + "rating": 4.0, + "url": "https://books.toscrape.com/murder-at-the-42nd-street-library-raymond-ambler-1_624/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c3/8d/c38d65cd155b67ca025f0655bd1bb095.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Most Wanted", + "price": 35.28, + "rating": 3.0, + "url": "https://books.toscrape.com/most-wanted_623/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8b/bc/8bbc5ab4c3784b4d9b93eb0fd1fb6fd6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Love, Lies and Spies", + "price": 20.55, + "rating": 2.0, + "url": "https://books.toscrape.com/love-lies-and-spies_622/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7a/22/7a224a6e174af91950e9b124afe54e0e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "How to Speak Golf: An Illustrated Guide to Links Lingo", + "price": 58.32, + "rating": 5.0, + "url": "https://books.toscrape.com/how-to-speak-golf-an-illustrated-guide-to-links-lingo_621/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d2/64/d264ad1af882ce391005dc7215ac90e7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Hide Away (Eve Duncan #20)", + "price": 11.84, + "rating": 1.0, + "url": "https://books.toscrape.com/hide-away-eve-duncan-20_620/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/57/07/5707c3d5d4fd44d943d51730ba7d429a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Furiously Happy: A Funny Book About Horrible Things", + "price": 41.46, + "rating": 4.0, + "url": "https://books.toscrape.com/furiously-happy-a-funny-book-about-horrible-things_619/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ab/2a/ab2ae4f02aa46271b4bfc77494039fc6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Everyday Italian: 125 Simple and Delicious Recipes", + "price": 20.1, + "rating": 5.0, + "url": "https://books.toscrape.com/everyday-italian-125-simple-and-delicious-recipes_618/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5a/64/5a6499d41ccaad4c4f7eeaa90e16345a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Equal Is Unfair: America\u0027s Misguided Fight Against Income Inequality", + "price": 56.86, + "rating": 1.0, + "url": "https://books.toscrape.com/equal-is-unfair-americas-misguided-fight-against-income-inequality_617/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/00/11/001153d2a22d889837efac1703e10a5e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Eleanor \u0026 Park", + "price": 56.51, + "rating": 5.0, + "url": "https://books.toscrape.com/eleanor-park_616/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ed/d7/edd781d3c9d63a395f80f241445e88fa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Dirty (Dive Bar #1)", + "price": 40.83, + "rating": 4.0, + "url": "https://books.toscrape.com/dirty-dive-bar-1_615/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/90/ae903f6f6d059954be4e85497dd76bf5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Can You Keep a Secret? (Fear Street Relaunch #4)", + "price": 48.64, + "rating": 1.0, + "url": "https://books.toscrape.com/can-you-keep-a-secret-fear-street-relaunch-4_614/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/2f/0b2f432cc27132f688fcdf29618521e0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Boar Island (Anna Pigeon #19)", + "price": 59.48, + "rating": 3.0, + "url": "https://books.toscrape.com/boar-island-anna-pigeon-19_613/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d5/81/d58157866ea8f015a8e4c55b23b8c96f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "A Paris Apartment", + "price": 39.01, + "rating": 4.0, + "url": "https://books.toscrape.com/a-paris-apartment_612/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/16/57/16575316618bd7e922d5b0e0f87de2ca.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "A la Mode: 120 Recipes in 60 Pairings: Pies, Tarts, Cakes, Crisps, and More Topped with Ice Cream, Gelato, Frozen Custard, and More", + "price": 38.77, + "rating": 1.0, + "url": "https://books.toscrape.com/a-la-mode-120-recipes-in-60-pairings-pies-tarts-cakes-crisps-and-more-topped-with-ice-cream-gelato-frozen-custard-and-more_611/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/98/19/9819ff3a8290dc6ab8797d00de5ec554.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Troublemaker: Surviving Hollywood and Scientology", + "price": 48.39, + "rating": 2.0, + "url": "https://books.toscrape.com/troublemaker-surviving-hollywood-and-scientology_610/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/77/82/778285b3c87d6d5d98003aa0f2f65933.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Widow", + "price": 27.26, + "rating": 2.0, + "url": "https://books.toscrape.com/the-widow_609/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fd/71/fd71fb07247bf911505a351c0670c6dc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Sleep Revolution: Transforming Your Life, One Night at a Time", + "price": 11.68, + "rating": 4.0, + "url": "https://books.toscrape.com/the-sleep-revolution-transforming-your-life-one-night-at-a-time_608/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3d/c5/3dc5455313710cf7055c060114e25bf0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Improbability of Love", + "price": 59.45, + "rating": 1.0, + "url": "https://books.toscrape.com/the-improbability-of-love_607/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/49/06493269f6893cfd24b650f66df51882.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Art of Startup Fundraising", + "price": 21.0, + "rating": 3.0, + "url": "https://books.toscrape.com/the-art-of-startup-fundraising_606/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b3/7b/b37be83183f1dcb759d92bda8f8998a4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Take Me Home Tonight (Rock Star Romance #3)", + "price": 53.98, + "rating": 3.0, + "url": "https://books.toscrape.com/take-me-home-tonight-rock-star-romance-3_605/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a6/4b/a64b3c559f59748bfdbbe75be3e16075.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Sleeping Giants (Themis Files #1)", + "price": 48.74, + "rating": 1.0, + "url": "https://books.toscrape.com/sleeping-giants-themis-files-1_604/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c0/72/c072c1ef144d571abd25fe9cc18cceba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Setting the World on Fire: The Brief, Astonishing Life of St. Catherine of Siena", + "price": 21.15, + "rating": 2.0, + "url": "https://books.toscrape.com/setting-the-world-on-fire-the-brief-astonishing-life-of-st-catherine-of-siena_603/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8b/c4/8bc43a6b42d0283ab4bf611f1b497126.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Playing with Fire", + "price": 13.71, + "rating": 3.0, + "url": "https://books.toscrape.com/playing-with-fire_602/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/90/0b/900bd2e60d56b6480a4e8eb2dddb46d6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Off the Hook (Fishing for Trouble #1)", + "price": 47.67, + "rating": 3.0, + "url": "https://books.toscrape.com/off-the-hook-fishing-for-trouble-1_601/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1d/78/1d78fe226e1adb9cb591fa21f8a9bf68.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Mothering Sunday", + "price": 13.34, + "rating": 2.0, + "url": "https://books.toscrape.com/mothering-sunday_600/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a8/84/a8843a3fe1a40d5c7df60bbb8cd76ecd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Mother, Can You Not?", + "price": 16.89, + "rating": 5.0, + "url": "https://books.toscrape.com/mother-can-you-not_599/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/03/ae03f5d4d4c2ee038ac4c4ce9b71e592.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "M Train", + "price": 27.18, + "rating": 1.0, + "url": "https://books.toscrape.com/m-train_598/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d6/e8/d6e8258cee98f80727e99f7ac5aa1b88.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Lilac Girls", + "price": 17.28, + "rating": 2.0, + "url": "https://books.toscrape.com/lilac-girls_597/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6c/2e/6c2e764e3ea89859b52df8de4f12af7a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Lies and Other Acts of Love", + "price": 45.14, + "rating": 1.0, + "url": "https://books.toscrape.com/lies-and-other-acts-of-love_596/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/29/88/2988f5fb3dfd95214dba2ecb2d496c94.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Lab Girl", + "price": 40.85, + "rating": 1.0, + "url": "https://books.toscrape.com/lab-girl_595/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e9/72/e972f8b4abaaa6f8f449479cd9d87be3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Keep Me Posted", + "price": 20.46, + "rating": 4.0, + "url": "https://books.toscrape.com/keep-me-posted_594/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/ac/aeac003461b89c7ef826251d940b2afc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "It Didn\u0027t Start with You: How Inherited Family Trauma Shapes Who We Are and How to End the Cycle", + "price": 56.27, + "rating": 3.0, + "url": "https://books.toscrape.com/it-didnt-start-with-you-how-inherited-family-trauma-shapes-who-we-are-and-how-to-end-the-cycle_593/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/a9/eea9e831f8964b4dc0190c84a1f9a1f6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Grey (Fifty Shades #4)", + "price": 48.49, + "rating": 4.0, + "url": "https://books.toscrape.com/grey-fifty-shades-4_592/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bb/ee/bbeeab4c4ce572c0e9764e3a96c6d4a5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Exit, Pursued by a Bear", + "price": 51.34, + "rating": 4.0, + "url": "https://books.toscrape.com/exit-pursued-by-a-bear_591/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ca/99/ca99bafb2a75d4fadb8d64efed26316f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Daredevils", + "price": 16.34, + "rating": 3.0, + "url": "https://books.toscrape.com/daredevils_590/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/31/71/31715c5e3b53bf1e2f41e394f024a8c4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Cravings: Recipes for What You Want to Eat", + "price": 20.5, + "rating": 3.0, + "url": "https://books.toscrape.com/cravings-recipes-for-what-you-want-to-eat_589/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/5c/ae5ca435fb095e374d2c2aa9f7b6f380.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Born for This: How to Find the Work You Were Meant to Do", + "price": 21.59, + "rating": 5.0, + "url": "https://books.toscrape.com/born-for-this-how-to-find-the-work-you-were-meant-to-do_588/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/aa/67/aa677a97ecdcbbde7471f1c90ed0cf6f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Arena", + "price": 21.36, + "rating": 4.0, + "url": "https://books.toscrape.com/arena_587/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/51/88/518810d182843244a404f2a2a614a93b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Adultery", + "price": 20.88, + "rating": 5.0, + "url": "https://books.toscrape.com/adultery_586/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/79/d9/79d99cfa5557be0643ba00bfcd35256b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "A Mother\u0027s Reckoning: Living in the Aftermath of Tragedy", + "price": 19.53, + "rating": 3.0, + "url": "https://books.toscrape.com/a-mothers-reckoning-living-in-the-aftermath-of-tragedy_585/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/28/58/285861a80930ffa7521dcb8bd19656e9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "A Gentleman\u0027s Position (Society of Gentlemen #3)", + "price": 14.75, + "rating": 5.0, + "url": "https://books.toscrape.com/a-gentlemans-position-society-of-gentlemen-3_584/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f0/e0/f0e0db3edcb14293a52b51929cc72979.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "11/22/63", + "price": 48.48, + "rating": 3.0, + "url": "https://books.toscrape.com/112263_583/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f6/c5/f6c5d27eacb123238f28a32263694d74.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "10% Happier: How I Tamed the Voice in My Head, Reduced Stress Without Losing My Edge, and Found Self-Help That Actually Works", + "price": 24.57, + "rating": 2.0, + "url": "https://books.toscrape.com/10-happier-how-i-tamed-the-voice-in-my-head-reduced-stress-without-losing-my-edge-and-found-self-help-that-actually-works_582/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/40/b2/40b246cf12df5345dc0371c040fddb4b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "10-Day Green Smoothie Cleanse: Lose Up to 15 Pounds in 10 Days!", + "price": 49.71, + "rating": 5.0, + "url": "https://books.toscrape.com/10-day-green-smoothie-cleanse-lose-up-to-15-pounds-in-10-days_581/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/23/c2/23c2108ae81327c7f3fb0721976cba5e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Without Shame", + "price": 48.27, + "rating": 5.0, + "url": "https://books.toscrape.com/without-shame_580/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/90/86/9086ca3d1d5c4059beb7dcf762926e1e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Watchmen", + "price": 58.05, + "rating": 4.0, + "url": "https://books.toscrape.com/watchmen_579/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/43/0b43137f35134bf211608d1e7197b086.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Unlimited Intuition Now", + "price": 58.87, + "rating": 4.0, + "url": "https://books.toscrape.com/unlimited-intuition-now_578/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/46/6146f9ffb87a4f82301d033aa74cc48b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Underlying Notes", + "price": 11.82, + "rating": 2.0, + "url": "https://books.toscrape.com/underlying-notes_577/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/59/ee593e57a7fb110d96f1688b0fdd9d59.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Shack", + "price": 28.03, + "rating": 1.0, + "url": "https://books.toscrape.com/the-shack_576/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/20/8b/208b77faac57115ae239391fe2a64c86.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The New Brand You: Your New Image Makes the Sale for You", + "price": 44.05, + "rating": 5.0, + "url": "https://books.toscrape.com/the-new-brand-you-your-new-image-makes-the-sale-for-you_575/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9b/33/9b33c7a5431415614f7b788e0c1552c9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Moosewood Cookbook: Recipes from Moosewood Restaurant, Ithaca, New York", + "price": 12.34, + "rating": 4.0, + "url": "https://books.toscrape.com/the-moosewood-cookbook-recipes-from-moosewood-restaurant-ithaca-new-york_574/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d4/53/d453cfb6c08dbf76d200ffa858bc9979.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Flowers Lied", + "price": 16.68, + "rating": 2.0, + "url": "https://books.toscrape.com/the-flowers-lied_573/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a9/f0/a9f00f8505431e64db0f91df762a6d73.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Fabric of the Cosmos: Space, Time, and the Texture of Reality", + "price": 55.91, + "rating": 1.0, + "url": "https://books.toscrape.com/the-fabric-of-the-cosmos-space-time-and-the-texture-of-reality_572/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5e/7f/5e7f7d9913d4c95d33904770c518d537.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Book of Mormon", + "price": 24.57, + "rating": 3.0, + "url": "https://books.toscrape.com/the-book-of-mormon_571/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/83/db/83dbf86eb0fed1d99de2148eac4eb064.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Art and Science of Low Carbohydrate Living", + "price": 52.98, + "rating": 5.0, + "url": "https://books.toscrape.com/the-art-and-science-of-low-carbohydrate-living_570/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4b/d4/4bd43108fb070ad8ebba9cdb00b14069.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Alien Club", + "price": 54.4, + "rating": 1.0, + "url": "https://books.toscrape.com/the-alien-club_569/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/93/d0/93d01bc6bce58e8efbf560e9e3dc3379.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Suzie Snowflake: One beautiful flake (a self-esteem story)", + "price": 54.81, + "rating": 5.0, + "url": "https://books.toscrape.com/suzie-snowflake-one-beautiful-flake-a-self-esteem-story_568/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/cc/dbcc9d63b73ce9058d53f36465dbe2b2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Nap-a-Roo", + "price": 25.08, + "rating": 1.0, + "url": "https://books.toscrape.com/nap-a-roo_567/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/27/1f/271faa1d7561473974d12803feb1f0a1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "NaNo What Now? Finding your editing process, revising your NaNoWriMo book and building a writing career through publishing and beyond", + "price": 10.41, + "rating": 4.0, + "url": "https://books.toscrape.com/nano-what-now-finding-your-editing-process-revising-your-nanowrimo-book-and-building-a-writing-career-through-publishing-and-beyond_566/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f3/b9/f3b94d63844537271e86565071e5d716.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Modern Day Fables", + "price": 47.44, + "rating": 2.0, + "url": "https://books.toscrape.com/modern-day-fables_565/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/79/40/79405be1357e2576e7f4b307600be914.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "If I Gave You God\u0027s Phone Number....: Searching for Spirituality in America", + "price": 20.91, + "rating": 1.0, + "url": "https://books.toscrape.com/if-i-gave-you-gods-phone-number-searching-for-spirituality-in-america_564/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/87/fe/87fe3f7f3f62c1b1b81890578c9cf294.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Fruits Basket, Vol. 9 (Fruits Basket #9)", + "price": 33.95, + "rating": 4.0, + "url": "https://books.toscrape.com/fruits-basket-vol-9-fruits-basket-9_563/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7c/ea/7cea6ff4f6f1427739b136db35fbfad4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Dress Your Family in Corduroy and Denim", + "price": 43.68, + "rating": 3.0, + "url": "https://books.toscrape.com/dress-your-family-in-corduroy-and-denim_562/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/df/14/df1418baa09e00b877be35066084c9dc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Don\u0027t Forget Steven", + "price": 33.23, + "rating": 1.0, + "url": "https://books.toscrape.com/dont-forget-steven_561/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e7/75/e775bf9ea6343b2ee0be5166bb445bd2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Chernobyl 01:23:40: The Incredible True Story of the World\u0027s Worst Nuclear Disaster", + "price": 35.92, + "rating": 2.0, + "url": "https://books.toscrape.com/chernobyl-012340-the-incredible-true-story-of-the-worlds-worst-nuclear-disaster_560/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5e/76/5e76a5026bd17a5b484ae2a60eec0542.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Art and Fear: Observations on the Perils (and Rewards) of Artmaking", + "price": 48.63, + "rating": 4.0, + "url": "https://books.toscrape.com/art-and-fear-observations-on-the-perils-and-rewards-of-artmaking_559/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ef/80/ef80e6100214c486562a73ce76444826.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "A Shard of Ice (The Black Symphony Saga #1)", + "price": 56.63, + "rating": 3.0, + "url": "https://books.toscrape.com/a-shard-of-ice-the-black-symphony-saga-1_558/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/27/64/27649cb5da52970f4bb2fc5234a48578.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "A Hero\u0027s Curse (The Unseen Chronicles #1)", + "price": 50.49, + "rating": 3.0, + "url": "https://books.toscrape.com/a-heros-curse-the-unseen-chronicles-1_557/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/95/68/95685fabe00befa6dc91277cde703b55.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "23 Degrees South: A Tropical Tale of Changing Whether...", + "price": 35.79, + "rating": 2.0, + "url": "https://books.toscrape.com/23-degrees-south-a-tropical-tale-of-changing-whether_556/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/29/3e/293e31894cd2c5bf2aff452b8c818b66.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Zero to One: Notes on Startups, or How to Build the Future", + "price": 34.06, + "rating": 3.0, + "url": "https://books.toscrape.com/zero-to-one-notes-on-startups-or-how-to-build-the-future_555/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f4/8e/f48ee738bc992a68d08eadcb4338a547.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Why Not Me?", + "price": 17.76, + "rating": 1.0, + "url": "https://books.toscrape.com/why-not-me_554/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/31/a6/31a61c2587add91e55a85fec33e93d15.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "When Breath Becomes Air", + "price": 39.36, + "rating": 2.0, + "url": "https://books.toscrape.com/when-breath-becomes-air_553/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/39/a5/39a5f0d3280010ca400eb4f5d262b950.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel", + "price": 36.94, + "rating": 2.0, + "url": "https://books.toscrape.com/vagabonding-an-uncommon-guide-to-the-art-of-long-term-world-travel_552/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d5/bf/d5bf0090470b0b8ea46d9c166f7895aa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Unlikely Pilgrimage of Harold Fry (Harold Fry #1)", + "price": 43.62, + "rating": 5.0, + "url": "https://books.toscrape.com/the-unlikely-pilgrimage-of-harold-fry-harold-fry-1_551/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/e2/06e2e125d332e2e09a64816ff915b859.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The New Drawing on the Right Side of the Brain", + "price": 43.02, + "rating": 3.0, + "url": "https://books.toscrape.com/the-new-drawing-on-the-right-side-of-the-brain_550/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6a/55/6a55ccd4bc2383f5fe915fbef8bd5a23.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Midnight Assassin: Panic, Scandal, and the Hunt for America\u0027s First Serial Killer", + "price": 28.45, + "rating": 4.0, + "url": "https://books.toscrape.com/the-midnight-assassin-panic-scandal-and-the-hunt-for-americas-first-serial-killer_549/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/82/6c/826c590f552ce717a2972649350c8030.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Martian (The Martian #1)", + "price": 41.39, + "rating": 2.0, + "url": "https://books.toscrape.com/the-martian-the-martian-1_548/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/72/ed/72ed6908c3fcf2bccf79013a65943849.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The High Mountains of Portugal", + "price": 51.15, + "rating": 1.0, + "url": "https://books.toscrape.com/the-high-mountains-of-portugal_547/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/55/00/550091fc134bbe67f562d95a6d6313f7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Grownup", + "price": 35.88, + "rating": 1.0, + "url": "https://books.toscrape.com/the-grownup_546/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f4/cb/f4cb1f9c7280bf1fd05fe33d2816080f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The E-Myth Revisited: Why Most Small Businesses Don\u0027t Work and What to Do About It", + "price": 36.91, + "rating": 1.0, + "url": "https://books.toscrape.com/the-e-myth-revisited-why-most-small-businesses-dont-work-and-what-to-do-about-it_545/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/11/2c/112c55a6bcd401c3bd603f5ddb2e6b82.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "South of Sunshine", + "price": 28.93, + "rating": 1.0, + "url": "https://books.toscrape.com/south-of-sunshine_544/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/09/11/09118b974f3685483f3e4debd1f97c90.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Smarter Faster Better: The Secrets of Being Productive in Life and Business", + "price": 38.89, + "rating": 5.0, + "url": "https://books.toscrape.com/smarter-faster-better-the-secrets-of-being-productive-in-life-and-business_543/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/21/88/21889b1eddaec853b02a41bdd06eef54.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Silence in the Dark (Logan Point #4)", + "price": 58.33, + "rating": 3.0, + "url": "https://books.toscrape.com/silence-in-the-dark-logan-point-4_542/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bb/1c/bb1c91883579f1f99fe6ebf13b92c1c1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Shadows of the Past (Logan Point #1)", + "price": 39.67, + "rating": 5.0, + "url": "https://books.toscrape.com/shadows-of-the-past-logan-point-1_541/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/93/e0/93e0ec623673a8f83598c9aa7b6c94ec.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Roller Girl", + "price": 14.1, + "rating": 5.0, + "url": "https://books.toscrape.com/roller-girl_540/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b8/bd/b8bd3e5bc547c7c851689a844c9db429.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Rising Strong", + "price": 21.82, + "rating": 3.0, + "url": "https://books.toscrape.com/rising-strong_539/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3b/f3/3bf3c719382c03984ab9766803bed964.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Proofs of God: Classical Arguments from Tertullian to Barth", + "price": 54.21, + "rating": 1.0, + "url": "https://books.toscrape.com/proofs-of-god-classical-arguments-from-tertullian-to-barth_538/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3f/ef/3fef12d9da503693af12997c0ea0897f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Please Kill Me: The Uncensored Oral History of Punk", + "price": 31.19, + "rating": 4.0, + "url": "https://books.toscrape.com/please-kill-me-the-uncensored-oral-history-of-punk_537/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/f1/06f185c0be2ad6e2fe059464c03f1b47.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Out of Print: City Lights Spotlight No. 14", + "price": 53.64, + "rating": 5.0, + "url": "https://books.toscrape.com/out-of-print-city-lights-spotlight-no-14_536/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/93/d5/93d5c64abfad9ed6a0cb2e26f19f1a1e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "My Life Next Door (My Life Next Door )", + "price": 36.39, + "rating": 5.0, + "url": "https://books.toscrape.com/my-life-next-door-my-life-next-door_535/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/98/00/98001a78a78ab77027145ff586d64431.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Miller\u0027s Valley", + "price": 58.54, + "rating": 2.0, + "url": "https://books.toscrape.com/millers-valley_534/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/dc/1a/dc1a54201eff16a11e7d84eef5ea36c7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Man\u0027s Search for Meaning", + "price": 29.48, + "rating": 3.0, + "url": "https://books.toscrape.com/mans-search-for-meaning_533/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ed/ff/edffa2eec8d96b8ddcd53d5c2eff8453.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Love That Boy: What Two Presidents, Eight Road Trips, and My Son Taught Me About a Parent\u0027s Expectations", + "price": 25.06, + "rating": 2.0, + "url": "https://books.toscrape.com/love-that-boy-what-two-presidents-eight-road-trips-and-my-son-taught-me-about-a-parents-expectations_532/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6d/1b/6d1b236549b8d5bc9e20786a25b7e7d1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Living Forward: A Proven Plan to Stop Drifting and Get the Life You Want", + "price": 12.55, + "rating": 3.0, + "url": "https://books.toscrape.com/living-forward-a-proven-plan-to-stop-drifting-and-get-the-life-you-want_531/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c9/76/c9767187068d80827d0967225ce3925d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Les Fleurs du Mal", + "price": 29.04, + "rating": 5.0, + "url": "https://books.toscrape.com/les-fleurs-du-mal_530/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/36/5b/365b3ab7ab72a6258873716aef6d5c1a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Left Behind (Left Behind #1)", + "price": 40.72, + "rating": 2.0, + "url": "https://books.toscrape.com/left-behind-left-behind-1_529/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d7/e2/d7e27f418884548ee1b551c67bcd222c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Kill \u0027Em and Leave: Searching for James Brown and the American Soul", + "price": 45.05, + "rating": 5.0, + "url": "https://books.toscrape.com/kill-em-and-leave-searching-for-james-brown-and-the-american-soul_528/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/85/42/8542841f5644a6daf433504f1e106e97.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Kierkegaard: A Christian Missionary to Christians", + "price": 47.13, + "rating": 1.0, + "url": "https://books.toscrape.com/kierkegaard-a-christian-missionary-to-christians_527/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/05/ce/05ce699eaf78c0fae20308497c4f496a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "John Vassos: Industrial Design for Modern Life", + "price": 20.22, + "rating": 4.0, + "url": "https://books.toscrape.com/john-vassos-industrial-design-for-modern-life_526/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/85/a1/85a19d4c20a4801013e8108a166d10af.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "I\u0027ll Give You the Sun", + "price": 56.48, + "rating": 1.0, + "url": "https://books.toscrape.com/ill-give-you-the-sun_525/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/af/93/af933f86038dc55487b5bf1d81ff4bfb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "I Will Find You", + "price": 44.21, + "rating": 1.0, + "url": "https://books.toscrape.com/i-will-find-you_524/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/87/28/8728f8880e95b848021f6a9b3dcd07ca.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Hystopia: A Novel", + "price": 21.96, + "rating": 4.0, + "url": "https://books.toscrape.com/hystopia-a-novel_523/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2d/7b/2d7b77d8b45b2f8e1bc0ce20aacddad0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Howl and Other Poems", + "price": 40.45, + "rating": 2.0, + "url": "https://books.toscrape.com/howl-and-other-poems_522/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b7/29/b7293f602efb0c17e305077f8175888a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "History of Beauty", + "price": 10.29, + "rating": 4.0, + "url": "https://books.toscrape.com/history-of-beauty_521/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/58/a6/58a634c3231b5380544cc330536cb5ea.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Heaven is for Real: A Little Boy\u0027s Astounding Story of His Trip to Heaven and Back", + "price": 52.86, + "rating": 2.0, + "url": "https://books.toscrape.com/heaven-is-for-real-a-little-boys-astounding-story-of-his-trip-to-heaven-and-back_520/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/58/6a/586afa8809f59bff51b89b2bc4a16129.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Future Shock (Future Shock #1)", + "price": 55.65, + "rating": 5.0, + "url": "https://books.toscrape.com/future-shock-future-shock-1_519/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/89/10/8910c36eec96636288a9cfb61610c9fa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Ender\u0027s Game (The Ender Quintet #1)", + "price": 43.64, + "rating": 1.0, + "url": "https://books.toscrape.com/enders-game-the-ender-quintet-1_518/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8a/0d/8a0d251ccece436f956df676c99e70f7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Diary of a Citizen Scientist: Chasing Tiger Beetles and Other New Ways of Engaging the World", + "price": 28.41, + "rating": 1.0, + "url": "https://books.toscrape.com/diary-of-a-citizen-scientist-chasing-tiger-beetles-and-other-new-ways-of-engaging-the-world_517/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/33/4f/334fd0ebdf0c0192baf5914d199c53b5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Death by Leisure: A Cautionary Tale", + "price": 37.51, + "rating": 4.0, + "url": "https://books.toscrape.com/death-by-leisure-a-cautionary-tale_516/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7d/16/7d16c126f85826628bf9dcccd7a66b32.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Brilliant Beacons: A History of the American Lighthouse", + "price": 11.45, + "rating": 3.0, + "url": "https://books.toscrape.com/brilliant-beacons-a-history-of-the-american-lighthouse_515/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/56/cb/56cb66d73fb438d64af14dce8bd8b22b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Brazen: The Courage to Find the You That\u0027s Been Hiding", + "price": 19.22, + "rating": 2.0, + "url": "https://books.toscrape.com/brazen-the-courage-to-find-the-you-thats-been-hiding_514/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3a/4f/3a4fb30cfc5742f4726bc9f807b66cda.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Between the World and Me", + "price": 56.91, + "rating": 4.0, + "url": "https://books.toscrape.com/between-the-world-and-me_513/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/73/45/7345c412c4c821f131d3c159e027c3a0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Being Mortal: Medicine and What Matters in the End", + "price": 55.06, + "rating": 4.0, + "url": "https://books.toscrape.com/being-mortal-medicine-and-what-matters-in-the-end_512/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c7/7f/c77fdad22e40b8b923ec6c5b1f5a740f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "A Murder Over a Girl: Justice, Gender, Junior High", + "price": 13.2, + "rating": 3.0, + "url": "https://books.toscrape.com/a-murder-over-a-girl-justice-gender-junior-high_511/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/56/31/56313728d302c83f2a8c70fba635ce33.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "32 Yolks", + "price": 53.63, + "rating": 2.0, + "url": "https://books.toscrape.com/32-yolks_510/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1d/1f/1d1fbd89f0290275b9166877663ee9f5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "\"Most Blessed of the Patriarchs\": Thomas Jefferson and the Empire of the Imagination", + "price": 44.48, + "rating": 5.0, + "url": "https://books.toscrape.com/most-blessed-of-the-patriarchs-thomas-jefferson-and-the-empire-of-the-imagination_509/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/11/af/11af7fbd6aec06a75fe207fae92b17e0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "You Are a Badass: How to Stop Doubting Your Greatness and Start Living an Awesome Life", + "price": 12.08, + "rating": 3.0, + "url": "https://books.toscrape.com/you-are-a-badass-how-to-stop-doubting-your-greatness-and-start-living-an-awesome-life_508/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9e/15/9e15d7add5090ff2a17bd71ac96aa55a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Wildlife of New York: A Five-Borough Coloring Book", + "price": 22.14, + "rating": 2.0, + "url": "https://books.toscrape.com/wildlife-of-new-york-a-five-borough-coloring-book_507/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0c/07/0c07b114195b45c156f7f1e23820c49a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "What Happened on Beale Street (Secrets of the South Mysteries #2)", + "price": 25.37, + "rating": 5.0, + "url": "https://books.toscrape.com/what-happened-on-beale-street-secrets-of-the-south-mysteries-2_506/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c7/ab/c7abb5e32bd37118a87523dcee0a70a6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Unreasonable Hope: Finding Faith in the God Who Brings Purpose to Your Pain", + "price": 46.33, + "rating": 2.0, + "url": "https://books.toscrape.com/unreasonable-hope-finding-faith-in-the-god-who-brings-purpose-to-your-pain_505/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8b/10/8b102daec94d1ea9c6fc36dd3ec1c1fe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Under the Tuscan Sun", + "price": 37.33, + "rating": 3.0, + "url": "https://books.toscrape.com/under-the-tuscan-sun_504/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/98/c2/98c2e95c5fd1a4e7cd5f2b63c52826cb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Toddlers Are A**holes: It\u0027s Not Your Fault", + "price": 25.55, + "rating": 1.0, + "url": "https://books.toscrape.com/toddlers-are-aholes-its-not-your-fault_503/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4c/30/4c3041def6f29659e009f61e45e492b0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Year of Living Biblically: One Man\u0027s Humble Quest to Follow the Bible as Literally as Possible", + "price": 34.72, + "rating": 1.0, + "url": "https://books.toscrape.com/the-year-of-living-biblically-one-mans-humble-quest-to-follow-the-bible-as-literally-as-possible_502/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8e/43/8e4335b369bdad5ccc1551e5592f89ac.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Whale", + "price": 35.96, + "rating": 4.0, + "url": "https://books.toscrape.com/the-whale_501/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6c/18/6c18ea03e294bfcfe07cf531c6c5f5b3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Story of Art", + "price": 41.14, + "rating": 4.0, + "url": "https://books.toscrape.com/the-story-of-art_500/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bb/36/bb364a10868756d1c0877c928b43b533.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Origin of Species", + "price": 10.01, + "rating": 4.0, + "url": "https://books.toscrape.com/the-origin-of-species_499/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/da/0d/da0d13699a090516502257a4d7da623f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Great Gatsby", + "price": 36.05, + "rating": 4.0, + "url": "https://books.toscrape.com/the-great-gatsby_498/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/28/cb/28cb7a5e23c1339a0d6aafd5e7e190d6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Good Girl", + "price": 49.03, + "rating": 3.0, + "url": "https://books.toscrape.com/the-good-girl_497/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e2/71/e2718be90a081b33d2606a386b073998.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Glass Castle", + "price": 16.24, + "rating": 1.0, + "url": "https://books.toscrape.com/the-glass-castle_496/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e0/e9/e0e97d416322d9728df7d9e589d6a998.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Faith of Christopher Hitchens: The Restless Soul of the World\u0027s Most Notorious Atheist", + "price": 39.55, + "rating": 1.0, + "url": "https://books.toscrape.com/the-faith-of-christopher-hitchens-the-restless-soul-of-the-worlds-most-notorious-atheist_495/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cc/a4/cca4e6a4cd5c207e7ce7d992ff464c3b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Drowning Girls", + "price": 35.67, + "rating": 3.0, + "url": "https://books.toscrape.com/the-drowning-girls_494/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f5/d9/f5d90537f3bed5ad7c8971190beb0730.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Constant Princess (The Tudor Court #1)", + "price": 16.62, + "rating": 3.0, + "url": "https://books.toscrape.com/the-constant-princess-the-tudor-court-1_493/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fc/80/fc80b999ff4b8ef24b7071f62d2bf6d1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Bourne Identity (Jason Bourne #1)", + "price": 42.78, + "rating": 4.0, + "url": "https://books.toscrape.com/the-bourne-identity-jason-bourne-1_492/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/40/8d/408d93b27ce8c9cfb3bf66c17e9a54ab.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Bachelor Girl\u0027s Guide to Murder (Herringford and Watts Mysteries #1)", + "price": 52.3, + "rating": 5.0, + "url": "https://books.toscrape.com/the-bachelor-girls-guide-to-murder-herringford-and-watts-mysteries-1_491/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/95/d7/95d7541679fcbd579b8a4f2b47231aaf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Art Book", + "price": 32.34, + "rating": 2.0, + "url": "https://books.toscrape.com/the-art-book_490/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/99/51/99511f4da1a4a2114e2ed12e6ba17b65.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change", + "price": 33.17, + "rating": 4.0, + "url": "https://books.toscrape.com/the-7-habits-of-highly-effective-people-powerful-lessons-in-personal-change_489/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c9/c3/c9c3d568ff6ddb98bde01c9d0b1d920a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Team of Rivals: The Political Genius of Abraham Lincoln", + "price": 20.12, + "rating": 5.0, + "url": "https://books.toscrape.com/team-of-rivals-the-political-genius-of-abraham-lincoln_488/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/56/75/567575381760b5c1ec018d10d350fc5f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Steal Like an Artist: 10 Things Nobody Told You About Being Creative", + "price": 20.9, + "rating": 2.0, + "url": "https://books.toscrape.com/steal-like-an-artist-10-things-nobody-told-you-about-being-creative_487/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5f/17/5f17f0e06d7d67717eff3833d309a233.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Sit, Stay, Love", + "price": 20.9, + "rating": 3.0, + "url": "https://books.toscrape.com/sit-stay-love_486/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8e/40/8e408552c2e7ee81cd60c03c79f604af.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Sister Dear", + "price": 40.2, + "rating": 4.0, + "url": "https://books.toscrape.com/sister-dear_485/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fa/57/fa570b7a0fb42252f61e1e750c79d417.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Shrunken Treasures: Literary Classics, Short, Sweet, and Silly", + "price": 52.87, + "rating": 3.0, + "url": "https://books.toscrape.com/shrunken-treasures-literary-classics-short-sweet-and-silly_484/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4f/1e/4f1ece2500f8dbacecca42d57befca03.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Rich Dad, Poor Dad", + "price": 51.74, + "rating": 1.0, + "url": "https://books.toscrape.com/rich-dad-poor-dad_483/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/18/f4/18f45d31e3892fee589e23f15d759ee3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Raymie Nightingale", + "price": 34.41, + "rating": 2.0, + "url": "https://books.toscrape.com/raymie-nightingale_482/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8f/66/8f66ec46e671d6fca79649c10c7c8f8a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Playing from the Heart", + "price": 32.38, + "rating": 1.0, + "url": "https://books.toscrape.com/playing-from-the-heart_481/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1c/eb/1cebdf525ebe970a1dc3c5a8c50eae6b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Nightstruck: A Novel", + "price": 50.35, + "rating": 4.0, + "url": "https://books.toscrape.com/nightstruck-a-novel_480/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c0/df/c0dfd5388bb38b9c24da2e94534e1198.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Naturally Lean: 125 Nourishing Gluten-Free, Plant-Based Recipes--All Under 300 Calories", + "price": 11.38, + "rating": 5.0, + "url": "https://books.toscrape.com/naturally-lean-125-nourishing-gluten-free-plant-based-recipes-all-under-300-calories_479/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e6/b6/e6b66353f9325518994dd8b564290fd7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Meternity", + "price": 43.58, + "rating": 3.0, + "url": "https://books.toscrape.com/meternity_478/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/39/e3/39e33ebef2d7a35dd6899541eba8306d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Memoirs of a Geisha", + "price": 49.67, + "rating": 3.0, + "url": "https://books.toscrape.com/memoirs-of-a-geisha_477/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/80/4180406c788ff3e0f37cd4491a260a5b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Like Never Before (Walker Family #2)", + "price": 28.77, + "rating": 2.0, + "url": "https://books.toscrape.com/like-never-before-walker-family-2_476/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/17/e2/17e264d978942f73b859fa1c1d2cf827.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Life of Pi", + "price": 13.22, + "rating": 4.0, + "url": "https://books.toscrape.com/life-of-pi_475/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e7/ae/e7aee104ca78dac961bd906294fe88f1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Leave This Song Behind: Teen Poetry at Its Best", + "price": 51.17, + "rating": 5.0, + "url": "https://books.toscrape.com/leave-this-song-behind-teen-poetry-at-its-best_474/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/31/c7/31c7c5ce7b04d227aa36ecb250b9dad5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "King\u0027s Folly (The Kinsman Chronicles #1)", + "price": 39.61, + "rating": 5.0, + "url": "https://books.toscrape.com/kings-folly-the-kinsman-chronicles-1_473/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3e/2d/3e2d526ee062008ab1cbf54f90a5abb2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "John Adams", + "price": 57.43, + "rating": 4.0, + "url": "https://books.toscrape.com/john-adams_472/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/59/b4/59b4f94b4dc4c7cb844a6f24a5e2a41e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "How to Cook Everything Vegetarian: Simple Meatless Recipes for Great Food (How to Cook Everything)", + "price": 46.01, + "rating": 4.0, + "url": "https://books.toscrape.com/how-to-cook-everything-vegetarian-simple-meatless-recipes-for-great-food-how-to-cook-everything_471/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/59/2d/592dc2dee11b798780f5ae613b970a34.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "How to Be a Domestic Goddess: Baking and the Art of Comfort Cooking", + "price": 28.25, + "rating": 2.0, + "url": "https://books.toscrape.com/how-to-be-a-domestic-goddess-baking-and-the-art-of-comfort-cooking_470/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e2/5c/e25cbc27ebc12e47cdf3f7adc87cccdc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Good in Bed (Cannie Shapiro #1)", + "price": 37.05, + "rating": 5.0, + "url": "https://books.toscrape.com/good-in-bed-cannie-shapiro-1_469/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1d/f4/1df443b1bd6d7a1d804b4780a666438f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Fruits Basket, Vol. 7 (Fruits Basket #7)", + "price": 19.57, + "rating": 1.0, + "url": "https://books.toscrape.com/fruits-basket-vol-7-fruits-basket-7_468/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b4/36/b43672509477baa090e57ebeacbb28fb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "For the Love: Fighting for Grace in a World of Impossible Standards", + "price": 45.13, + "rating": 3.0, + "url": "https://books.toscrape.com/for-the-love-fighting-for-grace-in-a-world-of-impossible-standards_467/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a7/d8/a7d8fda2a874567aab8f61b2b141a5e2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Finding God in the Ruins: How God Redeems Pain", + "price": 46.64, + "rating": 2.0, + "url": "https://books.toscrape.com/finding-god-in-the-ruins-how-god-redeems-pain_466/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/2c/ae2ce9662ed6da3de501ff87551ccb2d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Every Heart a Doorway (Every Heart A Doorway #1)", + "price": 12.16, + "rating": 5.0, + "url": "https://books.toscrape.com/every-heart-a-doorway-every-heart-a-doorway-1_465/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/50/d4/50d41a24990208deb72c9802a6c1e540.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Delivering the Truth (Quaker Midwife Mystery #1)", + "price": 20.89, + "rating": 4.0, + "url": "https://books.toscrape.com/delivering-the-truth-quaker-midwife-mystery-1_464/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/57/31/5731a5d46c2c1e88977eb5e6d1337a2e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Counted With the Stars (Out from Egypt #1)", + "price": 17.97, + "rating": 5.0, + "url": "https://books.toscrape.com/counted-with-the-stars-out-from-egypt-1_463/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/32/2c/322c1f6cce6d5a69a7d2321779195a0c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Chronicles, Vol. 1", + "price": 52.6, + "rating": 2.0, + "url": "https://books.toscrape.com/chronicles-vol-1_462/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/11/fc/11fc94453c4dc0d68543971d7843afb0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Blue Like Jazz: Nonreligious Thoughts on Christian Spirituality", + "price": 25.77, + "rating": 1.0, + "url": "https://books.toscrape.com/blue-like-jazz-nonreligious-thoughts-on-christian-spirituality_461/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a2/f5/a2f5b5fd4421d56d37c73a7fb29f5f40.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Benjamin Franklin: An American Life", + "price": 48.19, + "rating": 3.0, + "url": "https://books.toscrape.com/benjamin-franklin-an-american-life_460/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/25/f8/25f869fa75340fca0fc2a68e8a0412a1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "At The Existentialist Café: Freedom, Being, and apricot cocktails with: Jean-Paul Sartre, Simone de Beauvoir, Albert Camus, Martin Heidegger, Edmund Husserl, Karl Jaspers, Maurice Merleau-Ponty and others", + "price": 29.93, + "rating": 5.0, + "url": "https://books.toscrape.com/at-the-existentialist-cafe-freedom-being-and-apricot-cocktails-with-jean-paul-sartre-simone-de-beauvoir-albert-camus-martin-heidegger-edmund-husserl-karl-jaspers-maurice-merleau-ponty-and-others_459/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/de/76/de76d5c473c358bd41c03cf710692bfb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "A Summer In Europe", + "price": 44.34, + "rating": 2.0, + "url": "https://books.toscrape.com/a-summer-in-europe_458/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4e/15/4e15150388702ebca2c5a523ac270539.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "A Short History of Nearly Everything", + "price": 52.4, + "rating": 5.0, + "url": "https://books.toscrape.com/a-short-history-of-nearly-everything_457/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3c/f6/3cf646523ff7fb8647c500d6325cfcaf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "A Gathering of Shadows (Shades of Magic #2)", + "price": 44.81, + "rating": 4.0, + "url": "https://books.toscrape.com/a-gathering-of-shadows-shades-of-magic-2_456/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/48/b2/48b20fcc9ab722729de2c4da3d4de26e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Sound Of Love", + "price": 57.84, + "rating": 5.0, + "url": "https://books.toscrape.com/the-sound-of-love_455/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4e/3a/4e3a151bbe2629a55df09fd318fdeb0a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Rise and Fall of the Third Reich: A History of Nazi Germany", + "price": 39.67, + "rating": 2.0, + "url": "https://books.toscrape.com/the-rise-and-fall-of-the-third-reich-a-history-of-nazi-germany_454/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e1/02/e102cefae5bb523bc67eb6b49bc18b5d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Perks of Being a Wallflower", + "price": 55.02, + "rating": 3.0, + "url": "https://books.toscrape.com/the-perks-of-being-a-wallflower_453/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ca/5b/ca5b33c09daab4667ed37b330de889bd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Mysterious Affair at Styles (Hercule Poirot #1)", + "price": 24.8, + "rating": 4.0, + "url": "https://books.toscrape.com/the-mysterious-affair-at-styles-hercule-poirot-1_452/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/32/94/3294e5eaf73a37958583483fc9a90f04.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Man Who Mistook His Wife for a Hat and Other Clinical Tales", + "price": 59.45, + "rating": 4.0, + "url": "https://books.toscrape.com/the-man-who-mistook-his-wife-for-a-hat-and-other-clinical-tales_451/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/92/fe/92fe1c1823653412fe68be2c525dfc3a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Makings of a Fatherless Child", + "price": 31.58, + "rating": 2.0, + "url": "https://books.toscrape.com/the-makings-of-a-fatherless-child_450/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6f/6c/6f6c7560e254f8242f86ef048f1ba7b3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Joy of Cooking", + "price": 43.27, + "rating": 4.0, + "url": "https://books.toscrape.com/the-joy-of-cooking_449/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/05/8e/058ebff59d12ebe40df1844bedd9366b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Invention of Wings", + "price": 37.34, + "rating": 1.0, + "url": "https://books.toscrape.com/the-invention-of-wings_448/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/62/fa/62fa1e72f06f05762db5d9cedf654153.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Hobbit (Middle-Earth Universe)", + "price": 17.8, + "rating": 5.0, + "url": "https://books.toscrape.com/the-hobbit-middle-earth-universe_447/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8b/d3/8bd38de5367fc675467431f343862569.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Great Railway Bazaar", + "price": 30.54, + "rating": 1.0, + "url": "https://books.toscrape.com/the-great-railway-bazaar_446/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/76/de/76de41867f323d7f1f4fbe2fdfc1b2ba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Golden Compass (His Dark Materials #1)", + "price": 18.77, + "rating": 1.0, + "url": "https://books.toscrape.com/the-golden-compass-his-dark-materials-1_445/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e7/9f/e79f81bfea1cb8b0503db022b64da713.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The God Delusion", + "price": 46.85, + "rating": 3.0, + "url": "https://books.toscrape.com/the-god-delusion_444/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/36/64/36643d44134c8a227988927013805e61.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Girl You Left Behind (The Girl You Left Behind #1)", + "price": 15.79, + "rating": 1.0, + "url": "https://books.toscrape.com/the-girl-you-left-behind-the-girl-you-left-behind-1_443/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d0/b6/d0b6d59c0662dcbd15d47add40af1ebd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Fellowship of the Ring (The Lord of the Rings #1)", + "price": 10.27, + "rating": 2.0, + "url": "https://books.toscrape.com/the-fellowship-of-the-ring-the-lord-of-the-rings-1_442/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ed/75/ed75000b92734d99b76a17954857327c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Collected Poems of W.B. Yeats (The Collected Works of W.B. Yeats #1)", + "price": 15.42, + "rating": 5.0, + "url": "https://books.toscrape.com/the-collected-poems-of-wb-yeats-the-collected-works-of-wb-yeats-1_441/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7e/93/7e934132cd03486649fb492fe702f704.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Barefoot Contessa Cookbook", + "price": 59.92, + "rating": 5.0, + "url": "https://books.toscrape.com/the-barefoot-contessa-cookbook_440/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/dd/07/dd07bd0c443756b9dc260813c1949b4f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Tell the Wolves I\u0027m Home", + "price": 50.96, + "rating": 2.0, + "url": "https://books.toscrape.com/tell-the-wolves-im-home_439/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f9/72/f972e744117c9d4b5fefb3410c0e9f7c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Ship Leaves Harbor: Essays on Travel by a Recovering Journeyman", + "price": 30.6, + "rating": 3.0, + "url": "https://books.toscrape.com/ship-leaves-harbor-essays-on-travel-by-a-recovering-journeyman_438/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/31/b0/31b0e0a42826b326e43235beb8ddd783.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Pride and Prejudice", + "price": 19.27, + "rating": 4.0, + "url": "https://books.toscrape.com/pride-and-prejudice_437/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c8/09/c80991f861675b6e75dc7f2f6a50e5a0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Musicophilia: Tales of Music and the Brain", + "price": 46.58, + "rating": 1.0, + "url": "https://books.toscrape.com/musicophilia-tales-of-music-and-the-brain_436/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/02/66/02667c5b8f5a5e9e45c0799518f086ca.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Mere Christianity", + "price": 48.51, + "rating": 3.0, + "url": "https://books.toscrape.com/mere-christianity_435/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d2/90/d29093abd0b9d5258e2e08b731778158.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Me Before You (Me Before You #1)", + "price": 19.02, + "rating": 1.0, + "url": "https://books.toscrape.com/me-before-you-me-before-you-1_434/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a2/cd/a2cd0016b37c0407059147e58e14afe5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "In the Woods (Dublin Murder Squad #1)", + "price": 38.38, + "rating": 2.0, + "url": "https://books.toscrape.com/in-the-woods-dublin-murder-squad-1_433/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/24/a1/24a175dac7cb91ff26e2d723cdc6e098.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "In Cold Blood", + "price": 49.98, + "rating": 4.0, + "url": "https://books.toscrape.com/in-cold-blood_432/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/eb/4e/eb4ea9c04dccab509451ba31feb6b4e8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "How to Stop Worrying and Start Living", + "price": 46.49, + "rating": 5.0, + "url": "https://books.toscrape.com/how-to-stop-worrying-and-start-living_431/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4f/08/4f08f7948770912e4e340e10caa604cb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Give It Back", + "price": 18.32, + "rating": 2.0, + "url": "https://books.toscrape.com/give-it-back_430/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8b/7c/8b7c73e075cc687b6890dc0dca9fcbcc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Girl, Interrupted", + "price": 42.14, + "rating": 3.0, + "url": "https://books.toscrape.com/girl-interrupted_429/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f9/ec/f9ec97bd8b29cc4e36d6c2b093d04709.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Fun Home: A Family Tragicomic", + "price": 56.59, + "rating": 4.0, + "url": "https://books.toscrape.com/fun-home-a-family-tragicomic_428/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/54/ae/54ae8233e8422676c241d1cea0b67f1d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Fruits Basket, Vol. 6 (Fruits Basket #6)", + "price": 20.96, + "rating": 4.0, + "url": "https://books.toscrape.com/fruits-basket-vol-6-fruits-basket-6_427/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/94/1a/941a14dec32f0a949c38a325a715c138.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Deception Point", + "price": 40.32, + "rating": 4.0, + "url": "https://books.toscrape.com/deception-point_426/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fa/2d/fa2d3198b7ba9785e0edd6f41b84d72b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Death Note, Vol. 6: Give-and-Take (Death Note #6)", + "price": 36.39, + "rating": 3.0, + "url": "https://books.toscrape.com/death-note-vol-6-give-and-take-death-note-6_425/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/07/5c/075c210f5ce43b84d29646a54529d1bd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Catherine the Great: Portrait of a Woman", + "price": 58.55, + "rating": 4.0, + "url": "https://books.toscrape.com/catherine-the-great-portrait-of-a-woman_424/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/72/f1/72f13b8f069d3a018d2c378be5a1de20.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Better Homes and Gardens New Cook Book", + "price": 39.61, + "rating": 3.0, + "url": "https://books.toscrape.com/better-homes-and-gardens-new-cook-book_423/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/75/82/7582e20b84f603358a8d55cd6a0a50f4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "An Unquiet Mind: A Memoir of Moods and Madness", + "price": 21.3, + "rating": 3.0, + "url": "https://books.toscrape.com/an-unquiet-mind-a-memoir-of-moods-and-madness_422/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/00/29/002924b764dc367dcaa3486fa4c0aa0b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "A Year in Provence (Provence #1)", + "price": 56.88, + "rating": 4.0, + "url": "https://books.toscrape.com/a-year-in-provence-provence-1_421/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/46/db46159b05faa5d95262112bf9c29ddd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "World Without End (The Pillars of the Earth #2)", + "price": 32.97, + "rating": 4.0, + "url": "https://books.toscrape.com/world-without-end-the-pillars-of-the-earth-2_420/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/be/7c/be7ce6fbc9a8e1a5a5b5c32e73cfd78a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Will Grayson, Will Grayson (Will Grayson, Will Grayson)", + "price": 47.31, + "rating": 4.0, + "url": "https://books.toscrape.com/will-grayson-will-grayson-will-grayson-will-grayson_419/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/de/a1/dea174c8a8dbfd98e5e05c9e479a52b2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Why Save the Bankers?: And Other Essays on Our Economic and Political Crisis", + "price": 48.67, + "rating": 2.0, + "url": "https://books.toscrape.com/why-save-the-bankers-and-other-essays-on-our-economic-and-political-crisis_418/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/16/f5/16f545b2e14c16ed4bd0e098a0700b57.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Where She Went (If I Stay #2)", + "price": 41.73, + "rating": 4.0, + "url": "https://books.toscrape.com/where-she-went-if-i-stay-2_417/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/05/86/0586b3d79013f606494e843de1faea0b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "What If?: Serious Scientific Answers to Absurd Hypothetical Questions", + "price": 53.68, + "rating": 4.0, + "url": "https://books.toscrape.com/what-if-serious-scientific-answers-to-absurd-hypothetical-questions_416/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/59/bc/59bcc421ae9f5a6f12ef11e849fb745d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Two Summers", + "price": 14.64, + "rating": 1.0, + "url": "https://books.toscrape.com/two-summers_415/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/89/16/89165d7488fbaa9e60cfcabe56796288.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "This Is Your Brain on Music: The Science of a Human Obsession", + "price": 38.4, + "rating": 1.0, + "url": "https://books.toscrape.com/this-is-your-brain-on-music-the-science-of-a-human-obsession_414/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/35/a4/35a4a7c6c76c4e82186753078e441654.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Secret Garden", + "price": 15.08, + "rating": 4.0, + "url": "https://books.toscrape.com/the-secret-garden_413/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c5/46/c5465a06182ed6ebfa40d049258a2f58.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Raven King (The Raven Cycle #4)", + "price": 30.57, + "rating": 2.0, + "url": "https://books.toscrape.com/the-raven-king-the-raven-cycle-4_412/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/da/54/da54d953f00d1e465f31f865df3d0f3f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Raven Boys (The Raven Cycle #1)", + "price": 57.74, + "rating": 4.0, + "url": "https://books.toscrape.com/the-raven-boys-the-raven-cycle-1_411/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3c/a4/3ca4889e4bb7f9a1cc1d7a1c920e9d42.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Power Greens Cookbook: 140 Delicious Superfood Recipes", + "price": 11.05, + "rating": 5.0, + "url": "https://books.toscrape.com/the-power-greens-cookbook-140-delicious-superfood-recipes_410/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/82/1d/821d2c02dcd0a10fc9d533917482746e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Metamorphosis", + "price": 28.58, + "rating": 1.0, + "url": "https://books.toscrape.com/the-metamorphosis_409/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4a/1b/4a1b6e9c1af75db0dc34ae63344f6883.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Mathews Men: Seven Brothers and the War Against Hitler\u0027s U-boats", + "price": 42.91, + "rating": 5.0, + "url": "https://books.toscrape.com/the-mathews-men-seven-brothers-and-the-war-against-hitlers-u-boats_408/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f2/64/f26457d65a03b2636c4bcc7c318f7346.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Little Paris Bookshop", + "price": 24.73, + "rating": 3.0, + "url": "https://books.toscrape.com/the-little-paris-bookshop_407/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/50/a9/50a901fb008c0b8965c8d4da2dff5470.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Hiding Place", + "price": 55.91, + "rating": 4.0, + "url": "https://books.toscrape.com/the-hiding-place_406/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cf/18/cf187c1dc5575fcbbf49c58024146c4b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Grand Design", + "price": 13.76, + "rating": 3.0, + "url": "https://books.toscrape.com/the-grand-design_405/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/08/a9/08a957eb34f8047862e225774c3bdde2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Firm", + "price": 45.56, + "rating": 3.0, + "url": "https://books.toscrape.com/the-firm_404/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/95/84/95847132a78de44b7249a2d0a3fe3ef6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Fault in Our Stars", + "price": 47.22, + "rating": 1.0, + "url": "https://books.toscrape.com/the-fault-in-our-stars_403/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/69/61/696100859e82b2ec7a796129d6cca44a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The False Prince (The Ascendance Trilogy #1)", + "price": 56.0, + "rating": 5.0, + "url": "https://books.toscrape.com/the-false-prince-the-ascendance-trilogy-1_402/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f8/e3/f8e371e2869d13b9d89999f8d5173245.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Expatriates", + "price": 44.58, + "rating": 2.0, + "url": "https://books.toscrape.com/the-expatriates_401/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/e4/dbe49e1cb06136eeb51182f551ccdc52.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Dream Thieves (The Raven Cycle #2)", + "price": 34.5, + "rating": 1.0, + "url": "https://books.toscrape.com/the-dream-thieves-the-raven-cycle-2_400/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d9/7a/d97a3a4a65b5275ab506b28c7a88e0a5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Darkest Corners", + "price": 11.33, + "rating": 5.0, + "url": "https://books.toscrape.com/the-darkest-corners_399/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c1/ab/c1ab73a20d02b5f3a5599e7c5704a909.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Crossover", + "price": 38.77, + "rating": 4.0, + "url": "https://books.toscrape.com/the-crossover_398/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9f/35/9f351ca1978128c60a3b7f85987075b3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The 5th Wave (The 5th Wave #1)", + "price": 11.83, + "rating": 2.0, + "url": "https://books.toscrape.com/the-5th-wave-the-5th-wave-1_397/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/10/d0/10d0c5e47d0e8cce16b6b5e6be48cb16.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Tell the Wind and Fire", + "price": 45.51, + "rating": 3.0, + "url": "https://books.toscrape.com/tell-the-wind-and-fire_396/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3b/0c/3b0c5f4df26b73659af4e25107499384.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Tell Me Three Things", + "price": 41.81, + "rating": 1.0, + "url": "https://books.toscrape.com/tell-me-three-things_395/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a1/2f/a12f0bec8c8728800f901b4e5f6e3f9a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Talking to Girls About Duran Duran: One Young Man\u0027s Quest for True Love and a Cooler Haircut", + "price": 25.15, + "rating": 4.0, + "url": "https://books.toscrape.com/talking-to-girls-about-duran-duran-one-young-mans-quest-for-true-love-and-a-cooler-haircut_394/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/07/8b/078b934613af473daf7ecf918e05d050.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Siddhartha", + "price": 34.22, + "rating": 5.0, + "url": "https://books.toscrape.com/siddhartha_393/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ce/0b/ce0be2d86e388540122c222306c6d62c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Shiver (The Wolves of Mercy Falls #1)", + "price": 16.23, + "rating": 5.0, + "url": "https://books.toscrape.com/shiver-the-wolves-of-mercy-falls-1_392/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/84/73/847399651d8f2dfae1a0d5a0ea4064b2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Remember Me?", + "price": 11.48, + "rating": 3.0, + "url": "https://books.toscrape.com/remember-me_391/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3f/95/3f9572f94858197e92786b194f0f12df.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Red Dragon (Hannibal Lecter #1)", + "price": 23.37, + "rating": 3.0, + "url": "https://books.toscrape.com/red-dragon-hannibal-lecter-1_390/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/30/66/3066f8bcd2e2ed6b45084355ff084a61.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Peak: Secrets from the New Science of Expertise", + "price": 16.28, + "rating": 2.0, + "url": "https://books.toscrape.com/peak-secrets-from-the-new-science-of-expertise_389/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/83/ab/83ab65f938b24fa1a9cb47235be49b57.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "My Mother Was Nuts", + "price": 31.63, + "rating": 4.0, + "url": "https://books.toscrape.com/my-mother-was-nuts_388/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9b/b4/9bb42bf833e91193ca05badddded4bfb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Mexican Today: New and Rediscovered Recipes for Contemporary Kitchens", + "price": 24.91, + "rating": 5.0, + "url": "https://books.toscrape.com/mexican-today-new-and-rediscovered-recipes-for-contemporary-kitchens_387/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5d/02/5d029bff299cdb777e06f35800faa628.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Maybe Something Beautiful: How Art Transformed a Neighborhood", + "price": 22.54, + "rating": 1.0, + "url": "https://books.toscrape.com/maybe-something-beautiful-how-art-transformed-a-neighborhood_386/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c0/bb/c0bb6e42743b9c1aaf9b754501100a5d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Lola and the Boy Next Door (Anna and the French Kiss #2)", + "price": 23.63, + "rating": 4.0, + "url": "https://books.toscrape.com/lola-and-the-boy-next-door-anna-and-the-french-kiss-2_385/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bc/c8/bcc8374e0c81ded1486b6225ca4fe78a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Logan Kade (Fallen Crest High #5.5)", + "price": 13.12, + "rating": 2.0, + "url": "https://books.toscrape.com/logan-kade-fallen-crest-high-55_384/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d9/4e/d94e6206c2decd3acd9a61b2cbac7eaf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Last One Home (New Beginnings #1)", + "price": 59.98, + "rating": 3.0, + "url": "https://books.toscrape.com/last-one-home-new-beginnings-1_383/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e4/0a/e40a336622fe578699be5a1eeba18f9d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Killing Floor (Jack Reacher #1)", + "price": 31.49, + "rating": 4.0, + "url": "https://books.toscrape.com/killing-floor-jack-reacher-1_382/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/eb/e9/ebe9f06ccebf83d9853a846052b58fff.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Kill the Boy Band", + "price": 15.52, + "rating": 5.0, + "url": "https://books.toscrape.com/kill-the-boy-band_381/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/05/74/0574a71ccaff1fef1f8e9a1f4c22b7bc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Isla and the Happily Ever After (Anna and the French Kiss #3)", + "price": 48.13, + "rating": 5.0, + "url": "https://books.toscrape.com/isla-and-the-happily-ever-after-anna-and-the-french-kiss-3_380/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0d/0b/0d0bd1fce3e0171cf101764393caea41.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "If I Stay (If I Stay #1)", + "price": 38.13, + "rating": 5.0, + "url": "https://books.toscrape.com/if-i-stay-if-i-stay-1_379/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cb/b3/cbb3754c7bae0d54dcf561aed4f9d6e3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "I Know Why the Caged Bird Sings (Maya Angelou\u0027s Autobiography #1)", + "price": 36.55, + "rating": 2.0, + "url": "https://books.toscrape.com/i-know-why-the-caged-bird-sings-maya-angelous-autobiography-1_378/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c1/42/c14297e48de02ac420c587822ff329ab.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Harry Potter and the Deathly Hallows (Harry Potter #7)", + "price": 23.32, + "rating": 1.0, + "url": "https://books.toscrape.com/harry-potter-and-the-deathly-hallows-harry-potter-7_377/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/58/e4/58e434a6a4eb267eac7aa529b0c2ec15.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Fruits Basket, Vol. 5 (Fruits Basket #5)", + "price": 16.33, + "rating": 1.0, + "url": "https://books.toscrape.com/fruits-basket-vol-5-fruits-basket-5_376/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/51/cf/51cf19c74f21a7043910615fefcf0847.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Foundation (Foundation (Publication Order) #1)", + "price": 32.42, + "rating": 1.0, + "url": "https://books.toscrape.com/foundation-foundation-publication-order-1_375/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8b/92/8b9267df86378b6973974ae7e1924ffe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Fool Me Once", + "price": 16.96, + "rating": 1.0, + "url": "https://books.toscrape.com/fool-me-once_374/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b6/9c/b69c4ea86e09921aabc4e0431a8273a5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Find Her (Detective D.D. Warren #8)", + "price": 22.37, + "rating": 1.0, + "url": "https://books.toscrape.com/find-her-detective-dd-warren-8_373/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f6/f2/f6f2094e8a318093fa53784df2bfeab8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Evicted: Poverty and Profit in the American City", + "price": 42.27, + "rating": 1.0, + "url": "https://books.toscrape.com/evicted-poverty-and-profit-in-the-american-city_372/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d0/4f/d04f8176cf0527b293114173d01999d7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Drama", + "price": 38.7, + "rating": 2.0, + "url": "https://books.toscrape.com/drama_371/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/68/ce/68ce8be6a167f510d07a7da637b62c6f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Dracula the Un-Dead", + "price": 35.63, + "rating": 5.0, + "url": "https://books.toscrape.com/dracula-the-un-dead_370/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/13/ff/13fffcde653948339d3427184b7bd0b5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Digital Fortress", + "price": 58.0, + "rating": 5.0, + "url": "https://books.toscrape.com/digital-fortress_369/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5c/77/5c770b251d27aeef263f8ae974ca02e0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Death Note, Vol. 5: Whiteout (Death Note #5)", + "price": 52.41, + "rating": 1.0, + "url": "https://books.toscrape.com/death-note-vol-5-whiteout-death-note-5_368/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4e/c1/4ec161cc09ee437c9eda6d437d232a11.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Data, A Love Story: How I Gamed Online Dating to Meet My Match", + "price": 32.35, + "rating": 3.0, + "url": "https://books.toscrape.com/data-a-love-story-how-i-gamed-online-dating-to-meet-my-match_367/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1f/d8/1fd8340d9b3fd95861f0407b4dbb0fa7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Critique of Pure Reason", + "price": 20.75, + "rating": 1.0, + "url": "https://books.toscrape.com/critique-of-pure-reason_366/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/12/6e/126ef8f6473b81808ebbb9cff155e883.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Booked", + "price": 17.49, + "rating": 5.0, + "url": "https://books.toscrape.com/booked_365/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8f/46/8f46bb13feb3a4440a27dfcf688fbaa6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Blue Lily, Lily Blue (The Raven Cycle #3)", + "price": 34.13, + "rating": 5.0, + "url": "https://books.toscrape.com/blue-lily-lily-blue-the-raven-cycle-3_364/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/14/db14903b3a56a297ef6aefe7624d637f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Approval Junkie: Adventures in Caring Too Much", + "price": 58.81, + "rating": 5.0, + "url": "https://books.toscrape.com/approval-junkie-adventures-in-caring-too-much_363/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/17/aa/17aacb738eace89a635a4eb47a94c11d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "An Abundance of Katherines", + "price": 10.0, + "rating": 5.0, + "url": "https://books.toscrape.com/an-abundance-of-katherines_362/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ed/45/ed4517339d4780f4158c485c83850d20.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "America\u0027s War for the Greater Middle East: A Military History", + "price": 51.22, + "rating": 2.0, + "url": "https://books.toscrape.com/americas-war-for-the-greater-middle-east-a-military-history_361/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/eb/17/eb178eceef1e9290591cabd5155571a3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Alight (The Generations Trilogy #2)", + "price": 58.59, + "rating": 4.0, + "url": "https://books.toscrape.com/alight-the-generations-trilogy-2_360/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5e/f3/5ef34ba3e937218db15178a1a5ce195f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "A Girl\u0027s Guide to Moving On (New Beginnings #2)", + "price": 31.3, + "rating": 1.0, + "url": "https://books.toscrape.com/a-girls-guide-to-moving-on-new-beginnings-2_359/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f7/a9/f7a90a63f66ac92cc280def001970ed2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "A Game of Thrones (A Song of Ice and Fire #1)", + "price": 46.42, + "rating": 2.0, + "url": "https://books.toscrape.com/a-game-of-thrones-a-song-of-ice-and-fire-1_358/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/13/d1/13d11b26b46484ee73e9923ff307a7b4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "A Feast for Crows (A Song of Ice and Fire #4)", + "price": 17.21, + "rating": 4.0, + "url": "https://books.toscrape.com/a-feast-for-crows-a-song-of-ice-and-fire-4_357/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b3/6b/b36b278233baf55ebaad761d8d3d0fec.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "A Clash of Kings (A Song of Ice and Fire #2)", + "price": 10.79, + "rating": 3.0, + "url": "https://books.toscrape.com/a-clash-of-kings-a-song-of-ice-and-fire-2_356/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1a/29/1a298a157f4113d6e0127521aaa1f5f0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Vogue Colors A to Z: A Fashion Coloring Book", + "price": 52.35, + "rating": 4.0, + "url": "https://books.toscrape.com/vogue-colors-a-to-z-a-fashion-coloring-book_355/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1f/55/1f5541682b39b390a3db41430922d510.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Shining (The Shining #1)", + "price": 27.88, + "rating": 3.0, + "url": "https://books.toscrape.com/the-shining-the-shining-1_354/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/96/db9686744f93c0e9ff3945144827f99a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Pilgrim\u0027s Progress", + "price": 50.26, + "rating": 2.0, + "url": "https://books.toscrape.com/the-pilgrims-progress_353/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/45/bb/45bb59d19eb3aa868293d44809078418.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Perfect Play (Play by Play #1)", + "price": 59.99, + "rating": 3.0, + "url": "https://books.toscrape.com/the-perfect-play-play-by-play-1_352/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/40/16/4016ffba678f309171d8130135f6eb8e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Passion of Dolssa", + "price": 28.32, + "rating": 5.0, + "url": "https://books.toscrape.com/the-passion-of-dolssa_351/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6b/82/6b822681c4035131560d40dd3b5a6a2e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Jazz of Physics: The Secret Link Between Music and the Structure of the Universe", + "price": 38.71, + "rating": 3.0, + "url": "https://books.toscrape.com/the-jazz-of-physics-the-secret-link-between-music-and-the-structure-of-the-universe_350/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2d/32/2d32efe1c5f97510596a2cc21c5daf5d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Hunger Games (The Hunger Games #1)", + "price": 29.85, + "rating": 5.0, + "url": "https://books.toscrape.com/the-hunger-games-the-hunger-games-1_349/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/c7/41c72a9c7733fc5f7434b2fa33060c54.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Hound of the Baskervilles (Sherlock Holmes #5)", + "price": 14.82, + "rating": 2.0, + "url": "https://books.toscrape.com/the-hound-of-the-baskervilles-sherlock-holmes-5_348/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1f/b0/1fb03cdabe6001c8a2620f65e025cbd5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Gunning of America: Business and the Making of American Gun Culture", + "price": 16.81, + "rating": 4.0, + "url": "https://books.toscrape.com/the-gunning-of-america-business-and-the-making-of-american-gun-culture_347/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/28/a8/28a8784d0b38b148a35bce421dc16910.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Geography of Bliss: One Grump\u0027s Search for the Happiest Places in the World", + "price": 28.23, + "rating": 2.0, + "url": "https://books.toscrape.com/the-geography-of-bliss-one-grumps-search-for-the-happiest-places-in-the-world_346/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bd/a0/bda0fa21e6d06862920c0eedecc6201e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Demonists (Demonist #1)", + "price": 52.11, + "rating": 2.0, + "url": "https://books.toscrape.com/the-demonists-demonist-1_345/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1a/d2/1ad2a260776198051f4d1849be347cc6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Demon Prince of Momochi House, Vol. 4 (The Demon Prince of Momochi House #4)", + "price": 27.88, + "rating": 2.0, + "url": "https://books.toscrape.com/the-demon-prince-of-momochi-house-vol-4-the-demon-prince-of-momochi-house-4_344/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/47/71/477173fe3000a6da4b241c2e71a21418.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Bone Hunters (Lexy Vaughan \u0026 Steven Macaulay #2)", + "price": 59.71, + "rating": 3.0, + "url": "https://books.toscrape.com/the-bone-hunters-lexy-vaughan-steven-macaulay-2_343/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/d4/eed4d5d63d13f0aa86575c90f8ccacb7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Beast (Black Dagger Brotherhood #14)", + "price": 46.08, + "rating": 5.0, + "url": "https://books.toscrape.com/the-beast-black-dagger-brotherhood-14_342/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1b/3f/1b3f5057f9e7f7cb81a8c10b58024145.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Some Women", + "price": 13.73, + "rating": 5.0, + "url": "https://books.toscrape.com/some-women_341/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/27/b7/27b7f4ec590965b5acc15dc4b1376684.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Shopaholic Ties the Knot (Shopaholic #3)", + "price": 48.39, + "rating": 5.0, + "url": "https://books.toscrape.com/shopaholic-ties-the-knot-shopaholic-3_340/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ac/ba/acba5e4e1813b8c1fff4890f1efef3ab.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Paper and Fire (The Great Library #2)", + "price": 49.45, + "rating": 5.0, + "url": "https://books.toscrape.com/paper-and-fire-the-great-library-2_339/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a7/04/a704d4248b21c0cdd8038c1b8345ed17.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Outlander (Outlander #1)", + "price": 19.67, + "rating": 5.0, + "url": "https://books.toscrape.com/outlander-outlander-1_338/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b1/0b/b10ba73e67297fc8ed9e877bdcf60813.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Orchestra of Exiles: The Story of Bronislaw Huberman, the Israel Philharmonic, and the One Thousand Jews He Saved from Nazi Horrors", + "price": 12.36, + "rating": 3.0, + "url": "https://books.toscrape.com/orchestra-of-exiles-the-story-of-bronislaw-huberman-the-israel-philharmonic-and-the-one-thousand-jews-he-saved-from-nazi-horrors_337/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/15/de/15de75548ee9a4c6be1420ee309c03e0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "No One Here Gets Out Alive", + "price": 20.02, + "rating": 5.0, + "url": "https://books.toscrape.com/no-one-here-gets-out-alive_336/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7a/7e/7a7eb52e7075a5305522948375c1316e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Night Shift (Night Shift #1-20)", + "price": 12.75, + "rating": 4.0, + "url": "https://books.toscrape.com/night-shift-night-shift-1-20_335/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c0/02/c0029d48c2588e6d2a6a31c9f96088ba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Needful Things", + "price": 47.51, + "rating": 4.0, + "url": "https://books.toscrape.com/needful-things_334/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2d/e0/2de0eff716ca13d12cf5420e88e1a8b3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Mockingjay (The Hunger Games #3)", + "price": 20.44, + "rating": 4.0, + "url": "https://books.toscrape.com/mockingjay-the-hunger-games-3_333/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/76/b4/76b462eda7a84ccf39a543d63c695ca7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Misery", + "price": 34.79, + "rating": 2.0, + "url": "https://books.toscrape.com/misery_332/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7c/93/7c9302e392e128881e926d19f761da33.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Little Women (Little Women #1)", + "price": 28.07, + "rating": 4.0, + "url": "https://books.toscrape.com/little-women-little-women-1_331/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/81/f5/81f559ebe403317226fa8b611e35ce8a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "It", + "price": 25.01, + "rating": 3.0, + "url": "https://books.toscrape.com/it_330/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f7/b7/f7b73392b12909a1e8261ef3f96c5fd1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Harry Potter and the Sorcerer\u0027s Stone (Harry Potter #1)", + "price": 13.9, + "rating": 3.0, + "url": "https://books.toscrape.com/harry-potter-and-the-sorcerers-stone-harry-potter-1_329/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/04/c8/04c8a51d23d4335d300324e917ca4d8f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Harry Potter and the Prisoner of Azkaban (Harry Potter #3)", + "price": 24.17, + "rating": 4.0, + "url": "https://books.toscrape.com/harry-potter-and-the-prisoner-of-azkaban-harry-potter-3_328/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d1/fb/d1fbdddb0d4fb0c445a33c6d003d0990.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Harry Potter and the Order of the Phoenix (Harry Potter #5)", + "price": 31.63, + "rating": 4.0, + "url": "https://books.toscrape.com/harry-potter-and-the-order-of-the-phoenix-harry-potter-5_327/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/96/11/9611147982037cd7d79483452938c10f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Harry Potter and the Half-Blood Prince (Harry Potter #6)", + "price": 48.75, + "rating": 5.0, + "url": "https://books.toscrape.com/harry-potter-and-the-half-blood-prince-harry-potter-6_326/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c8/24/c8248518fb59de3a798a4b5baae949b5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Harry Potter and the Chamber of Secrets (Harry Potter #2)", + "price": 14.74, + "rating": 1.0, + "url": "https://books.toscrape.com/harry-potter-and-the-chamber-of-secrets-harry-potter-2_325/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fc/08/fc08dcfc1ae86bbd5bc0bca74c9b6d3d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Gone with the Wind", + "price": 32.49, + "rating": 3.0, + "url": "https://books.toscrape.com/gone-with-the-wind_324/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/27/82/2782701b5c877cb063065b9fc14c5b13.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "God Is Not Great: How Religion Poisons Everything", + "price": 27.8, + "rating": 1.0, + "url": "https://books.toscrape.com/god-is-not-great-how-religion-poisons-everything_323/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d2/80/d280aed3d0c46653a9c33f76559e9e6d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Girl With a Pearl Earring", + "price": 26.77, + "rating": 1.0, + "url": "https://books.toscrape.com/girl-with-a-pearl-earring_322/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b7/ad/b7ad37d93d8401c84d7325aa645ff6d5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Fruits Basket, Vol. 4 (Fruits Basket #4)", + "price": 50.44, + "rating": 4.0, + "url": "https://books.toscrape.com/fruits-basket-vol-4-fruits-basket-4_321/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/38/79/38794d8729a111018260d931e7101de2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Far From True (Promise Falls Trilogy #2)", + "price": 34.93, + "rating": 2.0, + "url": "https://books.toscrape.com/far-from-true-promise-falls-trilogy-2_320/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/87/54/8754267f27581996f93e8d94d3c04bf9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Dark Lover (Black Dagger Brotherhood #1)", + "price": 12.87, + "rating": 1.0, + "url": "https://books.toscrape.com/dark-lover-black-dagger-brotherhood-1_319/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3c/a2/3ca2e61181fc1122658af8f85354bae8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Confessions of a Shopaholic (Shopaholic #1)", + "price": 48.94, + "rating": 2.0, + "url": "https://books.toscrape.com/confessions-of-a-shopaholic-shopaholic-1_318/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e3/b5/e3b5a3dcc2993295f5a6fb429052799c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Changing the Game (Play by Play #2)", + "price": 13.38, + "rating": 3.0, + "url": "https://books.toscrape.com/changing-the-game-play-by-play-2_317/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/57/47/57472d9c6d483bee9c38c90bfa10b3ee.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Candide", + "price": 58.63, + "rating": 3.0, + "url": "https://books.toscrape.com/candide_316/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e3/c4/e3c4aba2409bb769a6488805e3fc4709.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Can You Keep a Secret?", + "price": 21.94, + "rating": 1.0, + "url": "https://books.toscrape.com/can-you-keep-a-secret_315/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/72/73/7273ff1bfe3b0a6aab7f54ddf9be7b44.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Atlas Shrugged", + "price": 26.58, + "rating": 5.0, + "url": "https://books.toscrape.com/atlas-shrugged_314/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a5/4f/a54fea8d034eba2ee4d1b8af30f1a308.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Animal Farm", + "price": 57.22, + "rating": 3.0, + "url": "https://books.toscrape.com/animal-farm_313/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/10/db/10db56354b4550d92270c6f097d9bebc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "A Walk to Remember", + "price": 56.43, + "rating": 1.0, + "url": "https://books.toscrape.com/a-walk-to-remember_312/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fa/1b/fa1b0fac146201645c740b02802e2211.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "A New Earth: Awakening to Your Life\u0027s Purpose", + "price": 55.65, + "rating": 5.0, + "url": "https://books.toscrape.com/a-new-earth-awakening-to-your-lifes-purpose_311/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/83/c8/83c834b3779be4e577c37ead6d2acf65.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "A History of God: The 4,000-Year Quest of Judaism, Christianity, and Islam", + "price": 27.62, + "rating": 1.0, + "url": "https://books.toscrape.com/a-history-of-god-the-4000-year-quest-of-judaism-christianity-and-islam_310/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/71/91/7191a7d76eb6c3a18259541e2c038ae3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "\u0027Salem\u0027s Lot", + "price": 49.56, + "rating": 4.0, + "url": "https://books.toscrape.com/salems-lot_309/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/d3/eed3afc5e444e3da5eec34e2b0036ec7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Zero History (Blue Ant #3)", + "price": 34.77, + "rating": 1.0, + "url": "https://books.toscrape.com/zero-history-blue-ant-3_308/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/74/52/74524b04dc99cbfc7bf5d37fcc1489ab.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Wuthering Heights", + "price": 17.73, + "rating": 3.0, + "url": "https://books.toscrape.com/wuthering-heights_307/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/93/4e/934e966c1ddf559d3ac2b5c1407aaf1e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "World War Z: An Oral History of the Zombie War", + "price": 21.8, + "rating": 1.0, + "url": "https://books.toscrape.com/world-war-z-an-oral-history-of-the-zombie-war_306/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7e/bf/7ebfa1c62b21beeaad37a6474a39cfe8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Wild: From Lost to Found on the Pacific Crest Trail", + "price": 46.02, + "rating": 3.0, + "url": "https://books.toscrape.com/wild-from-lost-to-found-on-the-pacific-crest-trail_305/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c8/41/c841873951efb18dea28162452efff58.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Where\u0027d You Go, Bernadette", + "price": 18.13, + "rating": 1.0, + "url": "https://books.toscrape.com/whered-you-go-bernadette_304/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c6/7e/c67eb0d6e56c4459e8c0d45c08471a89.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "When You Are Engulfed in Flames", + "price": 30.89, + "rating": 5.0, + "url": "https://books.toscrape.com/when-you-are-engulfed-in-flames_303/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/73/36/733662595aede2dff1a5be1e76a3b936.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "We the People: The Modern-Day Figures Who Have Reshaped and Affirmed the Founding Fathers\u0027 Vision of America", + "price": 31.95, + "rating": 3.0, + "url": "https://books.toscrape.com/we-the-people-the-modern-day-figures-who-have-reshaped-and-affirmed-the-founding-fathers-vision-of-america_302/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f6/52/f65271ce557e9192537e24847bbb1210.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "We Are All Completely Beside Ourselves", + "price": 24.04, + "rating": 1.0, + "url": "https://books.toscrape.com/we-are-all-completely-beside-ourselves_301/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4d/18/4d1891e435c6692c864331c585e0d014.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Walk the Edge (Thunder Road #2)", + "price": 32.36, + "rating": 3.0, + "url": "https://books.toscrape.com/walk-the-edge-thunder-road-2_300/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/2c/612ce7fa4cbee472392ce8721a4e863e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Voyager (Outlander #3)", + "price": 21.07, + "rating": 5.0, + "url": "https://books.toscrape.com/voyager-outlander-3_299/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b5/d8/b5d813da01f2ccd7bcfe34e2b875e752.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Very Good Lives: The Fringe Benefits of Failure and the Importance of Imagination", + "price": 50.66, + "rating": 3.0, + "url": "https://books.toscrape.com/very-good-lives-the-fringe-benefits-of-failure-and-the-importance-of-imagination_298/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ab/ac/abac4222af5cc296b704a0e5df82e162.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Vegan Vegetarian Omnivore: Dinner for Everyone at the Table", + "price": 13.66, + "rating": 2.0, + "url": "https://books.toscrape.com/vegan-vegetarian-omnivore-dinner-for-everyone-at-the-table_297/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/80/63/80631f8bca036361343fdce528725654.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Unstuffed: Decluttering Your Home, Mind, and Soul", + "price": 58.09, + "rating": 1.0, + "url": "https://books.toscrape.com/unstuffed-decluttering-your-home-mind-and-soul_296/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/14/07/1407c2d6318956b10abd970c2e83154d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Under the Banner of Heaven: A Story of Violent Faith", + "price": 30.0, + "rating": 1.0, + "url": "https://books.toscrape.com/under-the-banner-of-heaven-a-story-of-violent-faith_295/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/14/2f/142f99787241bb65e031a76e74e14d1b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Two Boys Kissing", + "price": 32.74, + "rating": 2.0, + "url": "https://books.toscrape.com/two-boys-kissing_294/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/53/bd/53bd80b1fc1914f418dc31a9d6571cb1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Twilight (Twilight #1)", + "price": 41.93, + "rating": 2.0, + "url": "https://books.toscrape.com/twilight-twilight-1_293/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/70/10/7010c24f80a4172f7405677ef0592f26.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Twenties Girl", + "price": 42.8, + "rating": 2.0, + "url": "https://books.toscrape.com/twenties-girl_292/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a0/fa/a0fa38039f6a674a7c89dfe2be866259.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Trespassing Across America: One Man\u0027s Epic, Never-Done-Before (and Sort of Illegal) Hike Across the Heartland", + "price": 53.51, + "rating": 1.0, + "url": "https://books.toscrape.com/trespassing-across-america-one-mans-epic-never-done-before-and-sort-of-illegal-hike-across-the-heartland_291/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/77/bc/77bcc3cde72998ee488ac169f7e4e540.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Three-Martini Lunch", + "price": 23.21, + "rating": 3.0, + "url": "https://books.toscrape.com/three-martini-lunch_290/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1d/8e/1d8eb8aaebd14464fc58a681091b8d45.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Thinking, Fast and Slow", + "price": 21.14, + "rating": 1.0, + "url": "https://books.toscrape.com/thinking-fast-and-slow_289/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b4/a5/b4a56663d56f1e84ee1b15bd819563cc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Wild Robot", + "price": 56.07, + "rating": 3.0, + "url": "https://books.toscrape.com/the-wild-robot_288/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bf/db/bfdbf9726621276fc7821d705690dbae.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Wicked + The Divine, Vol. 3: Commercial Suicide (The Wicked + The Divine)", + "price": 14.41, + "rating": 3.0, + "url": "https://books.toscrape.com/the-wicked-the-divine-vol-3-commercial-suicide-the-wicked-the-divine_287/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/ed/eeeddf8af9e6cc8c7f71c0e41de1b562.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Undomestic Goddess", + "price": 45.75, + "rating": 4.0, + "url": "https://books.toscrape.com/the-undomestic-goddess_286/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/13/8f/138f4cf84be250d08e1f5c1db3643dbc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Travelers", + "price": 15.77, + "rating": 1.0, + "url": "https://books.toscrape.com/the-travelers_285/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2a/a8/2aa8afd15f97617ab75f616766161cda.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Tipping Point: How Little Things Can Make a Big Difference", + "price": 10.02, + "rating": 2.0, + "url": "https://books.toscrape.com/the-tipping-point-how-little-things-can-make-a-big-difference_284/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/27/3d/273d4c813111bc482e8c473ebd90fbbb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Thing About Jellyfish", + "price": 48.77, + "rating": 1.0, + "url": "https://books.toscrape.com/the-thing-about-jellyfish_283/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e0/90/e090748ce5a567207aed9185c97eb34b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Stand", + "price": 57.86, + "rating": 2.0, + "url": "https://books.toscrape.com/the-stand_282/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3a/7c/3a7c2393061031e7911d7b533b723391.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Smitten Kitchen Cookbook", + "price": 23.59, + "rating": 1.0, + "url": "https://books.toscrape.com/the-smitten-kitchen-cookbook_281/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8e/09/8e09faaea71886048b27959e607e6c7b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Silkworm (Cormoran Strike #2)", + "price": 23.05, + "rating": 5.0, + "url": "https://books.toscrape.com/the-silkworm-cormoran-strike-2_280/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3a/2c/3a2c46cd40a7ecbd7c40815d6390fb8a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Sandman, Vol. 3: Dream Country (The Sandman (volumes) #3)", + "price": 55.55, + "rating": 5.0, + "url": "https://books.toscrape.com/the-sandman-vol-3-dream-country-the-sandman-volumes-3_279/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bb/18/bb1845c22faea465cad3d556d22936a2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Rose \u0026 the Dagger (The Wrath and the Dawn #2)", + "price": 58.64, + "rating": 4.0, + "url": "https://books.toscrape.com/the-rose-the-dagger-the-wrath-and-the-dawn-2_278/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/57/9c/579cd2ca789c8a796a1864d08ee8d686.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Road to Little Dribbling: Adventures of an American in Britain (Notes From a Small Island #2)", + "price": 23.21, + "rating": 1.0, + "url": "https://books.toscrape.com/the-road-to-little-dribbling-adventures-of-an-american-in-britain-notes-from-a-small-island-2_277/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e0/4f/e04f8eda2a2fa947aec17640202d9ab0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Rise of Theodore Roosevelt (Theodore Roosevelt #1)", + "price": 42.57, + "rating": 3.0, + "url": "https://books.toscrape.com/the-rise-of-theodore-roosevelt-theodore-roosevelt-1_276/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ff/d4/ffd45d95f314555e20c923d3522adea7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Restaurant at the End of the Universe (Hitchhiker\u0027s Guide to the Galaxy #2)", + "price": 10.92, + "rating": 1.0, + "url": "https://books.toscrape.com/the-restaurant-at-the-end-of-the-universe-hitchhikers-guide-to-the-galaxy-2_275/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b8/b2/b8b2956acc758a381beef87339c0a52f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Rest Is Noise: Listening to the Twentieth Century", + "price": 34.77, + "rating": 1.0, + "url": "https://books.toscrape.com/the-rest-is-noise-listening-to-the-twentieth-century_274/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4d/e1/4de1d174bf4ab498788c9488c9fd29fc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Red Tent", + "price": 35.66, + "rating": 5.0, + "url": "https://books.toscrape.com/the-red-tent_273/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b2/8f/b28f211e50e74445ca071d4279d1080d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Purpose Driven Life: What on Earth Am I Here for?", + "price": 37.19, + "rating": 3.0, + "url": "https://books.toscrape.com/the-purpose-driven-life-what-on-earth-am-i-here-for_272/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/95/08/9508e6b28fe4c63e67b3ef33f11eff98.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Purest Hook (Second Circle Tattoos #3)", + "price": 12.25, + "rating": 1.0, + "url": "https://books.toscrape.com/the-purest-hook-second-circle-tattoos-3_271/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/15/68/1568ef85fdb4e405b9f8bc62ef855c10.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Picture of Dorian Gray", + "price": 29.7, + "rating": 2.0, + "url": "https://books.toscrape.com/the-picture-of-dorian-gray_270/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a6/72/a67245346daa38c2b23a4fc64c6e7115.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Paris Wife", + "price": 36.8, + "rating": 3.0, + "url": "https://books.toscrape.com/the-paris-wife_269/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/01/c8/01c847671683538fcf084eede54d6270.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Obsession", + "price": 45.43, + "rating": 1.0, + "url": "https://books.toscrape.com/the-obsession_268/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/24/93/2493c74c614afcc435cc00e33bd55f64.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Nightingale", + "price": 26.26, + "rating": 4.0, + "url": "https://books.toscrape.com/the-nightingale_267/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/77/aa/77aa0ef1f62a0b0b40000a81f65c4e65.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The New Guy (and Other Senior Year Distractions)", + "price": 44.92, + "rating": 3.0, + "url": "https://books.toscrape.com/the-new-guy-and-other-senior-year-distractions_266/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d8/9d/d89dc869d5ea1462fd746ac6de97583f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Nanny Diaries (Nanny #1)", + "price": 52.53, + "rating": 5.0, + "url": "https://books.toscrape.com/the-nanny-diaries-nanny-1_265/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/63/5f/635fb981e464f7427787824b20a15e71.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Name of God is Mercy", + "price": 37.25, + "rating": 2.0, + "url": "https://books.toscrape.com/the-name-of-god-is-mercy_264/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d2/41/d241ca89679593a589a6614162ab6eb6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Maze Runner (The Maze Runner #1)", + "price": 20.93, + "rating": 1.0, + "url": "https://books.toscrape.com/the-maze-runner-the-maze-runner-1_263/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5e/87/5e87e44785de47c2a03091deaa82330f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Lover\u0027s Dictionary", + "price": 58.09, + "rating": 2.0, + "url": "https://books.toscrape.com/the-lovers-dictionary_262/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/47/e7/47e7563b0731a2b8131233f70d211f7a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Lonely Ones", + "price": 43.59, + "rating": 5.0, + "url": "https://books.toscrape.com/the-lonely-ones_261/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/21/bd/21bdf7ae21476b1debf4aa3eefe6f29d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Lean Startup: How Today\u0027s Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses", + "price": 33.92, + "rating": 3.0, + "url": "https://books.toscrape.com/the-lean-startup-how-todays-entrepreneurs-use-continuous-innovation-to-create-radically-successful-businesses_260/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/39/f1/39f167dff90d7f84f5c8dc5e05d4051b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Last Painting of Sara de Vos", + "price": 55.55, + "rating": 2.0, + "url": "https://books.toscrape.com/the-last-painting-of-sara-de-vos_259/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bf/fd/bffd473ab232c5f35e8c81bb927f1624.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Land of 10,000 Madonnas", + "price": 29.64, + "rating": 4.0, + "url": "https://books.toscrape.com/the-land-of-10000-madonnas_258/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/93/ae93b007df22c99ea2ff2f907b06663e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Infinities", + "price": 27.41, + "rating": 1.0, + "url": "https://books.toscrape.com/the-infinities_257/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9c/44/9c445b33d53b3810f1c12f4adad71a27.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Husband\u0027s Secret", + "price": 52.51, + "rating": 5.0, + "url": "https://books.toscrape.com/the-husbands-secret_256/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f0/5b/f05be79a4b319e24819c318e35e6963c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Hitchhiker\u0027s Guide to the Galaxy (Hitchhiker\u0027s Guide to the Galaxy #1)", + "price": 47.8, + "rating": 3.0, + "url": "https://books.toscrape.com/the-hitchhikers-guide-to-the-galaxy-hitchhikers-guide-to-the-galaxy-1_255/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/74/41747f533b211d324799a03dc64ed175.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Guns of August", + "price": 14.54, + "rating": 2.0, + "url": "https://books.toscrape.com/the-guns-of-august_254/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/c8/06c897070611b78b80a37333cbb7851c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Guernsey Literary and Potato Peel Pie Society", + "price": 49.53, + "rating": 1.0, + "url": "https://books.toscrape.com/the-guernsey-literary-and-potato-peel-pie-society_253/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/18/f7/18f7bf6366cd7a8b947fd790d808047b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Goldfinch", + "price": 43.58, + "rating": 3.0, + "url": "https://books.toscrape.com/the-goldfinch_252/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fb/4d/fb4dde3351d00ef104f29aeecd2d41fb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Giver (The Giver Quartet #1)", + "price": 12.3, + "rating": 1.0, + "url": "https://books.toscrape.com/the-giver-the-giver-quartet-1_251/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b3/ed/b3eda9490c9e2ed02c3a8650e687731b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Girl with All the Gifts", + "price": 49.47, + "rating": 3.0, + "url": "https://books.toscrape.com/the-girl-with-all-the-gifts_250/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/c7/41c74d82b853606fe98182c417b4669c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Girl Who Played with Fire (Millennium Trilogy #2)", + "price": 22.14, + "rating": 2.0, + "url": "https://books.toscrape.com/the-girl-who-played-with-fire-millennium-trilogy-2_249/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/11/71/117145e4525b2e801e2cd1ba4dd70441.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Girl Who Kicked the Hornet\u0027s Nest (Millennium Trilogy #3)", + "price": 57.48, + "rating": 1.0, + "url": "https://books.toscrape.com/the-girl-who-kicked-the-hornets-nest-millennium-trilogy-3_248/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2a/a2/2aa2d8c4a8bfc1972c806ca16718e5c5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Exiled", + "price": 43.45, + "rating": 3.0, + "url": "https://books.toscrape.com/the-exiled_247/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2d/1a/2d1aeb1cc8a23064164e230fa232cc04.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The End of Faith: Religion, Terror, and the Future of Reason", + "price": 22.13, + "rating": 4.0, + "url": "https://books.toscrape.com/the-end-of-faith-religion-terror-and-the-future-of-reason_246/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9d/56/9d5631724c6496b2f012fa5d2f2b6abd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Elegant Universe: Superstrings, Hidden Dimensions, and the Quest for the Ultimate Theory", + "price": 13.03, + "rating": 4.0, + "url": "https://books.toscrape.com/the-elegant-universe-superstrings-hidden-dimensions-and-the-quest-for-the-ultimate-theory_245/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/69/c8/69c83860995cde393dbe6690ec3f1d4f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Disappearing Spoon: And Other True Tales of Madness, Love, and the History of the World from the Periodic Table of the Elements", + "price": 57.35, + "rating": 5.0, + "url": "https://books.toscrape.com/the-disappearing-spoon-and-other-true-tales-of-madness-love-and-the-history-of-the-world-from-the-periodic-table-of-the-elements_244/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f9/69/f969969428b505970a46272fdcea00d3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Devil Wears Prada (The Devil Wears Prada #1)", + "price": 44.29, + "rating": 1.0, + "url": "https://books.toscrape.com/the-devil-wears-prada-the-devil-wears-prada-1_243/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/87/d3/87d34d376555dd0cb75030d1059cc144.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Demon-Haunted World: Science as a Candle in the Dark", + "price": 52.25, + "rating": 4.0, + "url": "https://books.toscrape.com/the-demon-haunted-world-science-as-a-candle-in-the-dark_242/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4a/35/4a352dc298e4bbe6ba5f81bbc0d41ca0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Day the Crayons Came Home (Crayons)", + "price": 26.33, + "rating": 5.0, + "url": "https://books.toscrape.com/the-day-the-crayons-came-home-crayons_241/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ec/08/ec08efebaa33a403e54080b48c139794.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Da Vinci Code (Robert Langdon #2)", + "price": 22.96, + "rating": 2.0, + "url": "https://books.toscrape.com/the-da-vinci-code-robert-langdon-2_240/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cf/d5/cfd553eaa00f4d6091c459081cd98199.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Cuckoo\u0027s Calling (Cormoran Strike #1)", + "price": 19.21, + "rating": 1.0, + "url": "https://books.toscrape.com/the-cuckoos-calling-cormoran-strike-1_239/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/11/81/11815f24d043f77d4f09a3522a688a5c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Complete Stories and Poems (The Works of Edgar Allan Poe [Cameo Edition])", + "price": 26.78, + "rating": 4.0, + "url": "https://books.toscrape.com/the-complete-stories-and-poems-the-works-of-edgar-allan-poe-cameo-edition_238/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/42/c4/42c48f11b7e70a0f76c5ba9cb5c5018a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Complete Poems", + "price": 41.32, + "rating": 5.0, + "url": "https://books.toscrape.com/the-complete-poems_237/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e5/f2/e5f270cf4a079a7d411439abe17691e0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The Catcher in the Rye", + "price": 24.55, + "rating": 1.0, + "url": "https://books.toscrape.com/the-catcher-in-the-rye_236/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/70/f4/70f4dbf8110363f4e7ef32db0ce2a675.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Cat in the Hat (Beginner Books B-1)", + "price": 16.26, + "rating": 2.0, + "url": "https://books.toscrape.com/the-cat-in-the-hat-beginner-books-b-1_235/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9b/f1/9bf106306301a44635aa7bd381c84e4d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Case for Christ (Cases for Christianity)", + "price": 47.84, + "rating": 1.0, + "url": "https://books.toscrape.com/the-case-for-christ-cases-for-christianity_234/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/12/3d/123d05986974943a58c5cfa518e11e6d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Book Thief", + "price": 53.49, + "rating": 2.0, + "url": "https://books.toscrape.com/the-book-thief_233/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ff/a0/ffa08bf29ae0a5c9e91564dba71cde90.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Book of Basketball: The NBA According to The Sports Guy", + "price": 44.84, + "rating": 5.0, + "url": "https://books.toscrape.com/the-book-of-basketball-the-nba-according-to-the-sports-guy_232/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/2c/612caeb0b2acb35c100629f0f52a40d7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Blind Side: Evolution of a Game", + "price": 53.71, + "rating": 5.0, + "url": "https://books.toscrape.com/the-blind-side-evolution-of-a-game_231/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5e/ee/5eeecab909b9e87ddfb6e3d31078fbbf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Autobiography of Malcolm X", + "price": 23.43, + "rating": 2.0, + "url": "https://books.toscrape.com/the-autobiography-of-malcolm-x_230/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/84/07/84074b59293cc5bf4012ef0f60e90c4f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Art of Simple Food: Notes, Lessons, and Recipes from a Delicious Revolution", + "price": 34.32, + "rating": 3.0, + "url": "https://books.toscrape.com/the-art-of-simple-food-notes-lessons-and-recipes-from-a-delicious-revolution_229/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/96/57/9657c6d89024e343879a7b5512474f1e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Art of Fielding", + "price": 22.1, + "rating": 1.0, + "url": "https://books.toscrape.com/the-art-of-fielding_228/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/68/a6/68a6112c857e595c684f2a1a3287ba16.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Surely You\u0027re Joking, Mr. Feynman!: Adventures of a Curious Character", + "price": 25.83, + "rating": 2.0, + "url": "https://books.toscrape.com/surely-youre-joking-mr-feynman-adventures-of-a-curious-character_227/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f8/bc/f8bcd489d33473e0819beaecccd5ebac.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Stiff: The Curious Lives of Human Cadavers", + "price": 36.74, + "rating": 3.0, + "url": "https://books.toscrape.com/stiff-the-curious-lives-of-human-cadavers_226/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a0/a0/a0a013b029130df92073f547df83ee5c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Spilled Milk: Based on a True Story", + "price": 49.51, + "rating": 1.0, + "url": "https://books.toscrape.com/spilled-milk-based-on-a-true-story_225/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a8/0d/a80d4310cab08a3660149fd3f2cf15c7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Something Borrowed (Darcy \u0026 Rachel #1)", + "price": 48.96, + "rating": 5.0, + "url": "https://books.toscrape.com/something-borrowed-darcy-rachel-1_224/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6d/6d/6d6d5799190b4f9ef89f3bbc8b67d60d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Something Blue (Darcy \u0026 Rachel #2)", + "price": 54.62, + "rating": 1.0, + "url": "https://books.toscrape.com/something-blue-darcy-rachel-2_223/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/72/f5/72f5ed312bc82afa386c9cd48d4e36dd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Soldier (Talon #3)", + "price": 24.72, + "rating": 2.0, + "url": "https://books.toscrape.com/soldier-talon-3_222/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7b/96/7b96f6e11b388ee800c7fd17fe479444.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Shopaholic \u0026 Baby (Shopaholic #5)", + "price": 46.45, + "rating": 2.0, + "url": "https://books.toscrape.com/shopaholic-baby-shopaholic-5_221/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f0/a4/f0a48c8cc6acd322eacd9d35e55d63e7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Seven Days in the Art World", + "price": 52.33, + "rating": 2.0, + "url": "https://books.toscrape.com/seven-days-in-the-art-world_220/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/35/2c/352c1a7e155c5d03d073bf8ce1564caa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Seven Brief Lessons on Physics", + "price": 30.6, + "rating": 4.0, + "url": "https://books.toscrape.com/seven-brief-lessons-on-physics_219/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c8/63/c863c222c130a1bc8685a1242dd2523d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Scarlet (The Lunar Chronicles #2)", + "price": 14.57, + "rating": 4.0, + "url": "https://books.toscrape.com/scarlet-the-lunar-chronicles-2_218/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b6/5c/b65c3622c0da689990fd1d7f1a0b826c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Sarah\u0027s Key", + "price": 46.29, + "rating": 1.0, + "url": "https://books.toscrape.com/sarahs-key_217/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/95/b2/95b235aeeae2d1849b78562f36e10aec.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Saga, Volume 3 (Saga (Collected Editions) #3)", + "price": 21.57, + "rating": 5.0, + "url": "https://books.toscrape.com/saga-volume-3-saga-collected-editions-3_216/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d8/fd/d8fd30b3e5781e880a3efe4c9495b417.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Running with Scissors", + "price": 12.91, + "rating": 4.0, + "url": "https://books.toscrape.com/running-with-scissors_215/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/66/c7/66c7a1537c8901e1e4ec217d1956bae8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Rogue Lawyer (Rogue Lawyer #1)", + "price": 50.11, + "rating": 3.0, + "url": "https://books.toscrape.com/rogue-lawyer-rogue-lawyer-1_214/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/92/e4/92e4e180ba8fbde3b8ac0c1e71cfc5f4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Rise of the Rocket Girls: The Women Who Propelled Us, from Missiles to the Moon to Mars", + "price": 41.67, + "rating": 4.0, + "url": "https://books.toscrape.com/rise-of-the-rocket-girls-the-women-who-propelled-us-from-missiles-to-the-moon-to-mars_213/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/05/42/05428b0c7b79d0dbc521fd621e754083.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Rework", + "price": 44.88, + "rating": 2.0, + "url": "https://books.toscrape.com/rework_212/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/54/10/5410a58193e2373c04b3021ade78a82b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Reservations for Two", + "price": 11.1, + "rating": 3.0, + "url": "https://books.toscrape.com/reservations-for-two_211/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/39/a4/39a4d96a5bc75a34aae97676a4b854fa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Red: The True Story of Red Riding Hood", + "price": 28.54, + "rating": 3.0, + "url": "https://books.toscrape.com/red-the-true-story-of-red-riding-hood_210/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/70/4e/704e81b05e56dd84ecf607ea283952db.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Ready Player One", + "price": 19.07, + "rating": 4.0, + "url": "https://books.toscrape.com/ready-player-one_209/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/51/34/513418bd1c6114f3ea1fd703278e20ef.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Quiet: The Power of Introverts in a World That Can\u0027t Stop Talking", + "price": 43.55, + "rating": 1.0, + "url": "https://books.toscrape.com/quiet-the-power-of-introverts-in-a-world-that-cant-stop-talking_208/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/3a/ee3aebe36d1d0fa11a95a07067294b8c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Prodigy: The Graphic Novel (Legend: The Graphic Novel #2)", + "price": 43.63, + "rating": 3.0, + "url": "https://books.toscrape.com/prodigy-the-graphic-novel-legend-the-graphic-novel-2_207/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c9/a5/c9a559e3ba407c1d70ebfc4e2f0d82db.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Persepolis: The Story of a Childhood (Persepolis #1-2)", + "price": 39.13, + "rating": 1.0, + "url": "https://books.toscrape.com/persepolis-the-story-of-a-childhood-persepolis-1-2_206/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/14/98/14987a55d9609e706d2619814e2a8b0a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Packing for Mars: The Curious Science of Life in the Void", + "price": 56.68, + "rating": 2.0, + "url": "https://books.toscrape.com/packing-for-mars-the-curious-science-of-life-in-the-void_205/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8d/72/8d7216b05e1b5edf9bdb0d2db295ca33.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Outliers: The Story of Success", + "price": 14.16, + "rating": 1.0, + "url": "https://books.toscrape.com/outliers-the-story-of-success_204/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/70/37/70372ab3240019fbe2de6cd407c98675.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Original Fake", + "price": 31.45, + "rating": 3.0, + "url": "https://books.toscrape.com/original-fake_203/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e7/29/e72934871f9b42a807d976670a446e12.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Orange Is the New Black", + "price": 24.61, + "rating": 2.0, + "url": "https://books.toscrape.com/orange-is-the-new-black_202/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d9/ea/d9ea34aea25469189bca07af6a18790a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "One for the Money (Stephanie Plum #1)", + "price": 32.87, + "rating": 2.0, + "url": "https://books.toscrape.com/one-for-the-money-stephanie-plum-1_201/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4e/52/4e52f087337abef25de62845f093ed6e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Notes from a Small Island (Notes From a Small Island #1)", + "price": 40.17, + "rating": 1.0, + "url": "https://books.toscrape.com/notes-from-a-small-island-notes-from-a-small-island-1_200/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/39/61393c43f7caaccaa07daccaa8530736.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Night (The Night Trilogy #1)", + "price": 13.51, + "rating": 1.0, + "url": "https://books.toscrape.com/night-the-night-trilogy-1_199/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e3/cc/e3ccf96311f9c1b9e9ecc80e16c05f4e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Neither Here nor There: Travels in Europe", + "price": 38.95, + "rating": 3.0, + "url": "https://books.toscrape.com/neither-here-nor-there-travels-in-europe_198/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/81/0681530a7bc301caf5c3257e1b0f0750.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Naked", + "price": 31.69, + "rating": 3.0, + "url": "https://books.toscrape.com/naked_197/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e7/12/e71268a559d73826aa64151d47357a12.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Morning Star (Red Rising #3)", + "price": 29.4, + "rating": 1.0, + "url": "https://books.toscrape.com/morning-star-red-rising-3_196/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b5/f0/b5f04530d0343e763a80ef3f2dbdb386.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Miracles from Heaven: A Little Girl, Her Journey to Heaven, and Her Amazing Story of Healing", + "price": 57.83, + "rating": 1.0, + "url": "https://books.toscrape.com/miracles-from-heaven-a-little-girl-her-journey-to-heaven-and-her-amazing-story-of-healing_195/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7c/8e/7c8ea0cef3825cc6ddae55267c55a59e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Midnight Riot (Peter Grant/ Rivers of London - books #1)", + "price": 55.46, + "rating": 2.0, + "url": "https://books.toscrape.com/midnight-riot-peter-grant-rivers-of-london-books-1_194/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e6/57/e6574a313ad7e6adf97a1d71318f9a7f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Me Talk Pretty One Day", + "price": 57.6, + "rating": 2.0, + "url": "https://books.toscrape.com/me-talk-pretty-one-day_193/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/98/9f/989fe700e9e6bdec4fc3217daa5b7df3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Manuscript Found in Accra", + "price": 34.98, + "rating": 2.0, + "url": "https://books.toscrape.com/manuscript-found-in-accra_192/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/26/b7/26b72a3c1cf2a8afdbe92fa1a1d78f41.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Lust \u0026 Wonder", + "price": 11.87, + "rating": 2.0, + "url": "https://books.toscrape.com/lust-wonder_191/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/61/ba/61ba5bc1ee3d8cb3dd350120ffa3f31e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Lila (Gilead #3)", + "price": 12.47, + "rating": 3.0, + "url": "https://books.toscrape.com/lila-gilead-3_190/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2b/99/2b99a765a013979637b4a6726bfb10f5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Life, the Universe and Everything (Hitchhiker\u0027s Guide to the Galaxy #3)", + "price": 33.26, + "rating": 2.0, + "url": "https://books.toscrape.com/life-the-universe-and-everything-hitchhikers-guide-to-the-galaxy-3_189/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ef/8b/ef8bc5adcd3bea8e8ba97be76d07a32a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Life Without a Recipe", + "price": 59.04, + "rating": 5.0, + "url": "https://books.toscrape.com/life-without-a-recipe_188/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/80/b3/80b3e38be4204b3b64cdbe8c80dcf1f9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Life After Life", + "price": 26.13, + "rating": 2.0, + "url": "https://books.toscrape.com/life-after-life_187/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/59/80/59803a88c2e5dd7a2e36de1d41f7f1ae.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Letter to a Christian Nation", + "price": 22.2, + "rating": 1.0, + "url": "https://books.toscrape.com/letter-to-a-christian-nation_186/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/74/c2/74c2893188f917409ba564d46f481f77.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Let\u0027s Pretend This Never Happened: A Mostly True Memoir", + "price": 45.11, + "rating": 1.0, + "url": "https://books.toscrape.com/lets-pretend-this-never-happened-a-mostly-true-memoir_185/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/78/e1/78e1b9ccc99ba11d78015f0a18f0b421.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Legend (Legend #1)", + "price": 43.69, + "rating": 4.0, + "url": "https://books.toscrape.com/legend-legend-1_184/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6c/6c/6c6c0984ab57d6b4f71d84dd0db0f65b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Lean In: Women, Work, and the Will to Lead", + "price": 25.02, + "rating": 1.0, + "url": "https://books.toscrape.com/lean-in-women-work-and-the-will-to-lead_183/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4f/e5/4fe55bc7134401f6db04f0775ead1d4c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Lamb: The Gospel According to Biff, Christ\u0027s Childhood Pal", + "price": 55.5, + "rating": 5.0, + "url": "https://books.toscrape.com/lamb-the-gospel-according-to-biff-christs-childhood-pal_182/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a1/03/a10370da29e4ba78c7a75a14041eae0e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Lady Renegades (Rebel Belle #3)", + "price": 53.04, + "rating": 5.0, + "url": "https://books.toscrape.com/lady-renegades-rebel-belle-3_181/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d2/c2/d2c259e13fe3097325549a14f996b462.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Jurassic Park (Jurassic Park #1)", + "price": 44.97, + "rating": 1.0, + "url": "https://books.toscrape.com/jurassic-park-jurassic-park-1_180/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9a/71/9a7160b396790bd4a351522278de4f8c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "It\u0027s Never Too Late to Begin Again: Discovering Creativity and Meaning at Midlife and Beyond", + "price": 42.38, + "rating": 1.0, + "url": "https://books.toscrape.com/its-never-too-late-to-begin-again-discovering-creativity-and-meaning-at-midlife-and-beyond_179/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fa/36/fa3659740e31eb57775cc2647654bf11.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Is Everyone Hanging Out Without Me? (And Other Concerns)", + "price": 20.11, + "rating": 3.0, + "url": "https://books.toscrape.com/is-everyone-hanging-out-without-me-and-other-concerns_178/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6b/94/6b94e98f822a42c03c4ff0b9cfdd6e0c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Into the Wild", + "price": 56.7, + "rating": 5.0, + "url": "https://books.toscrape.com/into-the-wild_177/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e2/ca/e2ca3b870db8071034edea19b1da3de2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Inferno (Robert Langdon #4)", + "price": 41.0, + "rating": 5.0, + "url": "https://books.toscrape.com/inferno-robert-langdon-4_176/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e3/11/e3111146083821b5a3670d869ab40d2a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "In the Garden of Beasts: Love, Terror, and an American Family in Hitler\u0027s Berlin", + "price": 28.85, + "rating": 3.0, + "url": "https://books.toscrape.com/in-the-garden-of-beasts-love-terror-and-an-american-family-in-hitlers-berlin_175/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/25/82/2582a9f11ad68a30e44cc0b459383474.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "If I Run (If I Run #1)", + "price": 49.97, + "rating": 4.0, + "url": "https://books.toscrape.com/if-i-run-if-i-run-1_174/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c3/d0/c3d0f2fb5cacbca64639a679b962e1b9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "I\u0027ve Got Your Number", + "price": 19.69, + "rating": 1.0, + "url": "https://books.toscrape.com/ive-got-your-number_173/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b2/df/b2df826432771838819db89c20e20609.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "I Am Malala: The Girl Who Stood Up for Education and Was Shot by the Taliban", + "price": 28.88, + "rating": 2.0, + "url": "https://books.toscrape.com/i-am-malala-the-girl-who-stood-up-for-education-and-was-shot-by-the-taliban_172/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/52/7a/527a7d3b9b4928c093cadd75661bf467.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Hungry Girl Clean \u0026 Hungry: Easy All-Natural Recipes for Healthy Eating in the Real World", + "price": 33.14, + "rating": 3.0, + "url": "https://books.toscrape.com/hungry-girl-clean-hungry-easy-all-natural-recipes-for-healthy-eating-in-the-real-world_171/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6f/c4/6fc450625cd672e871a6176f74909be2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "House of Lost Worlds: Dinosaurs, Dynasties, and the Story of Life on Earth", + "price": 43.7, + "rating": 2.0, + "url": "https://books.toscrape.com/house-of-lost-worlds-dinosaurs-dynasties-and-the-story-of-life-on-earth_170/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/43/fd/43fda1db93163d67705264dcfa98aaa5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "House of Leaves", + "price": 54.89, + "rating": 1.0, + "url": "https://books.toscrape.com/house-of-leaves_169/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/14/25/142563ccee483bc07632f9c083a68326.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Horrible Bear!", + "price": 37.52, + "rating": 2.0, + "url": "https://books.toscrape.com/horrible-bear_168/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d2/63/d26337dee5c0b13b56b7aea59d611570.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Holidays on Ice", + "price": 51.07, + "rating": 2.0, + "url": "https://books.toscrape.com/holidays-on-ice_167/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4b/9a/4b9a2a6d4c995e12fe216f6173a582be.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Heir to the Sky", + "price": 44.07, + "rating": 4.0, + "url": "https://books.toscrape.com/heir-to-the-sky_166/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6d/b1/6db1568e09d10652593638a5f85e7202.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Green Eggs and Ham (Beginner Books B-16)", + "price": 10.79, + "rating": 4.0, + "url": "https://books.toscrape.com/green-eggs-and-ham-beginner-books-b-16_165/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3a/0e/3a0e75e4f758f90a80965869afbe41b4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Grayson, Vol 3: Nemesis (Grayson #3)", + "price": 42.72, + "rating": 1.0, + "url": "https://books.toscrape.com/grayson-vol-3-nemesis-grayson-3_164/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f9/4c/f94cfc3c82abb799568d1ea029b1d3d1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Gratitude", + "price": 26.66, + "rating": 5.0, + "url": "https://books.toscrape.com/gratitude_163/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/07/b6/07b673e7d367a5e89418bd513a8d5e72.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Gone Girl", + "price": 37.6, + "rating": 5.0, + "url": "https://books.toscrape.com/gone-girl_162/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/24/ad/24ad42075b1aa1403aef934c29c1e8ba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Golden (Heart of Dread #3)", + "price": 42.21, + "rating": 4.0, + "url": "https://books.toscrape.com/golden-heart-of-dread-3_161/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/39/2f/392fedbcda7bf8f968d5e6643ea5545f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Girl in the Blue Coat", + "price": 46.83, + "rating": 2.0, + "url": "https://books.toscrape.com/girl-in-the-blue-coat_160/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bf/7a/bf7a5bc1d1ebac5e9b6fbb147828a123.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Fruits Basket, Vol. 3 (Fruits Basket #3)", + "price": 45.17, + "rating": 2.0, + "url": "https://books.toscrape.com/fruits-basket-vol-3-fruits-basket-3_159/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7b/e7/7be75475a916d6df4edebfc5fe36c3f9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Friday Night Lights: A Town, a Team, and a Dream", + "price": 51.22, + "rating": 3.0, + "url": "https://books.toscrape.com/friday-night-lights-a-town-a-team-and-a-dream_158/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7d/cf/7dcf6c3b419bf7e7e3b3b8162b177869.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Fire Bound (Sea Haven/Sisters of the Heart #5)", + "price": 21.28, + "rating": 4.0, + "url": "https://books.toscrape.com/fire-bound-sea-havensisters-of-the-heart-5_157/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cd/53/cd53431a069ee01572988de29ef68da5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Fifty Shades Freed (Fifty Shades #3)", + "price": 15.36, + "rating": 5.0, + "url": "https://books.toscrape.com/fifty-shades-freed-fifty-shades-3_156/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/18/d8/18d8e02c75c2ef23556c9746fae57e43.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Fellside", + "price": 38.62, + "rating": 1.0, + "url": "https://books.toscrape.com/fellside_155/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f4/8f/f48f179d6bda290b66b2d165e0a419e6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Extreme Prey (Lucas Davenport #26)", + "price": 25.4, + "rating": 3.0, + "url": "https://books.toscrape.com/extreme-prey-lucas-davenport-26_154/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/de/86/de86d4f1563fad2ca088922fbbb2b36a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Eragon (The Inheritance Cycle #1)", + "price": 43.87, + "rating": 3.0, + "url": "https://books.toscrape.com/eragon-the-inheritance-cycle-1_153/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2d/62/2d625f26cb3bbeef851221f125b81daf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Eclipse (Twilight #3)", + "price": 18.74, + "rating": 1.0, + "url": "https://books.toscrape.com/eclipse-twilight-3_152/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/05/f8/05f833af99c37decb506e34e36f5cdaf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Dune (Dune #1)", + "price": 54.86, + "rating": 1.0, + "url": "https://books.toscrape.com/dune-dune-1_151/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7a/bc/7abccb865ecf9b0f676800b10c71cfd6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Dracula", + "price": 52.62, + "rating": 3.0, + "url": "https://books.toscrape.com/dracula_150/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ef/d7/efd7c316b4d60a403ba6d111fdeb2d41.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Do Androids Dream of Electric Sheep? (Blade Runner #1)", + "price": 51.48, + "rating": 1.0, + "url": "https://books.toscrape.com/do-androids-dream-of-electric-sheep-blade-runner-1_149/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fa/65/fa653fbe3a4c69227c9b79d471cee576.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Disrupted: My Misadventure in the Start-Up Bubble", + "price": 15.28, + "rating": 5.0, + "url": "https://books.toscrape.com/disrupted-my-misadventure-in-the-start-up-bubble_148/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2c/32/2c32dd01215c98fc1f6b176b6a9b3ece.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Dead Wake: The Last Crossing of the Lusitania", + "price": 39.24, + "rating": 5.0, + "url": "https://books.toscrape.com/dead-wake-the-last-crossing-of-the-lusitania_147/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/69/0e/690ee5b7ef94ea460861eee2e67fd787.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "David and Goliath: Underdogs, Misfits, and the Art of Battling Giants", + "price": 17.81, + "rating": 1.0, + "url": "https://books.toscrape.com/david-and-goliath-underdogs-misfits-and-the-art-of-battling-giants_146/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/df/95/df9520adbabbb17f22fcb3f49c69640f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Darkfever (Fever #1)", + "price": 56.02, + "rating": 1.0, + "url": "https://books.toscrape.com/darkfever-fever-1_145/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/af/08/af08d08c90b4df63ca5a2819a754da18.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Dark Places", + "price": 23.9, + "rating": 5.0, + "url": "https://books.toscrape.com/dark-places_144/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/51/bf/51bf575f9af355f4f9f98abe8986402a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Crazy Rich Asians (Crazy Rich Asians #1)", + "price": 49.13, + "rating": 5.0, + "url": "https://books.toscrape.com/crazy-rich-asians-crazy-rich-asians-1_143/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9a/62/9a621372fed3a80015283013d8a452cd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Counting Thyme", + "price": 10.62, + "rating": 1.0, + "url": "https://books.toscrape.com/counting-thyme_142/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e0/ae/e0ae97753a73b88b61b13b19977613dc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Cosmos", + "price": 36.17, + "rating": 2.0, + "url": "https://books.toscrape.com/cosmos_141/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/65/7b/657b1d20ea50775c5c87e039ed8aeebc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Civilization and Its Discontents", + "price": 59.95, + "rating": 2.0, + "url": "https://books.toscrape.com/civilization-and-its-discontents_140/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4d/a6/4da6939a6bbd895a5acdeabad46d1f9f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Cinder (The Lunar Chronicles #1)", + "price": 26.09, + "rating": 1.0, + "url": "https://books.toscrape.com/cinder-the-lunar-chronicles-1_139/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4e/d2/4ed2ec75df84ba1093fc4141b29abab3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Catastrophic Happiness: Finding Joy in Childhood\u0027s Messy Years", + "price": 37.35, + "rating": 2.0, + "url": "https://books.toscrape.com/catastrophic-happiness-finding-joy-in-childhoods-messy-years_138/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7d/0b/7d0bb832760e81c281d8d283ba6a2b09.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Career of Evil (Cormoran Strike #3)", + "price": 24.72, + "rating": 2.0, + "url": "https://books.toscrape.com/career-of-evil-cormoran-strike-3_137/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9e/ff/9eff8b66d583e8f0ba58a0bc86de40f2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Breaking Dawn (Twilight #4)", + "price": 35.28, + "rating": 5.0, + "url": "https://books.toscrape.com/breaking-dawn-twilight-4_136/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ce/24/ce242d3eb00bf1938d6c18e0261ef868.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Brave Enough", + "price": 51.32, + "rating": 5.0, + "url": "https://books.toscrape.com/brave-enough_135/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/94/c7/94c7add56827e01998189a021ec060e2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Boy Meets Boy", + "price": 21.12, + "rating": 3.0, + "url": "https://books.toscrape.com/boy-meets-boy_134/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/ac/0baceb72d202880d1441a32193df6e11.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the World Has Never Seen", + "price": 27.35, + "rating": 2.0, + "url": "https://books.toscrape.com/born-to-run-a-hidden-tribe-superathletes-and-the-greatest-race-the-world-has-never-seen_133/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ea/ee/eaee98b302dcaf91d1122816ae553295.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Blink: The Power of Thinking Without Thinking", + "price": 21.74, + "rating": 5.0, + "url": "https://books.toscrape.com/blink-the-power-of-thinking-without-thinking_132/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5d/41/5d415bc31b1f856a2a9dc8706fd19abd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Black Flags: The Rise of ISIS", + "price": 40.87, + "rating": 1.0, + "url": "https://books.toscrape.com/black-flags-the-rise-of-isis_131/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/48/5d/485d2c4cedd639fcb005340a8d589bb3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Black Butler, Vol. 1 (Black Butler #1)", + "price": 49.31, + "rating": 1.0, + "url": "https://books.toscrape.com/black-butler-vol-1-black-butler-1_130/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/99/48/9948564dec3ac2f9e32419911b181e37.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Big Little Lies", + "price": 22.11, + "rating": 1.0, + "url": "https://books.toscrape.com/big-little-lies_129/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ef/b7/efb72b546fc7cab4ba1735b4b82c5851.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Between Shades of Gray", + "price": 20.79, + "rating": 5.0, + "url": "https://books.toscrape.com/between-shades-of-gray_128/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f9/19/f919f64fc0e3642cdc604134bfd93774.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Best of My Love (Fool\u0027s Gold #20)", + "price": 27.41, + "rating": 2.0, + "url": "https://books.toscrape.com/best-of-my-love-fools-gold-20_127/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/06/8c/068ccab8875670fccb8b72234370d16f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Beowulf", + "price": 38.35, + "rating": 2.0, + "url": "https://books.toscrape.com/beowulf_126/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/dd/6e/dd6e7b84e99f3b4b5655ea0db74af2b4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Beautiful Creatures (Caster Chronicles #1)", + "price": 21.55, + "rating": 5.0, + "url": "https://books.toscrape.com/beautiful-creatures-caster-chronicles-1_125/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/82/06/8206f351bd1ff6f52eed515a3b366916.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Awkward", + "price": 38.02, + "rating": 2.0, + "url": "https://books.toscrape.com/awkward_124/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/41/72/417255e608c389aedfb68491dae92c9c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Ash", + "price": 22.06, + "rating": 4.0, + "url": "https://books.toscrape.com/ash_123/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d7/f0/d7f00033bda3779b2fd017e32e7c800c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Are We There Yet?", + "price": 10.66, + "rating": 3.0, + "url": "https://books.toscrape.com/are-we-there-yet_122/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f8/be/f8be3238a1cf039a3e7d50de1d4c2cfd.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Are We Smart Enough to Know How Smart Animals Are?", + "price": 56.58, + "rating": 1.0, + "url": "https://books.toscrape.com/are-we-smart-enough-to-know-how-smart-animals-are_121/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/71/d1/71d199b2abd878b9943dc818b77a1e72.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Annie on My Mind", + "price": 36.83, + "rating": 5.0, + "url": "https://books.toscrape.com/annie-on-my-mind_120/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/88/ba/88baf408218bf1e31626211da4329c6b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "And Then There Were None", + "price": 35.01, + "rating": 2.0, + "url": "https://books.toscrape.com/and-then-there-were-none_119/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/21/bf/21bf2eb0bff3134837def8bd40845ba0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "A Walk in the Woods: Rediscovering America on the Appalachian Trail", + "price": 30.48, + "rating": 4.0, + "url": "https://books.toscrape.com/a-walk-in-the-woods-rediscovering-america-on-the-appalachian-trail_118/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/25/ff/25ffbe6f0e8961a1cb2ace38a5b02279.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "A Visit from the Goon Squad", + "price": 14.08, + "rating": 5.0, + "url": "https://books.toscrape.com/a-visit-from-the-goon-squad_117/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/92/02/9202adfd4bc39e4058c5b9e851ffbf5a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "A Storm of Swords (A Song of Ice and Fire #3)", + "price": 31.22, + "rating": 2.0, + "url": "https://books.toscrape.com/a-storm-of-swords-a-song-of-ice-and-fire-3_116/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/39/83/3983449f17095ed15a4878d6bc8114c9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "A Heartbreaking Work of Staggering Genius", + "price": 54.29, + "rating": 5.0, + "url": "https://books.toscrape.com/a-heartbreaking-work-of-staggering-genius_115/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7a/58/7a587c5814f33c0c54e8bfa0ef66d690.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "8 Keys to Mental Health Through Exercise", + "price": 31.04, + "rating": 1.0, + "url": "https://books.toscrape.com/8-keys-to-mental-health-through-exercise_114/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b8/44/b844a77409f1d53cbb66148820abc217.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "#GIRLBOSS", + "price": 50.96, + "rating": 1.0, + "url": "https://books.toscrape.com/girlboss_113/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/70/9a/709a7625e50abf3fc3f26c0396a62131.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Suffragettes (Little Black Classics, #96)", + "price": 11.89, + "rating": 2.0, + "url": "https://books.toscrape.com/the-suffragettes-little-black-classics-96_112/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ee/c3/eec3857d573218bfd22b23b80bfe740e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Sense of an Ending", + "price": 31.38, + "rating": 3.0, + "url": "https://books.toscrape.com/the-sense-of-an-ending_111/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/75/46/7546899e546c4aa11b501c0c41060727.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Sandman, Vol. 2: The Doll\u0027s House (The Sandman (volumes) #2)", + "price": 54.81, + "rating": 1.0, + "url": "https://books.toscrape.com/the-sandman-vol-2-the-dolls-house-the-sandman-volumes-2_110/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e3/ae/e3ae48fe07d77611b49b5b78d99418ae.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Course of Love", + "price": 16.78, + "rating": 3.0, + "url": "https://books.toscrape.com/the-course-of-love_109/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f2/c9/f2c952cfbce6ab5d8400a0bb8ee4eb5c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Sugar Rush (Offensive Line #2)", + "price": 24.42, + "rating": 1.0, + "url": "https://books.toscrape.com/sugar-rush-offensive-line-2_108/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c3/a9/c3a90a5baa833a37c29c4b03a444737c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Saga, Volume 2 (Saga (Collected Editions) #2)", + "price": 11.75, + "rating": 3.0, + "url": "https://books.toscrape.com/saga-volume-2-saga-collected-editions-2_107/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1a/eb/1aeb5d30809ad96d7c323228a2bd23d3.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Run, Spot, Run: The Ethics of Keeping Pets", + "price": 20.02, + "rating": 1.0, + "url": "https://books.toscrape.com/run-spot-run-the-ethics-of-keeping-pets_106/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/91/e6/91e6190dcdd7d6cdeb94a82b60917ec4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "New Moon (Twilight #2)", + "price": 12.86, + "rating": 4.0, + "url": "https://books.toscrape.com/new-moon-twilight-2_105/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5a/1f/5a1fa3ec68add137878b42243813263d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Life", + "price": 31.58, + "rating": 5.0, + "url": "https://books.toscrape.com/life_104/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/99/97/9997eda658c2fe50e724171f9c2a2b0b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Kindle Paperwhite User\u0027s Guide", + "price": 34.0, + "rating": 3.0, + "url": "https://books.toscrape.com/kindle-paperwhite-users-guide_103/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3e/49/3e49769bf9bf83d3bb25c6f93a7fcca2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "H is for Hawk", + "price": 57.42, + "rating": 5.0, + "url": "https://books.toscrape.com/h-is-for-hawk_102/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/78/3c/783c89d21306b712d832dbac267b786a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Girl Online On Tour (Girl Online #2)", + "price": 53.47, + "rating": 1.0, + "url": "https://books.toscrape.com/girl-online-on-tour-girl-online-2_101/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e0/22/e0221ab11b1d093a2d03927b4962c544.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Fruits Basket, Vol. 2 (Fruits Basket #2)", + "price": 11.64, + "rating": 5.0, + "url": "https://books.toscrape.com/fruits-basket-vol-2-fruits-basket-2_100/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/e9/fb/e9fb3236b73384253144f89b6eec6a68.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Diary of a Minecraft Zombie Book 1: A Scare of a Dare (An Unofficial Minecraft Book)", + "price": 52.88, + "rating": 4.0, + "url": "https://books.toscrape.com/diary-of-a-minecraft-zombie-book-1-a-scare-of-a-dare-an-unofficial-minecraft-book_99/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/47/16/47160ff71abe23cb52968b3d1b9b7988.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Y: The Last Man, Vol. 1: Unmanned (Y: The Last Man #1)", + "price": 18.51, + "rating": 4.0, + "url": "https://books.toscrape.com/y-the-last-man-vol-1-unmanned-y-the-last-man-1_98/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ae/16/ae169bb5ae814e0fb900cdf9e99332a7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "While You Were Mine", + "price": 41.32, + "rating": 5.0, + "url": "https://books.toscrape.com/while-you-were-mine_97/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/45/e8/45e87bcad554d79eadf0f89df9cac6f9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Where Lightning Strikes (Bleeding Stars #3)", + "price": 39.77, + "rating": 3.0, + "url": "https://books.toscrape.com/where-lightning-strikes-bleeding-stars-3_96/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/73/d9/73d948af3f2adb6dd693ff4bd43e7760.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "When I\u0027m Gone", + "price": 51.96, + "rating": 3.0, + "url": "https://books.toscrape.com/when-im-gone_95/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/13/a3/13a361d57f2b6021b2ae395a6fedd475.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Ways of Seeing", + "price": 39.51, + "rating": 5.0, + "url": "https://books.toscrape.com/ways-of-seeing_94/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a8/3a/a83a4d31d30dc3cb26a29899a5c3b91d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Vampire Knight, Vol. 1 (Vampire Knight #1)", + "price": 15.4, + "rating": 1.0, + "url": "https://books.toscrape.com/vampire-knight-vol-1-vampire-knight-1_93/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4b/97/4b972f89c11900ac0e84726d1f07bfcc.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Vampire Girl (Vampire Girl #1)", + "price": 53.82, + "rating": 2.0, + "url": "https://books.toscrape.com/vampire-girl-vampire-girl-1_92/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ea/55/ea5547a00ad163902faba6929369bc77.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Twenty Love Poems and a Song of Despair", + "price": 30.95, + "rating": 4.0, + "url": "https://books.toscrape.com/twenty-love-poems-and-a-song-of-despair_91/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/df/ab/dfab1d94f9190df7c13b63a093a6d16e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Travels with Charley: In Search of America", + "price": 57.82, + "rating": 5.0, + "url": "https://books.toscrape.com/travels-with-charley-in-search-of-america_90/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ff/60/ff60e98e3da9c76d6f65b26bd7142d94.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Three Wishes (River of Time: California #1)", + "price": 44.18, + "rating": 2.0, + "url": "https://books.toscrape.com/three-wishes-river-of-time-california-1_89/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c7/21/c721943edf481cad5ab32505e2ad3865.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "This One Moment (Pushing Limits #1)", + "price": 48.71, + "rating": 1.0, + "url": "https://books.toscrape.com/this-one-moment-pushing-limits-1_88/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9b/06/9b061431c4fbb98cc18068a523a49988.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Zombie Room", + "price": 19.69, + "rating": 5.0, + "url": "https://books.toscrape.com/the-zombie-room_87/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1a/2d/1a2d5e478c6b33738ff17e7acfbd8b66.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Wicked + The Divine, Vol. 1: The Faust Act (The Wicked + The Divine)", + "price": 36.52, + "rating": 2.0, + "url": "https://books.toscrape.com/the-wicked-the-divine-vol-1-the-faust-act-the-wicked-the-divine_86/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/64/75/64752f8cdae54b164fb81bfd81accd55.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Tumor", + "price": 41.56, + "rating": 5.0, + "url": "https://books.toscrape.com/the-tumor_85/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/f4/dbf4f5d4e7c0364b078aa5ce7e196853.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The Story of Hong Gildong", + "price": 43.19, + "rating": 4.0, + "url": "https://books.toscrape.com/the-story-of-hong-gildong_84/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ab/16/ab16eb035cc58809a73c4699477de9cb.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Silent Wife", + "price": 12.34, + "rating": 5.0, + "url": "https://books.toscrape.com/the-silent-wife_83/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9b/a3/9ba37429e4a2307fe0b2f4f4162dd636.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Silent Twin (Detective Jennifer Knight #3)", + "price": 36.25, + "rating": 3.0, + "url": "https://books.toscrape.com/the-silent-twin-detective-jennifer-knight-3_82/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a0/7b/a07b53e1708f9055145aa1ec3af8608d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Selfish Gene", + "price": 29.45, + "rating": 1.0, + "url": "https://books.toscrape.com/the-selfish-gene_81/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/08/14/0814f26516fb72b7391d0a742b5928a2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Secret Healer", + "price": 34.56, + "rating": 3.0, + "url": "https://books.toscrape.com/the-secret-healer_80/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/69/d2/69d225899cce0a150c605ead01e02f60.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Sandman, Vol. 1: Preludes and Nocturnes (The Sandman (volumes) #1)", + "price": 54.12, + "rating": 3.0, + "url": "https://books.toscrape.com/the-sandman-vol-1-preludes-and-nocturnes-the-sandman-volumes-1_79/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/56/ea/56eac75378feb4cab0dcb9d2101cf58b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Republic", + "price": 33.78, + "rating": 3.0, + "url": "https://books.toscrape.com/the-republic_78/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7b/2c/7b2cb77c4608fce189caebaa842e135d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "The Odyssey", + "price": 29.64, + "rating": 3.0, + "url": "https://books.toscrape.com/the-odyssey_77/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0d/e8/0de8211253c4131e0caf9e8528d99443.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "The No. 1 Ladies\u0027 Detective Agency (No. 1 Ladies\u0027 Detective Agency #1)", + "price": 57.7, + "rating": 4.0, + "url": "https://books.toscrape.com/the-no-1-ladies-detective-agency-no-1-ladies-detective-agency-1_76/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/34/2e/342ec55d460f3dd49d77dac2bd4ff489.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "The Nicomachean Ethics", + "price": 36.34, + "rating": 1.0, + "url": "https://books.toscrape.com/the-nicomachean-ethics_75/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f0/aa/f0aa9ae0319b1d6e0706e6053020e696.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "The Name of the Wind (The Kingkiller Chronicle #1)", + "price": 50.59, + "rating": 3.0, + "url": "https://books.toscrape.com/the-name-of-the-wind-the-kingkiller-chronicle-1_74/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6a/b3/6ab3616e7495ef64b1546a178cf8a9e7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "The Mirror \u0026 the Maze (The Wrath and the Dawn #1.5)", + "price": 29.38, + "rating": 1.0, + "url": "https://books.toscrape.com/the-mirror-the-maze-the-wrath-and-the-dawn-15_73/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/84/a8/84a85a5ecca2bdc17e219241938ebdba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "The Little Prince", + "price": 45.42, + "rating": 2.0, + "url": "https://books.toscrape.com/the-little-prince_72/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c0/78/c078355608dd81c7c5e4f5e1c5f73d23.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "The Light of the Fireflies", + "price": 54.43, + "rating": 1.0, + "url": "https://books.toscrape.com/the-light-of-the-fireflies_71/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/17/8e/178e6e1cee8e5980e31148ea10a7321f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "The Last Girl (The Dominion Trilogy #1)", + "price": 36.26, + "rating": 2.0, + "url": "https://books.toscrape.com/the-last-girl-the-dominion-trilogy-1_70/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/da/47/da4746e620f8ccd7cf20628d1a5e535a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "The Iliad", + "price": 16.16, + "rating": 1.0, + "url": "https://books.toscrape.com/the-iliad_69/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b4/49/b449e504e387b69322d85e76a57ab60f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "The Hook Up (Game On #1)", + "price": 36.29, + "rating": 5.0, + "url": "https://books.toscrape.com/the-hook-up-game-on-1_68/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/38/f1/38f1543cd2d51c2728678f5ecc128958.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "The Haters", + "price": 27.89, + "rating": 5.0, + "url": "https://books.toscrape.com/the-haters_67/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4c/e9/4ce9f937ac784ae0b377bcbf2a38a8b2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "The Girl You Lost", + "price": 12.29, + "rating": 5.0, + "url": "https://books.toscrape.com/the-girl-you-lost_66/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/90/0d/900dba6987796f4312a6a6737b0ea94d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "The Girl In The Ice (DCI Erika Foster #1)", + "price": 15.85, + "rating": 3.0, + "url": "https://books.toscrape.com/the-girl-in-the-ice-dci-erika-foster-1_65/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d8/f7/d8f77fe7f4bb8610e903741441f84702.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "The End of the Jesus Era (An Investigation #1)", + "price": 14.4, + "rating": 1.0, + "url": "https://books.toscrape.com/the-end-of-the-jesus-era-an-investigation-1_64/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fe/47/fe47782c4f8194a4d93ec1381108be88.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "The Edge of Reason (Bridget Jones #2)", + "price": 19.18, + "rating": 4.0, + "url": "https://books.toscrape.com/the-edge-of-reason-bridget-jones-2_63/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/db/34/db341aa83daa76cd9f9bd2c86ccb5dba.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "The Complete Maus (Maus #1-2)", + "price": 10.64, + "rating": 3.0, + "url": "https://books.toscrape.com/the-complete-maus-maus-1-2_62/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a6/f8/a6f889e0ba02be31875d3a324090ef5e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "The Communist Manifesto", + "price": 14.76, + "rating": 3.0, + "url": "https://books.toscrape.com/the-communist-manifesto_61/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/bb/cd/bbcd1a94ebc9fb56f8d079df4557f8e2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "The Bhagavad Gita", + "price": 57.49, + "rating": 3.0, + "url": "https://books.toscrape.com/the-bhagavad-gita_60/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/4e/69/4e69dacc99de838814d0f65c94e67f6c.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "The Bette Davis Club", + "price": 30.66, + "rating": 3.0, + "url": "https://books.toscrape.com/the-bette-davis-club_59/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/23/08/2308bf77130cf0a917642d82dbf4be05.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "The Art of Not Breathing", + "price": 40.83, + "rating": 4.0, + "url": "https://books.toscrape.com/the-art-of-not-breathing_58/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/37/26/3726bb1bf30241b6d6f8c8488ad70989.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Taking Shots (Assassins #1)", + "price": 18.88, + "rating": 2.0, + "url": "https://books.toscrape.com/taking-shots-assassins-1_57/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ea/92/ea92404bce04a4bc76f3ed9c5344b2bf.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Starlark", + "price": 25.83, + "rating": 3.0, + "url": "https://books.toscrape.com/starlark_56/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b4/9e/b49e66e8f446d9a3dae488955f2aa487.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Skip Beat!, Vol. 01 (Skip Beat! #1)", + "price": 42.12, + "rating": 3.0, + "url": "https://books.toscrape.com/skip-beat-vol-01-skip-beat-1_55/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6c/60/6c607509837e2b362ffd7c0e15e7b1f9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Sister Sable (The Mad Queen #1)", + "price": 13.33, + "rating": 3.0, + "url": "https://books.toscrape.com/sister-sable-the-mad-queen-1_54/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2c/89/2c89c4c5528ab4b9101701437953df75.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Shatter Me (Shatter Me #1)", + "price": 42.4, + "rating": 1.0, + "url": "https://books.toscrape.com/shatter-me-shatter-me-1_53/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f0/31/f031254cafbdff0092c76c8dcba24139.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Shameless", + "price": 58.35, + "rating": 3.0, + "url": "https://books.toscrape.com/shameless_52/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a2/19/a2198abf12e3287f84997b35f4e1050e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Shadow Rites (Jane Yellowrock #10)", + "price": 21.72, + "rating": 4.0, + "url": "https://books.toscrape.com/shadow-rites-jane-yellowrock-10_51/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7a/0d/7a0d52ec06a57c117c0b99c7980756e7.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Settling the Score (The Summer Games #1)", + "price": 44.91, + "rating": 2.0, + "url": "https://books.toscrape.com/settling-the-score-the-summer-games-1_50/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/9b/4e/9b4ece2ab5a6335c8594c878e2f22df1.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Sense and Sensibility", + "price": 37.46, + "rating": 1.0, + "url": "https://books.toscrape.com/sense-and-sensibility_49/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7d/53/7d53e2264b9647ee307259be9f73585d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Saga, Volume 1 (Saga (Collected Editions) #1)", + "price": 28.48, + "rating": 1.0, + "url": "https://books.toscrape.com/saga-volume-1-saga-collected-editions-1_48/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/c6/ca/c6cab3f679acb45fd2eba092ec9f6a2a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Rhythm, Chord \u0026 Malykhin", + "price": 28.34, + "rating": 2.0, + "url": "https://books.toscrape.com/rhythm-chord-malykhin_47/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/43/85/4385ee0304bc3546f2b6eaa75c46d4f8.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Rat Queens, Vol. 1: Sass \u0026 Sorcery (Rat Queens (Collected Editions) #1-5)", + "price": 46.96, + "rating": 5.0, + "url": "https://books.toscrape.com/rat-queens-vol-1-sass-sorcery-rat-queens-collected-editions-1-5_46/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0d/22/0d22f9ee696b7443d1573e7752645c6d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Paradise Lost (Paradise #1)", + "price": 24.96, + "rating": 1.0, + "url": "https://books.toscrape.com/paradise-lost-paradise-1_45/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/66/f9/66f9edebe41032584e08dcf2fc27b8b4.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Paper Girls, Vol. 1 (Paper Girls #1-5)", + "price": 21.71, + "rating": 4.0, + "url": "https://books.toscrape.com/paper-girls-vol-1-paper-girls-1-5_44/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/87/2b/872ba3b06a97e6662770bc2152595b84.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Ouran High School Host Club, Vol. 1 (Ouran High School Host Club #1)", + "price": 29.87, + "rating": 3.0, + "url": "https://books.toscrape.com/ouran-high-school-host-club-vol-1-ouran-high-school-host-club-1_43/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d5/c5/d5c5a6ebf05b68bee78a38a8ea62305d.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Origins (Alphas 0.5)", + "price": 28.99, + "rating": 1.0, + "url": "https://books.toscrape.com/origins-alphas-05_42/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/12/9b/129b70d7b45d78a26459e7445e0e13e2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "One Second (Seven #7)", + "price": 52.94, + "rating": 2.0, + "url": "https://books.toscrape.com/one-second-seven-7_41/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/3f/f3/3ff3f7a0f3c949bb7adbe5f7fe80b9ab.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "On the Road (Duluoz Legend)", + "price": 32.36, + "rating": 3.0, + "url": "https://books.toscrape.com/on-the-road-duluoz-legend_40/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/b8/3e/b83e5f1b9c1dcfe0ef05cff4b080e0fa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Old Records Never Die: One Man\u0027s Quest for His Vinyl and His Past", + "price": 55.66, + "rating": 2.0, + "url": "https://books.toscrape.com/old-records-never-die-one-mans-quest-for-his-vinyl-and-his-past_39/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7e/94/7e947f3dd04f178175b85123829467a9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Off Sides (Off #1)", + "price": 39.45, + "rating": 5.0, + "url": "https://books.toscrape.com/off-sides-off-1_38/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/03/ed/03ed67ea504353b91b035151d8e80db2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Of Mice and Men", + "price": 47.11, + "rating": 2.0, + "url": "https://books.toscrape.com/of-mice-and-men_37/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0f/ca/0fca4597765ffacdb7bd529fc5eb88fa.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Myriad (Prentor #1)", + "price": 58.75, + "rating": 4.0, + "url": "https://books.toscrape.com/myriad-prentor-1_36/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/6b/fa/6bfae8a489ff53f50467705c1e6fff19.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "My Perfect Mistake (Over the Top #1)", + "price": 38.92, + "rating": 2.0, + "url": "https://books.toscrape.com/my-perfect-mistake-over-the-top-1_35/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0d/03/0d03eb55ed070a53b6c4b6eedd48b458.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Ms. Marvel, Vol. 1: No Normal (Ms. Marvel (2014-2015) #1)", + "price": 39.39, + "rating": 4.0, + "url": "https://books.toscrape.com/ms-marvel-vol-1-no-normal-ms-marvel-2014-2015-1_34/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f4/96/f496db4d78639e233978ae2bee021752.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Meditations", + "price": 25.89, + "rating": 2.0, + "url": "https://books.toscrape.com/meditations_33/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/df/c9/dfc9ed72e963572d23233b3a8cb01676.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Matilda", + "price": 28.34, + "rating": 1.0, + "url": "https://books.toscrape.com/matilda_32/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/03/47/0347bd215f4813edd81c2cd76bab53ca.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Lost Among the Living", + "price": 27.7, + "rating": 4.0, + "url": "https://books.toscrape.com/lost-among-the-living_31/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5a/40/5a40d914bc3491e5909f1167f9cb34f2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Lord of the Flies", + "price": 24.89, + "rating": 3.0, + "url": "https://books.toscrape.com/lord-of-the-flies_30/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/33/73/3373a168b588e3fb19c558a21da71ac9.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Listen to Me (Fusion #1)", + "price": 58.99, + "rating": 3.0, + "url": "https://books.toscrape.com/listen-to-me-fusion-1_29/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/00/dd/00dd43f59d255cbc16e9d9c9ed20a997.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Kitchens of the Great Midwest", + "price": 57.2, + "rating": 5.0, + "url": "https://books.toscrape.com/kitchens-of-the-great-midwest_28/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/5e/37/5e379c1cc7003127bc74257a1b721540.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Jane Eyre", + "price": 38.43, + "rating": 5.0, + "url": "https://books.toscrape.com/jane-eyre_27/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0b/9b/0b9bd2c1de5ec402b2c797b53e5257f6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Imperfect Harmony", + "price": 34.74, + "rating": 4.0, + "url": "https://books.toscrape.com/imperfect-harmony_26/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/fb/29/fb299a516730a2f2602b10f945f7a8e5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Icing (Aces Hockey #2)", + "price": 40.44, + "rating": 4.0, + "url": "https://books.toscrape.com/icing-aces-hockey-2_25/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/8d/1e/8d1e285bf672b2ea66879490cc5f6904.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Hawkeye, Vol. 1: My Life as a Weapon (Hawkeye #1)", + "price": 45.24, + "rating": 3.0, + "url": "https://books.toscrape.com/hawkeye-vol-1-my-life-as-a-weapon-hawkeye-1_24/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/16/46/16460146a1a8b99c82da027368383ade.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "Having the Barbarian\u0027s Baby (Ice Planet Barbarians #7.5)", + "price": 34.96, + "rating": 4.0, + "url": "https://books.toscrape.com/having-the-barbarians-baby-ice-planet-barbarians-75_23/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/f4/83/f4835e9f3fdd8b8107bbb39a391654f0.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "Giant Days, Vol. 1 (Giant Days #1-4)", + "price": 56.76, + "rating": 4.0, + "url": "https://books.toscrape.com/giant-days-vol-1-giant-days-1-4_22/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/35/0b/350b1224dc46533851d5a34134e44842.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "Fruits Basket, Vol. 1 (Fruits Basket #1)", + "price": 40.28, + "rating": 5.0, + "url": "https://books.toscrape.com/fruits-basket-vol-1-fruits-basket-1_21/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7c/c1/7cc13a8fb238202250e87843c1a62f94.jpg" + }, + { + "source": "BooksToScrape", + "rank": 1, + "title": "Frankenstein", + "price": 38.0, + "rating": 2.0, + "url": "https://books.toscrape.com/frankenstein_20/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/00/25/0025515e987a1ebd648773f9ac70bfe6.jpg" + }, + { + "source": "BooksToScrape", + "rank": 2, + "title": "Forever Rockers (The Rocker #12)", + "price": 28.8, + "rating": 3.0, + "url": "https://books.toscrape.com/forever-rockers-the-rocker-12_19/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/7f/b0/7fb03a053c270000667a50dd8d594843.jpg" + }, + { + "source": "BooksToScrape", + "rank": 3, + "title": "Fighting Fate (Fighting #6)", + "price": 39.24, + "rating": 3.0, + "url": "https://books.toscrape.com/fighting-fate-fighting-6_18/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/57/e2/57e255929f6e597c18cb3843904cd92b.jpg" + }, + { + "source": "BooksToScrape", + "rank": 4, + "title": "Emma", + "price": 32.93, + "rating": 2.0, + "url": "https://books.toscrape.com/emma_17/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/09/63/09638baaef52f03827c215029c632a13.jpg" + }, + { + "source": "BooksToScrape", + "rank": 5, + "title": "Eat, Pray, Love", + "price": 51.32, + "rating": 3.0, + "url": "https://books.toscrape.com/eat-pray-love_16/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/21/95/2195c296e82620593a143356aeaa7745.jpg" + }, + { + "source": "BooksToScrape", + "rank": 6, + "title": "Deep Under (Walker Security #1)", + "price": 47.09, + "rating": 5.0, + "url": "https://books.toscrape.com/deep-under-walker-security-1_15/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/74/e4/74e4ec43c40926c7b57fc0fe0f397183.jpg" + }, + { + "source": "BooksToScrape", + "rank": 7, + "title": "Choosing Our Religion: The Spiritual Lives of America\u0027s Nones", + "price": 28.42, + "rating": 4.0, + "url": "https://books.toscrape.com/choosing-our-religion-the-spiritual-lives-of-americas-nones_14/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/df/ab/dfabeab158046237ddb6b713b794909f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 8, + "title": "Charlie and the Chocolate Factory (Charlie Bucket #1)", + "price": 22.85, + "rating": 3.0, + "url": "https://books.toscrape.com/charlie-and-the-chocolate-factory-charlie-bucket-1_13/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d6/cc/d6cc0c66e34dfc214b406208bbaf18e2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 9, + "title": "Charity\u0027s Cross (Charles Towne Belles #4)", + "price": 41.24, + "rating": 1.0, + "url": "https://books.toscrape.com/charitys-cross-charles-towne-belles-4_12/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/39/e0/39e008f84bbd24b49a7532c2024b855e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 10, + "title": "Bright Lines", + "price": 39.07, + "rating": 5.0, + "url": "https://books.toscrape.com/bright-lines_11/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/12/43/1243e7eb614f57f0e4cfee80553fa312.jpg" + }, + { + "source": "BooksToScrape", + "rank": 11, + "title": "Bridget Jones\u0027s Diary (Bridget Jones #1)", + "price": 29.82, + "rating": 1.0, + "url": "https://books.toscrape.com/bridget-joness-diary-bridget-jones-1_10/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/0c/32/0c329cbd2adf4e0dc825f892106673b2.jpg" + }, + { + "source": "BooksToScrape", + "rank": 12, + "title": "Bounty (Colorado Mountain #7)", + "price": 37.26, + "rating": 4.0, + "url": "https://books.toscrape.com/bounty-colorado-mountain-7_9/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/80/ff/80ff924ed78cd7c5172410d0d92f8dfe.jpg" + }, + { + "source": "BooksToScrape", + "rank": 13, + "title": "Blood Defense (Samantha Brinkman #1)", + "price": 20.3, + "rating": 3.0, + "url": "https://books.toscrape.com/blood-defense-samantha-brinkman-1_8/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/cb/f6/cbf6d4b61953f29d7eedd2c9e01a9d74.jpg" + }, + { + "source": "BooksToScrape", + "rank": 14, + "title": "Bleach, Vol. 1: Strawberry and the Soul Reapers (Bleach #1)", + "price": 34.65, + "rating": 5.0, + "url": "https://books.toscrape.com/bleach-vol-1-strawberry-and-the-soul-reapers-bleach-1_7/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/a8/38/a8383903c98af18b898b9d70d5be2c16.jpg" + }, + { + "source": "BooksToScrape", + "rank": 15, + "title": "Beyond Good and Evil", + "price": 43.38, + "rating": 1.0, + "url": "https://books.toscrape.com/beyond-good-and-evil_6/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/ab/45/ab45f300aa15066ad1260d6f1398d03e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 16, + "title": "Alice in Wonderland (Alice\u0027s Adventures in Wonderland #1)", + "price": 55.53, + "rating": 1.0, + "url": "https://books.toscrape.com/alice-in-wonderland-alices-adventures-in-wonderland-1_5/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/96/ee/96ee77d71a31b7694dac6855f6affe4e.jpg" + }, + { + "source": "BooksToScrape", + "rank": 17, + "title": "Ajin: Demi-Human, Volume 1 (Ajin: Demi-Human #1)", + "price": 57.06, + "rating": 4.0, + "url": "https://books.toscrape.com/ajin-demi-human-volume-1-ajin-demi-human-1_4/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/09/7c/097cb5ecc6fb3fbe1690cf0cbdea4ac5.jpg" + }, + { + "source": "BooksToScrape", + "rank": 18, + "title": "A Spy\u0027s Devotion (The Regency Spies of London #1)", + "price": 16.97, + "rating": 5.0, + "url": "https://books.toscrape.com/a-spys-devotion-the-regency-spies-of-london-1_3/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/1b/5f/1b5ff86f3c75e51e24c573d3f8bffd8f.jpg" + }, + { + "source": "BooksToScrape", + "rank": 19, + "title": "1st to Die (Women\u0027s Murder Club #1)", + "price": 53.98, + "rating": 1.0, + "url": "https://books.toscrape.com/1st-to-die-womens-murder-club-1_2/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/2b/41/2b4161c5b72a4ae386b644682361b34a.jpg" + }, + { + "source": "BooksToScrape", + "rank": 20, + "title": "1,000 Places to See Before You Die", + "price": 26.08, + "rating": 5.0, + "url": "https://books.toscrape.com/1000-places-to-see-before-you-die_1/index.html", + "imageUrl": "https://books.toscrape.com/media/cache/d7/0f/d70f7edd92705c45a82118c3ff6c299d.jpg" + } +] \ No newline at end of file diff --git a/project/output/BooksToScrape_20260531_233112.txt b/project/output/BooksToScrape_20260531_233112.txt new file mode 100644 index 0000000..ef9fa63 --- /dev/null +++ b/project/output/BooksToScrape_20260531_233112.txt @@ -0,0 +1,5006 @@ +========================================== + 数据来源: BooksToScrape + 爬取时间: 2026-05-31T23:31:12.602668700 + 图书数量: 1000 +========================================== + +排名: 1 +书名: A Light in the Attic +评分: 3.0 +价格: 51.77 +------------------------------------------ +排名: 2 +书名: Tipping the Velvet +评分: 1.0 +价格: 53.74 +------------------------------------------ +排名: 3 +书名: Soumission +评分: 1.0 +价格: 50.10 +------------------------------------------ +排名: 4 +书名: Sharp Objects +评分: 4.0 +价格: 47.82 +------------------------------------------ +排名: 5 +书名: Sapiens: A Brief History of Humankind +评分: 5.0 +价格: 54.23 +------------------------------------------ +排名: 6 +书名: The Requiem Red +评分: 1.0 +价格: 22.65 +------------------------------------------ +排名: 7 +书名: The Dirty Little Secrets of Getting Your Dream Job +评分: 4.0 +价格: 33.34 +------------------------------------------ +排名: 8 +书名: The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull +评分: 3.0 +价格: 17.93 +------------------------------------------ +排名: 9 +书名: The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics +评分: 4.0 +价格: 22.60 +------------------------------------------ +排名: 10 +书名: The Black Maria +评分: 1.0 +价格: 52.15 +------------------------------------------ +排名: 11 +书名: Starving Hearts (Triangular Trade Trilogy, #1) +评分: 2.0 +价格: 13.99 +------------------------------------------ +排名: 12 +书名: Shakespeare's Sonnets +评分: 4.0 +价格: 20.66 +------------------------------------------ +排名: 13 +书名: Set Me Free +评分: 5.0 +价格: 17.46 +------------------------------------------ +排名: 14 +书名: Scott Pilgrim's Precious Little Life (Scott Pilgrim #1) +评分: 5.0 +价格: 52.29 +------------------------------------------ +排名: 15 +书名: Rip it Up and Start Again +评分: 5.0 +价格: 35.02 +------------------------------------------ +排名: 16 +书名: Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991 +评分: 3.0 +价格: 57.25 +------------------------------------------ +排名: 17 +书名: Olio +评分: 1.0 +价格: 23.88 +------------------------------------------ +排名: 18 +书名: Mesaerion: The Best Science Fiction Stories 1800-1849 +评分: 1.0 +价格: 37.59 +------------------------------------------ +排名: 19 +书名: Libertarianism for Beginners +评分: 2.0 +价格: 51.33 +------------------------------------------ +排名: 20 +书名: It's Only the Himalayas +评分: 2.0 +价格: 45.17 +------------------------------------------ +排名: 1 +书名: In Her Wake +评分: 1.0 +价格: 12.84 +------------------------------------------ +排名: 2 +书名: How Music Works +评分: 2.0 +价格: 37.32 +------------------------------------------ +排名: 3 +书名: Foolproof Preserving: A Guide to Small Batch Jams, Jellies, Pickles, Condiments, and More: A Foolproof Guide to Making Small Batch Jams, Jellies, Pickles, Condiments, and More +评分: 3.0 +价格: 30.52 +------------------------------------------ +排名: 4 +书名: Chase Me (Paris Nights #2) +评分: 5.0 +价格: 25.27 +------------------------------------------ +排名: 5 +书名: Black Dust +评分: 5.0 +价格: 34.53 +------------------------------------------ +排名: 6 +书名: Birdsong: A Story in Pictures +评分: 3.0 +价格: 54.64 +------------------------------------------ +排名: 7 +书名: America's Cradle of Quarterbacks: Western Pennsylvania's Football Factory from Johnny Unitas to Joe Montana +评分: 3.0 +价格: 22.50 +------------------------------------------ +排名: 8 +书名: Aladdin and His Wonderful Lamp +评分: 3.0 +价格: 53.13 +------------------------------------------ +排名: 9 +书名: Worlds Elsewhere: Journeys Around Shakespeare’s Globe +评分: 5.0 +价格: 40.30 +------------------------------------------ +排名: 10 +书名: Wall and Piece +评分: 4.0 +价格: 44.18 +------------------------------------------ +排名: 11 +书名: The Four Agreements: A Practical Guide to Personal Freedom +评分: 5.0 +价格: 17.66 +------------------------------------------ +排名: 12 +书名: The Five Love Languages: How to Express Heartfelt Commitment to Your Mate +评分: 3.0 +价格: 31.05 +------------------------------------------ +排名: 13 +书名: The Elephant Tree +评分: 5.0 +价格: 23.82 +------------------------------------------ +排名: 14 +书名: The Bear and the Piano +评分: 1.0 +价格: 36.89 +------------------------------------------ +排名: 15 +书名: Sophie's World +评分: 5.0 +价格: 15.94 +------------------------------------------ +排名: 16 +书名: Penny Maybe +评分: 3.0 +价格: 33.29 +------------------------------------------ +排名: 17 +书名: Maude (1883-1993):She Grew Up with the country +评分: 2.0 +价格: 18.02 +------------------------------------------ +排名: 18 +书名: In a Dark, Dark Wood +评分: 1.0 +价格: 19.63 +------------------------------------------ +排名: 19 +书名: Behind Closed Doors +评分: 4.0 +价格: 52.22 +------------------------------------------ +排名: 20 +书名: You can't bury them all: Poems +评分: 2.0 +价格: 33.63 +------------------------------------------ +排名: 1 +书名: Slow States of Collapse: Poems +评分: 3.0 +价格: 57.31 +------------------------------------------ +排名: 2 +书名: Reasons to Stay Alive +评分: 2.0 +价格: 26.41 +------------------------------------------ +排名: 3 +书名: Private Paris (Private #10) +评分: 5.0 +价格: 47.61 +------------------------------------------ +排名: 4 +书名: #HigherSelfie: Wake Up Your Life. Free Your Soul. Find Your Tribe. +评分: 5.0 +价格: 23.11 +------------------------------------------ +排名: 5 +书名: Without Borders (Wanderlove #1) +评分: 2.0 +价格: 45.07 +------------------------------------------ +排名: 6 +书名: When We Collided +评分: 1.0 +价格: 31.77 +------------------------------------------ +排名: 7 +书名: We Love You, Charlie Freeman +评分: 5.0 +价格: 50.27 +------------------------------------------ +排名: 8 +书名: Untitled Collection: Sabbath Poems 2014 +评分: 4.0 +价格: 14.27 +------------------------------------------ +排名: 9 +书名: Unseen City: The Majesty of Pigeons, the Discreet Charm of Snails & Other Wonders of the Urban Wilderness +评分: 4.0 +价格: 44.18 +------------------------------------------ +排名: 10 +书名: Unicorn Tracks +评分: 3.0 +价格: 18.78 +------------------------------------------ +排名: 11 +书名: Unbound: How Eight Technologies Made Us Human, Transformed Society, and Brought Our World to the Brink +评分: 1.0 +价格: 25.52 +------------------------------------------ +排名: 12 +书名: Tsubasa: WoRLD CHRoNiCLE 2 (Tsubasa WoRLD CHRoNiCLE #2) +评分: 1.0 +价格: 16.28 +------------------------------------------ +排名: 13 +书名: Throwing Rocks at the Google Bus: How Growth Became the Enemy of Prosperity +评分: 3.0 +价格: 31.12 +------------------------------------------ +排名: 14 +书名: This One Summer +评分: 4.0 +价格: 19.49 +------------------------------------------ +排名: 15 +书名: Thirst +评分: 5.0 +价格: 17.27 +------------------------------------------ +排名: 16 +书名: The Torch Is Passed: A Harding Family Story +评分: 1.0 +价格: 19.09 +------------------------------------------ +排名: 17 +书名: The Secret of Dreadwillow Carse +评分: 1.0 +价格: 56.13 +------------------------------------------ +排名: 18 +书名: The Pioneer Woman Cooks: Dinnertime: Comfort Classics, Freezer Food, 16-Minute Meals, and Other Delicious Ways to Solve Supper! +评分: 1.0 +价格: 56.41 +------------------------------------------ +排名: 19 +书名: The Past Never Ends +评分: 4.0 +价格: 56.50 +------------------------------------------ +排名: 20 +书名: The Natural History of Us (The Fine Art of Pretending #2) +评分: 3.0 +价格: 45.22 +------------------------------------------ +排名: 1 +书名: The Nameless City (The Nameless City #1) +评分: 4.0 +价格: 38.16 +------------------------------------------ +排名: 2 +书名: The Murder That Never Was (Forensic Instincts #5) +评分: 3.0 +价格: 54.11 +------------------------------------------ +排名: 3 +书名: The Most Perfect Thing: Inside (and Outside) a Bird's Egg +评分: 4.0 +价格: 42.96 +------------------------------------------ +排名: 4 +书名: The Mindfulness and Acceptance Workbook for Anxiety: A Guide to Breaking Free from Anxiety, Phobias, and Worry Using Acceptance and Commitment Therapy +评分: 4.0 +价格: 23.89 +------------------------------------------ +排名: 5 +书名: The Life-Changing Magic of Tidying Up: The Japanese Art of Decluttering and Organizing +评分: 3.0 +价格: 16.77 +------------------------------------------ +排名: 6 +书名: The Inefficiency Assassin: Time Management Tactics for Working Smarter, Not Longer +评分: 5.0 +价格: 20.59 +------------------------------------------ +排名: 7 +书名: The Gutsy Girl: Escapades for Your Life of Epic Adventure +评分: 1.0 +价格: 37.13 +------------------------------------------ +排名: 8 +书名: The Electric Pencil: Drawings from Inside State Hospital No. 3 +评分: 1.0 +价格: 56.06 +------------------------------------------ +排名: 9 +书名: The Death of Humanity: and the Case for Life +评分: 4.0 +价格: 58.11 +------------------------------------------ +排名: 10 +书名: The Bulletproof Diet: Lose up to a Pound a Day, Reclaim Energy and Focus, Upgrade Your Life +评分: 3.0 +价格: 49.05 +------------------------------------------ +排名: 11 +书名: The Art Forger +评分: 3.0 +价格: 40.76 +------------------------------------------ +排名: 12 +书名: The Age of Genius: The Seventeenth Century and the Birth of the Modern Mind +评分: 1.0 +价格: 19.73 +------------------------------------------ +排名: 13 +书名: The Activist's Tao Te Ching: Ancient Advice for a Modern Revolution +评分: 5.0 +价格: 32.24 +------------------------------------------ +排名: 14 +书名: Spark Joy: An Illustrated Master Class on the Art of Organizing and Tidying Up +评分: 4.0 +价格: 41.83 +------------------------------------------ +排名: 15 +书名: Soul Reader +评分: 2.0 +价格: 39.58 +------------------------------------------ +排名: 16 +书名: Security +评分: 2.0 +价格: 39.25 +------------------------------------------ +排名: 17 +书名: Saga, Volume 6 (Saga (Collected Editions) #6) +评分: 3.0 +价格: 25.02 +------------------------------------------ +排名: 18 +书名: Saga, Volume 5 (Saga (Collected Editions) #5) +评分: 2.0 +价格: 51.04 +------------------------------------------ +排名: 19 +书名: Reskilling America: Learning to Labor in the Twenty-First Century +评分: 2.0 +价格: 19.83 +------------------------------------------ +排名: 20 +书名: Rat Queens, Vol. 3: Demons (Rat Queens (Collected Editions) #11-15) +评分: 3.0 +价格: 50.40 +------------------------------------------ +排名: 1 +书名: Princess Jellyfish 2-in-1 Omnibus, Vol. 01 (Princess Jellyfish 2-in-1 Omnibus #1) +评分: 5.0 +价格: 13.61 +------------------------------------------ +排名: 2 +书名: Princess Between Worlds (Wide-Awake Princess #5) +评分: 5.0 +价格: 13.34 +------------------------------------------ +排名: 3 +书名: Pop Gun War, Volume 1: Gift +评分: 1.0 +价格: 18.97 +------------------------------------------ +排名: 4 +书名: Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics +评分: 2.0 +价格: 36.28 +------------------------------------------ +排名: 5 +书名: Patience +评分: 3.0 +价格: 10.16 +------------------------------------------ +排名: 6 +书名: Outcast, Vol. 1: A Darkness Surrounds Him (Outcast #1) +评分: 4.0 +价格: 15.44 +------------------------------------------ +排名: 7 +书名: orange: The Complete Collection 1 (orange: The Complete Collection #1) +评分: 1.0 +价格: 48.41 +------------------------------------------ +排名: 8 +书名: Online Marketing for Busy Authors: A Step-By-Step Guide +评分: 1.0 +价格: 46.35 +------------------------------------------ +排名: 9 +书名: On a Midnight Clear +评分: 3.0 +价格: 14.07 +------------------------------------------ +排名: 10 +书名: Obsidian (Lux #1) +评分: 2.0 +价格: 14.86 +------------------------------------------ +排名: 11 +书名: My Paris Kitchen: Recipes and Stories +评分: 2.0 +价格: 33.37 +------------------------------------------ +排名: 12 +书名: Masks and Shadows +评分: 2.0 +价格: 56.40 +------------------------------------------ +排名: 13 +书名: Mama Tried: Traditional Italian Cooking for the Screwed, Crude, Vegan, and Tattooed +评分: 4.0 +价格: 14.02 +------------------------------------------ +排名: 14 +书名: Lumberjanes, Vol. 2: Friendship to the Max (Lumberjanes #5-8) +评分: 2.0 +价格: 46.91 +------------------------------------------ +排名: 15 +书名: Lumberjanes, Vol. 1: Beware the Kitten Holy (Lumberjanes #1-4) +评分: 3.0 +价格: 45.61 +------------------------------------------ +排名: 16 +书名: Lumberjanes Vol. 3: A Terrible Plan (Lumberjanes #9-12) +评分: 2.0 +价格: 19.92 +------------------------------------------ +排名: 17 +书名: Layered: Baking, Building, and Styling Spectacular Cakes +评分: 1.0 +价格: 40.11 +------------------------------------------ +排名: 18 +书名: Judo: Seven Steps to Black Belt (an Introductory Guide for Beginners) +评分: 2.0 +价格: 53.90 +------------------------------------------ +排名: 19 +书名: Join +评分: 5.0 +价格: 35.67 +------------------------------------------ +排名: 20 +书名: In the Country We Love: My Family Divided +评分: 4.0 +价格: 22.00 +------------------------------------------ +排名: 1 +书名: Immunity: How Elie Metchnikoff Changed the Course of Modern Medicine +评分: 5.0 +价格: 57.36 +------------------------------------------ +排名: 2 +书名: I Hate Fairyland, Vol. 1: Madly Ever After (I Hate Fairyland (Compilations) #1-5) +评分: 2.0 +价格: 29.17 +------------------------------------------ +排名: 3 +书名: I am a Hero Omnibus Volume 1 +评分: 3.0 +价格: 54.63 +------------------------------------------ +排名: 4 +书名: How to Be Miserable: 40 Strategies You Already Use +评分: 1.0 +价格: 46.03 +------------------------------------------ +排名: 5 +书名: Her Backup Boyfriend (The Sorensen Family #1) +评分: 1.0 +价格: 33.97 +------------------------------------------ +排名: 6 +书名: Giant Days, Vol. 2 (Giant Days #5-8) +评分: 2.0 +价格: 22.11 +------------------------------------------ +排名: 7 +书名: Forever and Forever: The Courtship of Henry Longfellow and Fanny Appleton +评分: 3.0 +价格: 29.69 +------------------------------------------ +排名: 8 +书名: First and First (Five Boroughs #3) +评分: 4.0 +价格: 15.97 +------------------------------------------ +排名: 9 +书名: Fifty Shades Darker (Fifty Shades #2) +评分: 1.0 +价格: 21.96 +------------------------------------------ +排名: 10 +书名: Everydata: The Misinformation Hidden in the Little Data You Consume Every Day +评分: 2.0 +价格: 54.35 +------------------------------------------ +排名: 11 +书名: Don't Be a Jerk: And Other Practical Advice from Dogen, Japan's Greatest Zen Master +评分: 2.0 +价格: 37.97 +------------------------------------------ +排名: 12 +书名: Danganronpa Volume 1 +评分: 4.0 +价格: 51.99 +------------------------------------------ +排名: 13 +书名: Crown of Midnight (Throne of Glass #2) +评分: 3.0 +价格: 43.29 +------------------------------------------ +排名: 14 +书名: Codename Baboushka, Volume 1: The Conclave of Death +评分: 4.0 +价格: 36.72 +------------------------------------------ +排名: 15 +书名: Camp Midnight +评分: 4.0 +价格: 17.08 +------------------------------------------ +排名: 16 +书名: Call the Nurse: True Stories of a Country Nurse on a Scottish Isle +评分: 5.0 +价格: 29.14 +------------------------------------------ +排名: 17 +书名: Burning +评分: 3.0 +价格: 28.81 +------------------------------------------ +排名: 18 +书名: Bossypants +评分: 2.0 +价格: 49.46 +------------------------------------------ +排名: 19 +书名: Bitch Planet, Vol. 1: Extraordinary Machine (Bitch Planet (Collected Editions)) +评分: 2.0 +价格: 37.92 +------------------------------------------ +排名: 20 +书名: Avatar: The Last Airbender: Smoke and Shadow, Part 3 (Smoke and Shadow #3) +评分: 2.0 +价格: 28.09 +------------------------------------------ +排名: 1 +书名: Algorithms to Live By: The Computer Science of Human Decisions +评分: 1.0 +价格: 30.81 +------------------------------------------ +排名: 2 +书名: A World of Flavor: Your Gluten Free Passport +评分: 1.0 +价格: 42.95 +------------------------------------------ +排名: 3 +书名: A Piece of Sky, a Grain of Rice: A Memoir in Four Meditations +评分: 5.0 +价格: 56.76 +------------------------------------------ +排名: 4 +书名: A Murder in Time +评分: 1.0 +价格: 16.64 +------------------------------------------ +排名: 5 +书名: A Flight of Arrows (The Pathfinders #2) +评分: 5.0 +价格: 55.53 +------------------------------------------ +排名: 6 +书名: A Fierce and Subtle Poison +评分: 4.0 +价格: 28.13 +------------------------------------------ +排名: 7 +书名: A Court of Thorns and Roses (A Court of Thorns and Roses #1) +评分: 1.0 +价格: 52.37 +------------------------------------------ +排名: 8 +书名: (Un)Qualified: How God Uses Broken People to Do Big Things +评分: 5.0 +价格: 54.00 +------------------------------------------ +排名: 9 +书名: You Are What You Love: The Spiritual Power of Habit +评分: 4.0 +价格: 21.87 +------------------------------------------ +排名: 10 +书名: William Shakespeare's Star Wars: Verily, A New Hope (William Shakespeare's Star Wars #4) +评分: 4.0 +价格: 43.30 +------------------------------------------ +排名: 11 +书名: Tuesday Nights in 1980 +评分: 2.0 +价格: 21.04 +------------------------------------------ +排名: 12 +书名: Tracing Numbers on a Train +评分: 3.0 +价格: 41.60 +------------------------------------------ +排名: 13 +书名: Throne of Glass (Throne of Glass #1) +评分: 3.0 +价格: 35.07 +------------------------------------------ +排名: 14 +书名: Thomas Jefferson and the Tripoli Pirates: The Forgotten War That Changed American History +评分: 1.0 +价格: 59.64 +------------------------------------------ +排名: 15 +书名: Thirteen Reasons Why +评分: 1.0 +价格: 52.72 +------------------------------------------ +排名: 16 +书名: The White Cat and the Monk: A Retelling of the Poem “Pangur Bán” +评分: 4.0 +价格: 58.08 +------------------------------------------ +排名: 17 +书名: The Wedding Dress +评分: 1.0 +价格: 24.12 +------------------------------------------ +排名: 18 +书名: The Vacationers +评分: 4.0 +价格: 42.15 +------------------------------------------ +排名: 19 +书名: The Third Wave: An Entrepreneur’s Vision of the Future +评分: 5.0 +价格: 12.61 +------------------------------------------ +排名: 20 +书名: The Stranger +评分: 4.0 +价格: 17.44 +------------------------------------------ +排名: 1 +书名: The Shadow Hero (The Shadow Hero) +评分: 1.0 +价格: 33.14 +------------------------------------------ +排名: 2 +书名: The Secret (The Secret #1) +评分: 4.0 +价格: 27.37 +------------------------------------------ +排名: 3 +书名: The Regional Office Is Under Attack! +评分: 5.0 +价格: 51.36 +------------------------------------------ +排名: 4 +书名: The Psychopath Test: A Journey Through the Madness Industry +评分: 2.0 +价格: 36.00 +------------------------------------------ +排名: 5 +书名: The Project +评分: 1.0 +价格: 10.65 +------------------------------------------ +排名: 6 +书名: The Power of Now: A Guide to Spiritual Enlightenment +评分: 2.0 +价格: 43.54 +------------------------------------------ +排名: 7 +书名: The Omnivore's Dilemma: A Natural History of Four Meals +评分: 2.0 +价格: 38.21 +------------------------------------------ +排名: 8 +书名: The Nerdy Nummies Cookbook: Sweet Treats for the Geek in All of Us +评分: 5.0 +价格: 37.34 +------------------------------------------ +排名: 9 +书名: The Murder of Roger Ackroyd (Hercule Poirot #4) +评分: 4.0 +价格: 44.10 +------------------------------------------ +排名: 10 +书名: The Mistake (Off-Campus #2) +评分: 3.0 +价格: 43.29 +------------------------------------------ +排名: 11 +书名: The Matchmaker's Playbook (Wingmen Inc. #1) +评分: 1.0 +价格: 55.85 +------------------------------------------ +排名: 12 +书名: The Love and Lemons Cookbook: An Apple-to-Zucchini Celebration of Impromptu Cooking +评分: 2.0 +价格: 37.60 +------------------------------------------ +排名: 13 +书名: The Long Shadow of Small Ghosts: Murder and Memory in an American City +评分: 1.0 +价格: 10.97 +------------------------------------------ +排名: 14 +书名: The Kite Runner +评分: 4.0 +价格: 41.82 +------------------------------------------ +排名: 15 +书名: The House by the Lake +评分: 1.0 +价格: 36.95 +------------------------------------------ +排名: 16 +书名: The Glittering Court (The Glittering Court #1) +评分: 1.0 +价格: 44.28 +------------------------------------------ +排名: 17 +书名: The Girl on the Train +评分: 2.0 +价格: 55.02 +------------------------------------------ +排名: 18 +书名: The Genius of Birds +评分: 1.0 +价格: 17.24 +------------------------------------------ +排名: 19 +书名: The Emerald Mystery +评分: 2.0 +价格: 23.15 +------------------------------------------ +排名: 20 +书名: The Cookies & Cups Cookbook: 125+ sweet & savory recipes reminding you to Always Eat Dessert First +评分: 1.0 +价格: 41.25 +------------------------------------------ +排名: 1 +书名: The Bridge to Consciousness: I'm Writing the Bridge Between Science and Our Old and New Beliefs. +评分: 3.0 +价格: 32.00 +------------------------------------------ +排名: 2 +书名: The Artist's Way: A Spiritual Path to Higher Creativity +评分: 5.0 +价格: 38.49 +------------------------------------------ +排名: 3 +书名: The Art of War +评分: 5.0 +价格: 33.34 +------------------------------------------ +排名: 4 +书名: The Argonauts +评分: 2.0 +价格: 10.93 +------------------------------------------ +排名: 5 +书名: The 10% Entrepreneur: Live Your Startup Dream Without Quitting Your Day Job +评分: 3.0 +价格: 27.55 +------------------------------------------ +排名: 6 +书名: Suddenly in Love (Lake Haven #1) +评分: 2.0 +价格: 55.99 +------------------------------------------ +排名: 7 +书名: Something More Than This +评分: 4.0 +价格: 16.24 +------------------------------------------ +排名: 8 +书名: Soft Apocalypse +评分: 2.0 +价格: 26.12 +------------------------------------------ +排名: 9 +书名: So You've Been Publicly Shamed +评分: 2.0 +价格: 12.23 +------------------------------------------ +排名: 10 +书名: Shoe Dog: A Memoir by the Creator of NIKE +评分: 2.0 +价格: 23.99 +------------------------------------------ +排名: 11 +书名: Shobu Samurai, Project Aryoku (#3) +评分: 3.0 +价格: 29.06 +------------------------------------------ +排名: 12 +书名: Secrets and Lace (Fatal Hearts #1) +评分: 1.0 +价格: 20.27 +------------------------------------------ +排名: 13 +书名: Scarlett Epstein Hates It Here +评分: 5.0 +价格: 43.55 +------------------------------------------ +排名: 14 +书名: Romero and Juliet: A Tragic Tale of Love and Zombies +评分: 1.0 +价格: 36.94 +------------------------------------------ +排名: 15 +书名: Redeeming Love +评分: 5.0 +价格: 20.47 +------------------------------------------ +排名: 16 +书名: Poses for Artists Volume 1 - Dynamic and Sitting Poses: An Essential Reference for Figure Drawing and the Human Form +评分: 1.0 +价格: 41.06 +------------------------------------------ +排名: 17 +书名: Poems That Make Grown Women Cry +评分: 4.0 +价格: 14.19 +------------------------------------------ +排名: 18 +书名: Nightingale, Sing +评分: 1.0 +价格: 38.28 +------------------------------------------ +排名: 19 +书名: Night Sky with Exit Wounds +评分: 1.0 +价格: 41.05 +------------------------------------------ +排名: 20 +书名: Mrs. Houdini +评分: 5.0 +价格: 30.25 +------------------------------------------ +排名: 1 +书名: Modern Romance +评分: 5.0 +价格: 28.26 +------------------------------------------ +排名: 2 +书名: Miss Peregrine’s Home for Peculiar Children (Miss Peregrine’s Peculiar Children #1) +评分: 1.0 +价格: 10.76 +------------------------------------------ +排名: 3 +书名: Louisa: The Extraordinary Life of Mrs. Adams +评分: 2.0 +价格: 16.85 +------------------------------------------ +排名: 4 +书名: Little Red +评分: 3.0 +价格: 13.47 +------------------------------------------ +排名: 5 +书名: Library of Souls (Miss Peregrine’s Peculiar Children #3) +评分: 5.0 +价格: 48.56 +------------------------------------------ +排名: 6 +书名: Large Print Heart of the Pride +评分: 2.0 +价格: 19.15 +------------------------------------------ +排名: 7 +书名: I Had a Nice Time And Other Lies...: How to find love & sh*t like that +评分: 4.0 +价格: 57.36 +------------------------------------------ +排名: 8 +书名: Hollow City (Miss Peregrine’s Peculiar Children #2) +评分: 1.0 +价格: 42.98 +------------------------------------------ +排名: 9 +书名: Grumbles +评分: 2.0 +价格: 22.16 +------------------------------------------ +排名: 10 +书名: Full Moon over Noah’s Ark: An Odyssey to Mount Ararat and Beyond +评分: 4.0 +价格: 49.43 +------------------------------------------ +排名: 11 +书名: Frostbite (Vampire Academy #2) +评分: 5.0 +价格: 29.99 +------------------------------------------ +排名: 12 +书名: Follow You Home +评分: 1.0 +价格: 21.36 +------------------------------------------ +排名: 13 +书名: First Steps for New Christians (Print Edition) +评分: 1.0 +价格: 29.00 +------------------------------------------ +排名: 14 +书名: Finders Keepers (Bill Hodges Trilogy #2) +评分: 5.0 +价格: 53.53 +------------------------------------------ +排名: 15 +书名: Fables, Vol. 1: Legends in Exile (Fables #1) +评分: 4.0 +价格: 41.62 +------------------------------------------ +排名: 16 +书名: Eureka Trivia 6.0 +评分: 4.0 +价格: 54.59 +------------------------------------------ +排名: 17 +书名: Drive: The Surprising Truth About What Motivates Us +评分: 4.0 +价格: 34.95 +------------------------------------------ +排名: 18 +书名: Done Rubbed Out (Reightman & Bailey #1) +评分: 5.0 +价格: 37.72 +------------------------------------------ +排名: 19 +书名: Doing It Over (Most Likely To #1) +评分: 3.0 +价格: 35.61 +------------------------------------------ +排名: 20 +书名: Deliciously Ella Every Day: Quick and Easy Recipes for Gluten-Free Snacks, Packed Lunches, and Simple Meals +评分: 3.0 +价格: 42.16 +------------------------------------------ +排名: 1 +书名: Dark Notes +评分: 5.0 +价格: 19.19 +------------------------------------------ +排名: 2 +书名: Daring Greatly: How the Courage to Be Vulnerable Transforms the Way We Live, Love, Parent, and Lead +评分: 3.0 +价格: 19.43 +------------------------------------------ +排名: 3 +书名: Close to You +评分: 4.0 +价格: 49.46 +------------------------------------------ +排名: 4 +书名: Chasing Heaven: What Dying Taught Me About Living +评分: 2.0 +价格: 37.80 +------------------------------------------ +排名: 5 +书名: Big Magic: Creative Living Beyond Fear +评分: 3.0 +价格: 30.80 +------------------------------------------ +排名: 6 +书名: Becoming Wise: An Inquiry into the Mystery and Art of Living +评分: 2.0 +价格: 27.43 +------------------------------------------ +排名: 7 +书名: Beauty Restored (Riley Family Legacy Novellas #3) +评分: 2.0 +价格: 11.11 +------------------------------------------ +排名: 8 +书名: Batman: The Long Halloween (Batman) +评分: 2.0 +价格: 36.50 +------------------------------------------ +排名: 9 +书名: Batman: The Dark Knight Returns (Batman) +评分: 5.0 +价格: 15.38 +------------------------------------------ +排名: 10 +书名: Ayumi's Violin +评分: 2.0 +价格: 15.48 +------------------------------------------ +排名: 11 +书名: Anonymous +评分: 4.0 +价格: 46.82 +------------------------------------------ +排名: 12 +书名: Amy Meets the Saints and Sages +评分: 3.0 +价格: 18.46 +------------------------------------------ +排名: 13 +书名: Amid the Chaos +评分: 1.0 +价格: 36.58 +------------------------------------------ +排名: 14 +书名: Amatus +评分: 5.0 +价格: 50.54 +------------------------------------------ +排名: 15 +书名: Agnostic: A Spirited Manifesto +评分: 5.0 +价格: 12.51 +------------------------------------------ +排名: 16 +书名: Zealot: The Life and Times of Jesus of Nazareth +评分: 3.0 +价格: 24.70 +------------------------------------------ +排名: 17 +书名: You (You #1) +评分: 5.0 +价格: 43.61 +------------------------------------------ +排名: 18 +书名: Wonder Woman: Earth One, Volume One (Wonder Woman: Earth One #1) +评分: 4.0 +价格: 37.34 +------------------------------------------ +排名: 19 +书名: Wild Swans +评分: 2.0 +价格: 14.36 +------------------------------------------ +排名: 20 +书名: Why the Right Went Wrong: Conservatism--From Goldwater to the Tea Party and Beyond +评分: 4.0 +价格: 52.65 +------------------------------------------ +排名: 1 +书名: Whole Lotta Creativity Going On: 60 Fun and Unusual Exercises to Awaken and Strengthen Your Creativity +评分: 4.0 +价格: 38.20 +------------------------------------------ +排名: 2 +书名: What's It Like in Space?: Stories from Astronauts Who've Been There +评分: 2.0 +价格: 19.60 +------------------------------------------ +排名: 3 +书名: We Are Robin, Vol. 1: The Vigilante Business (We Are Robin #1) +评分: 1.0 +价格: 53.90 +------------------------------------------ +排名: 4 +书名: Walt Disney's Alice in Wonderland +评分: 5.0 +价格: 12.96 +------------------------------------------ +排名: 5 +书名: V for Vendetta (V for Vendetta Complete) +评分: 4.0 +价格: 37.10 +------------------------------------------ +排名: 6 +书名: Until Friday Night (The Field Party #1) +评分: 2.0 +价格: 46.31 +------------------------------------------ +排名: 7 +书名: Unbroken: A World War II Story of Survival, Resilience, and Redemption +评分: 2.0 +价格: 45.95 +------------------------------------------ +排名: 8 +书名: Twenty Yawns +评分: 2.0 +价格: 22.08 +------------------------------------------ +排名: 9 +书名: Through the Woods +评分: 2.0 +价格: 25.38 +------------------------------------------ +排名: 10 +书名: This Is Where It Ends +评分: 2.0 +价格: 27.12 +------------------------------------------ +排名: 11 +书名: The Year of Magical Thinking +评分: 2.0 +价格: 43.04 +------------------------------------------ +排名: 12 +书名: The Wright Brothers +评分: 4.0 +价格: 56.80 +------------------------------------------ +排名: 13 +书名: The White Queen (The Cousins' War #1) +评分: 5.0 +价格: 25.91 +------------------------------------------ +排名: 14 +书名: The Wedding Pact (The O'Malleys #2) +评分: 3.0 +价格: 32.61 +------------------------------------------ +排名: 15 +书名: The Time Keeper +评分: 5.0 +价格: 27.88 +------------------------------------------ +排名: 16 +书名: The Testament of Mary +评分: 4.0 +价格: 52.67 +------------------------------------------ +排名: 17 +书名: The Star-Touched Queen +评分: 5.0 +价格: 46.02 +------------------------------------------ +排名: 18 +书名: The Songs of the Gods +评分: 5.0 +价格: 44.48 +------------------------------------------ +排名: 19 +书名: The Song of Achilles +评分: 5.0 +价格: 37.40 +------------------------------------------ +排名: 20 +书名: The Rosie Project (Don Tillman #1) +评分: 1.0 +价格: 54.04 +------------------------------------------ +排名: 1 +书名: The Power of Habit: Why We Do What We Do in Life and Business +评分: 3.0 +价格: 16.88 +------------------------------------------ +排名: 2 +书名: The Marriage of Opposites +评分: 4.0 +价格: 28.08 +------------------------------------------ +排名: 3 +书名: The Lucifer Effect: Understanding How Good People Turn Evil +评分: 1.0 +价格: 10.40 +------------------------------------------ +排名: 4 +书名: The Long Haul (Diary of a Wimpy Kid #9) +评分: 1.0 +价格: 44.07 +------------------------------------------ +排名: 5 +书名: The Loney +评分: 1.0 +价格: 23.40 +------------------------------------------ +排名: 6 +书名: The Literature Book (Big Ideas Simply Explained) +评分: 3.0 +价格: 17.43 +------------------------------------------ +排名: 7 +书名: The Last Mile (Amos Decker #2) +评分: 2.0 +价格: 54.21 +------------------------------------------ +排名: 8 +书名: The Immortal Life of Henrietta Lacks +评分: 2.0 +价格: 40.67 +------------------------------------------ +排名: 9 +书名: The Hidden Oracle (The Trials of Apollo #1) +评分: 2.0 +价格: 52.26 +------------------------------------------ +排名: 10 +书名: The Help Yourself Cookbook for Kids: 60 Easy Plant-Based Recipes Kids Can Make to Stay Healthy and Save the Earth +评分: 3.0 +价格: 28.77 +------------------------------------------ +排名: 11 +书名: The Guilty (Will Robie #4) +评分: 2.0 +价格: 13.82 +------------------------------------------ +排名: 12 +书名: The First Hostage (J.B. Collins #2) +评分: 3.0 +价格: 25.85 +------------------------------------------ +排名: 13 +书名: The Dovekeepers +评分: 1.0 +价格: 48.78 +------------------------------------------ +排名: 14 +书名: The Darkest Lie +评分: 5.0 +价格: 35.35 +------------------------------------------ +排名: 15 +书名: The Bane Chronicles (The Bane Chronicles #1-11) +评分: 4.0 +价格: 44.73 +------------------------------------------ +排名: 16 +书名: The Bad-Ass Librarians of Timbuktu: And Their Race to Save the World’s Most Precious Manuscripts +评分: 1.0 +价格: 15.77 +------------------------------------------ +排名: 17 +书名: The 14th Colony (Cotton Malone #11) +评分: 1.0 +价格: 39.24 +------------------------------------------ +排名: 18 +书名: That Darkness (Gardiner and Renner #1) +评分: 1.0 +价格: 13.92 +------------------------------------------ +排名: 19 +书名: Tastes Like Fear (DI Marnie Rome #3) +评分: 1.0 +价格: 10.69 +------------------------------------------ +排名: 20 +书名: Take Me with You +评分: 3.0 +价格: 45.21 +------------------------------------------ +排名: 1 +书名: Swell: A Year of Waves +评分: 1.0 +价格: 45.58 +------------------------------------------ +排名: 2 +书名: Superman Vol. 1: Before Truth (Superman by Gene Luen Yang #1) +评分: 5.0 +价格: 11.89 +------------------------------------------ +排名: 3 +书名: Still Life with Bread Crumbs +评分: 3.0 +价格: 26.41 +------------------------------------------ +排名: 4 +书名: Steve Jobs +评分: 5.0 +价格: 39.50 +------------------------------------------ +排名: 5 +书名: Sorting the Beef from the Bull: The Science of Food Fraud Forensics +评分: 4.0 +价格: 44.74 +------------------------------------------ +排名: 6 +书名: Someone Like You (The Harrisons #2) +评分: 5.0 +价格: 52.79 +------------------------------------------ +排名: 7 +书名: So Cute It Hurts!!, Vol. 6 (So Cute It Hurts!! #6) +评分: 4.0 +价格: 35.43 +------------------------------------------ +排名: 8 +书名: Shtum +评分: 4.0 +价格: 55.84 +------------------------------------------ +排名: 9 +书名: See America: A Celebration of Our National Parks & Treasured Sites +评分: 3.0 +价格: 48.87 +------------------------------------------ +排名: 10 +书名: salt. +评分: 4.0 +价格: 46.78 +------------------------------------------ +排名: 11 +书名: Robin War +评分: 3.0 +价格: 47.82 +------------------------------------------ +排名: 12 +书名: Red Hood/Arsenal, Vol. 1: Open for Business (Red Hood/Arsenal #1) +评分: 2.0 +价格: 25.48 +------------------------------------------ +排名: 13 +书名: Rain Fish +评分: 3.0 +价格: 23.57 +------------------------------------------ +排名: 14 +书名: Quarter Life Poetry: Poems for the Young, Broke and Hangry +评分: 5.0 +价格: 50.89 +------------------------------------------ +排名: 15 +书名: Pet Sematary +评分: 3.0 +价格: 10.56 +------------------------------------------ +排名: 16 +书名: Overload: How to Unplug, Unwind, and Unleash Yourself from the Pressure of Stress +评分: 3.0 +价格: 52.15 +------------------------------------------ +排名: 17 +书名: Once Was a Time +评分: 2.0 +价格: 18.28 +------------------------------------------ +排名: 18 +书名: Old School (Diary of a Wimpy Kid #10) +评分: 5.0 +价格: 11.83 +------------------------------------------ +排名: 19 +书名: No Dream Is Too High: Life Lessons From a Man Who Walked on the Moon +评分: 2.0 +价格: 21.95 +------------------------------------------ +排名: 20 +书名: Naruto (3-in-1 Edition), Vol. 14: Includes Vols. 40, 41 & 42 (Naruto: Omnibus #14) +评分: 2.0 +价格: 38.39 +------------------------------------------ +排名: 1 +书名: My Name Is Lucy Barton +评分: 1.0 +价格: 41.56 +------------------------------------------ +排名: 2 +书名: My Mrs. Brown +评分: 3.0 +价格: 24.48 +------------------------------------------ +排名: 3 +书名: My Kind of Crazy +评分: 1.0 +价格: 40.36 +------------------------------------------ +排名: 4 +书名: Mr. Mercedes (Bill Hodges Trilogy #1) +评分: 1.0 +价格: 28.90 +------------------------------------------ +排名: 5 +书名: More Than Music (Chasing the Dream #1) +评分: 2.0 +价格: 37.61 +------------------------------------------ +排名: 6 +书名: Made to Stick: Why Some Ideas Survive and Others Die +评分: 5.0 +价格: 38.85 +------------------------------------------ +排名: 7 +书名: Luis Paints the World +评分: 3.0 +价格: 53.95 +------------------------------------------ +排名: 8 +书名: Luckiest Girl Alive +评分: 3.0 +价格: 49.83 +------------------------------------------ +排名: 9 +书名: Lowriders to the Center of the Earth (Lowriders in Space #2) +评分: 2.0 +价格: 51.51 +------------------------------------------ +排名: 10 +书名: Love Is a Mix Tape (Music #1) +评分: 1.0 +价格: 18.03 +------------------------------------------ +排名: 11 +书名: Looking for Lovely: Collecting the Moments that Matter +评分: 5.0 +价格: 29.14 +------------------------------------------ +排名: 12 +书名: Living Leadership by Insight: A Good Leader Achieves, a Great Leader Builds Monuments +评分: 4.0 +价格: 46.91 +------------------------------------------ +排名: 13 +书名: Let It Out: A Journey Through Journaling +评分: 5.0 +价格: 26.79 +------------------------------------------ +排名: 14 +书名: Lady Midnight (The Dark Artifices #1) +评分: 5.0 +价格: 16.28 +------------------------------------------ +排名: 15 +书名: It's All Easy: Healthy, Delicious Weeknight Meals in under 30 Minutes +评分: 1.0 +价格: 19.55 +------------------------------------------ +排名: 16 +书名: Island of Dragons (Unwanteds #7) +评分: 1.0 +价格: 29.65 +------------------------------------------ +排名: 17 +书名: I Know What I'm Doing -- and Other Lies I Tell Myself: Dispatches from a Life Under Construction +评分: 4.0 +价格: 25.98 +------------------------------------------ +排名: 18 +书名: I Am Pilgrim (Pilgrim #1) +评分: 4.0 +价格: 10.60 +------------------------------------------ +排名: 19 +书名: Hyperbole and a Half: Unfortunate Situations, Flawed Coping Mechanisms, Mayhem, and Other Things That Happened +评分: 5.0 +价格: 14.75 +------------------------------------------ +排名: 20 +书名: Hush, Hush (Hush, Hush #1) +评分: 3.0 +价格: 47.02 +------------------------------------------ +排名: 1 +书名: Hold Your Breath (Search and Rescue #1) +评分: 1.0 +价格: 28.82 +------------------------------------------ +排名: 2 +书名: Hamilton: The Revolution +评分: 3.0 +价格: 58.79 +------------------------------------------ +排名: 3 +书名: Greek Mythic History +评分: 5.0 +价格: 10.23 +------------------------------------------ +排名: 4 +书名: God: The Most Unpleasant Character in All Fiction +评分: 5.0 +价格: 30.03 +------------------------------------------ +排名: 5 +书名: Glory over Everything: Beyond The Kitchen House +评分: 3.0 +价格: 45.84 +------------------------------------------ +排名: 6 +书名: Feathers: Displays of Brilliant Plumage +评分: 3.0 +价格: 49.05 +------------------------------------------ +排名: 7 +书名: Far & Away: Places on the Brink of Change: Seven Continents, Twenty-Five Years +评分: 4.0 +价格: 15.06 +------------------------------------------ +排名: 8 +书名: Every Last Word +评分: 3.0 +价格: 46.47 +------------------------------------------ +排名: 9 +书名: Eligible (The Austen Project #4) +评分: 3.0 +价格: 27.09 +------------------------------------------ +排名: 10 +书名: El Deafo +评分: 5.0 +价格: 57.62 +------------------------------------------ +排名: 11 +书名: Eight Hundred Grapes +评分: 4.0 +价格: 14.39 +------------------------------------------ +排名: 12 +书名: Eaternity: More than 150 Deliciously Easy Vegan Recipes for a Long, Healthy, Satisfied, Joyful Life +评分: 5.0 +价格: 51.75 +------------------------------------------ +排名: 13 +书名: Eat Fat, Get Thin +评分: 2.0 +价格: 54.07 +------------------------------------------ +排名: 14 +书名: Don't Get Caught +评分: 1.0 +价格: 55.35 +------------------------------------------ +排名: 15 +书名: Doctor Sleep (The Shining #2) +评分: 2.0 +价格: 40.12 +------------------------------------------ +排名: 16 +书名: Demigods & Magicians: Percy and Annabeth Meet the Kanes (Percy Jackson & Kane Chronicles Crossover #1-3) +评分: 5.0 +价格: 37.51 +------------------------------------------ +排名: 17 +书名: Dear Mr. Knightley +评分: 5.0 +价格: 11.21 +------------------------------------------ +排名: 18 +书名: Daily Fantasy Sports +评分: 1.0 +价格: 36.58 +------------------------------------------ +排名: 19 +书名: Crazy Love: Overwhelmed by a Relentless God +评分: 2.0 +价格: 47.72 +------------------------------------------ +排名: 20 +书名: Cometh the Hour (The Clifton Chronicles #6) +评分: 3.0 +价格: 25.01 +------------------------------------------ +排名: 1 +书名: Code Name Verity (Code Name Verity #1) +评分: 4.0 +价格: 22.13 +------------------------------------------ +排名: 2 +书名: Clockwork Angel (The Infernal Devices #1) +评分: 1.0 +价格: 44.14 +------------------------------------------ +排名: 3 +书名: City of Glass (The Mortal Instruments #3) +评分: 4.0 +价格: 56.02 +------------------------------------------ +排名: 4 +书名: City of Fallen Angels (The Mortal Instruments #4) +评分: 4.0 +价格: 11.23 +------------------------------------------ +排名: 5 +书名: City of Bones (The Mortal Instruments #1) +评分: 1.0 +价格: 43.28 +------------------------------------------ +排名: 6 +书名: City of Ashes (The Mortal Instruments #2) +评分: 1.0 +价格: 47.27 +------------------------------------------ +排名: 7 +书名: Cell +评分: 4.0 +价格: 20.29 +------------------------------------------ +排名: 8 +书名: Catching Jordan (Hundred Oaks) +评分: 3.0 +价格: 50.83 +------------------------------------------ +排名: 9 +书名: Carry On, Warrior: Thoughts on Life Unarmed +评分: 3.0 +价格: 31.85 +------------------------------------------ +排名: 10 +书名: Carrie +评分: 2.0 +价格: 46.23 +------------------------------------------ +排名: 11 +书名: Buying In: The Secret Dialogue Between What We Buy and Who We Are +评分: 4.0 +价格: 37.80 +------------------------------------------ +排名: 12 +书名: Brain on Fire: My Month of Madness +评分: 5.0 +价格: 49.32 +------------------------------------------ +排名: 13 +书名: Batman: Europa +评分: 2.0 +价格: 32.01 +------------------------------------------ +排名: 14 +书名: Barefoot Contessa Back to Basics +评分: 1.0 +价格: 28.01 +------------------------------------------ +排名: 15 +书名: Barefoot Contessa at Home: Everyday Recipes You'll Make Over and Over Again +评分: 5.0 +价格: 50.62 +------------------------------------------ +排名: 16 +书名: Balloon Animals +评分: 3.0 +价格: 17.03 +------------------------------------------ +排名: 17 +书名: Art Ops Vol. 1 +评分: 3.0 +价格: 48.80 +------------------------------------------ +排名: 18 +书名: Aristotle and Dante Discover the Secrets of the Universe (Aristotle and Dante Discover the Secrets of the Universe #1) +评分: 4.0 +价格: 58.14 +------------------------------------------ +排名: 19 +书名: Angels Walking (Angels Walking #1) +评分: 2.0 +价格: 34.20 +------------------------------------------ +排名: 20 +书名: Angels & Demons (Robert Langdon #1) +评分: 3.0 +价格: 51.48 +------------------------------------------ +排名: 1 +书名: All the Light We Cannot See +评分: 5.0 +价格: 29.87 +------------------------------------------ +排名: 2 +书名: Adulthood Is a Myth: A "Sarah's Scribbles" Collection +评分: 2.0 +价格: 10.90 +------------------------------------------ +排名: 3 +书名: Abstract City +评分: 5.0 +价格: 56.37 +------------------------------------------ +排名: 4 +书名: A Time of Torment (Charlie Parker #14) +评分: 5.0 +价格: 48.35 +------------------------------------------ +排名: 5 +书名: A Study in Scarlet (Sherlock Holmes #1) +评分: 2.0 +价格: 16.73 +------------------------------------------ +排名: 6 +书名: A Series of Catastrophes and Miracles: A True Story of Love, Science, and Cancer +评分: 2.0 +价格: 56.48 +------------------------------------------ +排名: 7 +书名: A People's History of the United States +评分: 2.0 +价格: 40.79 +------------------------------------------ +排名: 8 +书名: A Man Called Ove +评分: 1.0 +价格: 39.72 +------------------------------------------ +排名: 9 +书名: A Distant Mirror: The Calamitous 14th Century +评分: 3.0 +价格: 14.58 +------------------------------------------ +排名: 10 +书名: A Brush of Wings (Angels Walking #3) +评分: 1.0 +价格: 55.51 +------------------------------------------ +排名: 11 +书名: 1491: New Revelations of the Americas Before Columbus +评分: 3.0 +价格: 21.80 +------------------------------------------ +排名: 12 +书名: The Three Searches, Meaning, and the Story +评分: 3.0 +价格: 13.33 +------------------------------------------ +排名: 13 +书名: Searching for Meaning in Gailana +评分: 1.0 +价格: 38.73 +------------------------------------------ +排名: 14 +书名: Rook +评分: 4.0 +价格: 37.86 +------------------------------------------ +排名: 15 +书名: My Kitchen Year: 136 Recipes That Saved My Life +评分: 2.0 +价格: 11.53 +------------------------------------------ +排名: 16 +书名: 13 Hours: The Inside Account of What Really Happened In Benghazi +评分: 1.0 +价格: 27.06 +------------------------------------------ +排名: 17 +书名: Will You Won't You Want Me? +评分: 3.0 +价格: 13.86 +------------------------------------------ +排名: 18 +书名: Tipping Point for Planet Earth: How Close Are We to the Edge? +评分: 1.0 +价格: 37.55 +------------------------------------------ +排名: 19 +书名: The Star-Touched Queen +评分: 5.0 +价格: 32.30 +------------------------------------------ +排名: 20 +书名: The Silent Sister (Riley MacPherson #1) +评分: 5.0 +价格: 46.29 +------------------------------------------ +排名: 1 +书名: The Midnight Watch: A Novel of the Titanic and the Californian +评分: 1.0 +价格: 26.20 +------------------------------------------ +排名: 2 +书名: The Lonely City: Adventures in the Art of Being Alone +评分: 2.0 +价格: 33.26 +------------------------------------------ +排名: 3 +书名: The Gray Rhino: How to Recognize and Act on the Obvious Dangers We Ignore +评分: 4.0 +价格: 59.15 +------------------------------------------ +排名: 4 +书名: The Golden Condom: And Other Essays on Love Lost and Found +评分: 1.0 +价格: 39.43 +------------------------------------------ +排名: 5 +书名: The Epidemic (The Program 0.6) +评分: 5.0 +价格: 14.44 +------------------------------------------ +排名: 6 +书名: The Dinner Party +评分: 2.0 +价格: 56.54 +------------------------------------------ +排名: 7 +书名: The Diary of a Young Girl +评分: 3.0 +价格: 59.90 +------------------------------------------ +排名: 8 +书名: The Children +评分: 3.0 +价格: 11.88 +------------------------------------------ +排名: 9 +书名: Stars Above (The Lunar Chronicles #4.5) +评分: 2.0 +价格: 48.05 +------------------------------------------ +排名: 10 +书名: Snatched: How A Drug Queen Went Undercover for the DEA and Was Kidnapped By Colombian Guerillas +评分: 3.0 +价格: 21.21 +------------------------------------------ +排名: 11 +书名: Raspberry Pi Electronics Projects for the Evil Genius +评分: 4.0 +价格: 49.67 +------------------------------------------ +排名: 12 +书名: Quench Your Own Thirst: Business Lessons Learned Over a Beer or Two +评分: 1.0 +价格: 43.14 +------------------------------------------ +排名: 13 +书名: Psycho: Sanitarium (Psycho #1.5) +评分: 5.0 +价格: 36.97 +------------------------------------------ +排名: 14 +书名: Poisonous (Max Revere Novels #3) +评分: 3.0 +价格: 26.80 +------------------------------------------ +排名: 15 +书名: One with You (Crossfire #5) +评分: 4.0 +价格: 15.71 +------------------------------------------ +排名: 16 +书名: No Love Allowed (Dodge Cove #1) +评分: 4.0 +价格: 54.65 +------------------------------------------ +排名: 17 +书名: Murder at the 42nd Street Library (Raymond Ambler #1) +评分: 4.0 +价格: 54.36 +------------------------------------------ +排名: 18 +书名: Most Wanted +评分: 3.0 +价格: 35.28 +------------------------------------------ +排名: 19 +书名: Love, Lies and Spies +评分: 2.0 +价格: 20.55 +------------------------------------------ +排名: 20 +书名: How to Speak Golf: An Illustrated Guide to Links Lingo +评分: 5.0 +价格: 58.32 +------------------------------------------ +排名: 1 +书名: Hide Away (Eve Duncan #20) +评分: 1.0 +价格: 11.84 +------------------------------------------ +排名: 2 +书名: Furiously Happy: A Funny Book About Horrible Things +评分: 4.0 +价格: 41.46 +------------------------------------------ +排名: 3 +书名: Everyday Italian: 125 Simple and Delicious Recipes +评分: 5.0 +价格: 20.10 +------------------------------------------ +排名: 4 +书名: Equal Is Unfair: America's Misguided Fight Against Income Inequality +评分: 1.0 +价格: 56.86 +------------------------------------------ +排名: 5 +书名: Eleanor & Park +评分: 5.0 +价格: 56.51 +------------------------------------------ +排名: 6 +书名: Dirty (Dive Bar #1) +评分: 4.0 +价格: 40.83 +------------------------------------------ +排名: 7 +书名: Can You Keep a Secret? (Fear Street Relaunch #4) +评分: 1.0 +价格: 48.64 +------------------------------------------ +排名: 8 +书名: Boar Island (Anna Pigeon #19) +评分: 3.0 +价格: 59.48 +------------------------------------------ +排名: 9 +书名: A Paris Apartment +评分: 4.0 +价格: 39.01 +------------------------------------------ +排名: 10 +书名: A la Mode: 120 Recipes in 60 Pairings: Pies, Tarts, Cakes, Crisps, and More Topped with Ice Cream, Gelato, Frozen Custard, and More +评分: 1.0 +价格: 38.77 +------------------------------------------ +排名: 11 +书名: Troublemaker: Surviving Hollywood and Scientology +评分: 2.0 +价格: 48.39 +------------------------------------------ +排名: 12 +书名: The Widow +评分: 2.0 +价格: 27.26 +------------------------------------------ +排名: 13 +书名: The Sleep Revolution: Transforming Your Life, One Night at a Time +评分: 4.0 +价格: 11.68 +------------------------------------------ +排名: 14 +书名: The Improbability of Love +评分: 1.0 +价格: 59.45 +------------------------------------------ +排名: 15 +书名: The Art of Startup Fundraising +评分: 3.0 +价格: 21.00 +------------------------------------------ +排名: 16 +书名: Take Me Home Tonight (Rock Star Romance #3) +评分: 3.0 +价格: 53.98 +------------------------------------------ +排名: 17 +书名: Sleeping Giants (Themis Files #1) +评分: 1.0 +价格: 48.74 +------------------------------------------ +排名: 18 +书名: Setting the World on Fire: The Brief, Astonishing Life of St. Catherine of Siena +评分: 2.0 +价格: 21.15 +------------------------------------------ +排名: 19 +书名: Playing with Fire +评分: 3.0 +价格: 13.71 +------------------------------------------ +排名: 20 +书名: Off the Hook (Fishing for Trouble #1) +评分: 3.0 +价格: 47.67 +------------------------------------------ +排名: 1 +书名: Mothering Sunday +评分: 2.0 +价格: 13.34 +------------------------------------------ +排名: 2 +书名: Mother, Can You Not? +评分: 5.0 +价格: 16.89 +------------------------------------------ +排名: 3 +书名: M Train +评分: 1.0 +价格: 27.18 +------------------------------------------ +排名: 4 +书名: Lilac Girls +评分: 2.0 +价格: 17.28 +------------------------------------------ +排名: 5 +书名: Lies and Other Acts of Love +评分: 1.0 +价格: 45.14 +------------------------------------------ +排名: 6 +书名: Lab Girl +评分: 1.0 +价格: 40.85 +------------------------------------------ +排名: 7 +书名: Keep Me Posted +评分: 4.0 +价格: 20.46 +------------------------------------------ +排名: 8 +书名: It Didn't Start with You: How Inherited Family Trauma Shapes Who We Are and How to End the Cycle +评分: 3.0 +价格: 56.27 +------------------------------------------ +排名: 9 +书名: Grey (Fifty Shades #4) +评分: 4.0 +价格: 48.49 +------------------------------------------ +排名: 10 +书名: Exit, Pursued by a Bear +评分: 4.0 +价格: 51.34 +------------------------------------------ +排名: 11 +书名: Daredevils +评分: 3.0 +价格: 16.34 +------------------------------------------ +排名: 12 +书名: Cravings: Recipes for What You Want to Eat +评分: 3.0 +价格: 20.50 +------------------------------------------ +排名: 13 +书名: Born for This: How to Find the Work You Were Meant to Do +评分: 5.0 +价格: 21.59 +------------------------------------------ +排名: 14 +书名: Arena +评分: 4.0 +价格: 21.36 +------------------------------------------ +排名: 15 +书名: Adultery +评分: 5.0 +价格: 20.88 +------------------------------------------ +排名: 16 +书名: A Mother's Reckoning: Living in the Aftermath of Tragedy +评分: 3.0 +价格: 19.53 +------------------------------------------ +排名: 17 +书名: A Gentleman's Position (Society of Gentlemen #3) +评分: 5.0 +价格: 14.75 +------------------------------------------ +排名: 18 +书名: 11/22/63 +评分: 3.0 +价格: 48.48 +------------------------------------------ +排名: 19 +书名: 10% Happier: How I Tamed the Voice in My Head, Reduced Stress Without Losing My Edge, and Found Self-Help That Actually Works +评分: 2.0 +价格: 24.57 +------------------------------------------ +排名: 20 +书名: 10-Day Green Smoothie Cleanse: Lose Up to 15 Pounds in 10 Days! +评分: 5.0 +价格: 49.71 +------------------------------------------ +排名: 1 +书名: Without Shame +评分: 5.0 +价格: 48.27 +------------------------------------------ +排名: 2 +书名: Watchmen +评分: 4.0 +价格: 58.05 +------------------------------------------ +排名: 3 +书名: Unlimited Intuition Now +评分: 4.0 +价格: 58.87 +------------------------------------------ +排名: 4 +书名: Underlying Notes +评分: 2.0 +价格: 11.82 +------------------------------------------ +排名: 5 +书名: The Shack +评分: 1.0 +价格: 28.03 +------------------------------------------ +排名: 6 +书名: The New Brand You: Your New Image Makes the Sale for You +评分: 5.0 +价格: 44.05 +------------------------------------------ +排名: 7 +书名: The Moosewood Cookbook: Recipes from Moosewood Restaurant, Ithaca, New York +评分: 4.0 +价格: 12.34 +------------------------------------------ +排名: 8 +书名: The Flowers Lied +评分: 2.0 +价格: 16.68 +------------------------------------------ +排名: 9 +书名: The Fabric of the Cosmos: Space, Time, and the Texture of Reality +评分: 1.0 +价格: 55.91 +------------------------------------------ +排名: 10 +书名: The Book of Mormon +评分: 3.0 +价格: 24.57 +------------------------------------------ +排名: 11 +书名: The Art and Science of Low Carbohydrate Living +评分: 5.0 +价格: 52.98 +------------------------------------------ +排名: 12 +书名: The Alien Club +评分: 1.0 +价格: 54.40 +------------------------------------------ +排名: 13 +书名: Suzie Snowflake: One beautiful flake (a self-esteem story) +评分: 5.0 +价格: 54.81 +------------------------------------------ +排名: 14 +书名: Nap-a-Roo +评分: 1.0 +价格: 25.08 +------------------------------------------ +排名: 15 +书名: NaNo What Now? Finding your editing process, revising your NaNoWriMo book and building a writing career through publishing and beyond +评分: 4.0 +价格: 10.41 +------------------------------------------ +排名: 16 +书名: Modern Day Fables +评分: 2.0 +价格: 47.44 +------------------------------------------ +排名: 17 +书名: If I Gave You God's Phone Number....: Searching for Spirituality in America +评分: 1.0 +价格: 20.91 +------------------------------------------ +排名: 18 +书名: Fruits Basket, Vol. 9 (Fruits Basket #9) +评分: 4.0 +价格: 33.95 +------------------------------------------ +排名: 19 +书名: Dress Your Family in Corduroy and Denim +评分: 3.0 +价格: 43.68 +------------------------------------------ +排名: 20 +书名: Don't Forget Steven +评分: 1.0 +价格: 33.23 +------------------------------------------ +排名: 1 +书名: Chernobyl 01:23:40: The Incredible True Story of the World's Worst Nuclear Disaster +评分: 2.0 +价格: 35.92 +------------------------------------------ +排名: 2 +书名: Art and Fear: Observations on the Perils (and Rewards) of Artmaking +评分: 4.0 +价格: 48.63 +------------------------------------------ +排名: 3 +书名: A Shard of Ice (The Black Symphony Saga #1) +评分: 3.0 +价格: 56.63 +------------------------------------------ +排名: 4 +书名: A Hero's Curse (The Unseen Chronicles #1) +评分: 3.0 +价格: 50.49 +------------------------------------------ +排名: 5 +书名: 23 Degrees South: A Tropical Tale of Changing Whether... +评分: 2.0 +价格: 35.79 +------------------------------------------ +排名: 6 +书名: Zero to One: Notes on Startups, or How to Build the Future +评分: 3.0 +价格: 34.06 +------------------------------------------ +排名: 7 +书名: Why Not Me? +评分: 1.0 +价格: 17.76 +------------------------------------------ +排名: 8 +书名: When Breath Becomes Air +评分: 2.0 +价格: 39.36 +------------------------------------------ +排名: 9 +书名: Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel +评分: 2.0 +价格: 36.94 +------------------------------------------ +排名: 10 +书名: The Unlikely Pilgrimage of Harold Fry (Harold Fry #1) +评分: 5.0 +价格: 43.62 +------------------------------------------ +排名: 11 +书名: The New Drawing on the Right Side of the Brain +评分: 3.0 +价格: 43.02 +------------------------------------------ +排名: 12 +书名: The Midnight Assassin: Panic, Scandal, and the Hunt for America's First Serial Killer +评分: 4.0 +价格: 28.45 +------------------------------------------ +排名: 13 +书名: The Martian (The Martian #1) +评分: 2.0 +价格: 41.39 +------------------------------------------ +排名: 14 +书名: The High Mountains of Portugal +评分: 1.0 +价格: 51.15 +------------------------------------------ +排名: 15 +书名: The Grownup +评分: 1.0 +价格: 35.88 +------------------------------------------ +排名: 16 +书名: The E-Myth Revisited: Why Most Small Businesses Don't Work and What to Do About It +评分: 1.0 +价格: 36.91 +------------------------------------------ +排名: 17 +书名: South of Sunshine +评分: 1.0 +价格: 28.93 +------------------------------------------ +排名: 18 +书名: Smarter Faster Better: The Secrets of Being Productive in Life and Business +评分: 5.0 +价格: 38.89 +------------------------------------------ +排名: 19 +书名: Silence in the Dark (Logan Point #4) +评分: 3.0 +价格: 58.33 +------------------------------------------ +排名: 20 +书名: Shadows of the Past (Logan Point #1) +评分: 5.0 +价格: 39.67 +------------------------------------------ +排名: 1 +书名: Roller Girl +评分: 5.0 +价格: 14.10 +------------------------------------------ +排名: 2 +书名: Rising Strong +评分: 3.0 +价格: 21.82 +------------------------------------------ +排名: 3 +书名: Proofs of God: Classical Arguments from Tertullian to Barth +评分: 1.0 +价格: 54.21 +------------------------------------------ +排名: 4 +书名: Please Kill Me: The Uncensored Oral History of Punk +评分: 4.0 +价格: 31.19 +------------------------------------------ +排名: 5 +书名: Out of Print: City Lights Spotlight No. 14 +评分: 5.0 +价格: 53.64 +------------------------------------------ +排名: 6 +书名: My Life Next Door (My Life Next Door ) +评分: 5.0 +价格: 36.39 +------------------------------------------ +排名: 7 +书名: Miller's Valley +评分: 2.0 +价格: 58.54 +------------------------------------------ +排名: 8 +书名: Man's Search for Meaning +评分: 3.0 +价格: 29.48 +------------------------------------------ +排名: 9 +书名: Love That Boy: What Two Presidents, Eight Road Trips, and My Son Taught Me About a Parent's Expectations +评分: 2.0 +价格: 25.06 +------------------------------------------ +排名: 10 +书名: Living Forward: A Proven Plan to Stop Drifting and Get the Life You Want +评分: 3.0 +价格: 12.55 +------------------------------------------ +排名: 11 +书名: Les Fleurs du Mal +评分: 5.0 +价格: 29.04 +------------------------------------------ +排名: 12 +书名: Left Behind (Left Behind #1) +评分: 2.0 +价格: 40.72 +------------------------------------------ +排名: 13 +书名: Kill 'Em and Leave: Searching for James Brown and the American Soul +评分: 5.0 +价格: 45.05 +------------------------------------------ +排名: 14 +书名: Kierkegaard: A Christian Missionary to Christians +评分: 1.0 +价格: 47.13 +------------------------------------------ +排名: 15 +书名: John Vassos: Industrial Design for Modern Life +评分: 4.0 +价格: 20.22 +------------------------------------------ +排名: 16 +书名: I'll Give You the Sun +评分: 1.0 +价格: 56.48 +------------------------------------------ +排名: 17 +书名: I Will Find You +评分: 1.0 +价格: 44.21 +------------------------------------------ +排名: 18 +书名: Hystopia: A Novel +评分: 4.0 +价格: 21.96 +------------------------------------------ +排名: 19 +书名: Howl and Other Poems +评分: 2.0 +价格: 40.45 +------------------------------------------ +排名: 20 +书名: History of Beauty +评分: 4.0 +价格: 10.29 +------------------------------------------ +排名: 1 +书名: Heaven is for Real: A Little Boy's Astounding Story of His Trip to Heaven and Back +评分: 2.0 +价格: 52.86 +------------------------------------------ +排名: 2 +书名: Future Shock (Future Shock #1) +评分: 5.0 +价格: 55.65 +------------------------------------------ +排名: 3 +书名: Ender's Game (The Ender Quintet #1) +评分: 1.0 +价格: 43.64 +------------------------------------------ +排名: 4 +书名: Diary of a Citizen Scientist: Chasing Tiger Beetles and Other New Ways of Engaging the World +评分: 1.0 +价格: 28.41 +------------------------------------------ +排名: 5 +书名: Death by Leisure: A Cautionary Tale +评分: 4.0 +价格: 37.51 +------------------------------------------ +排名: 6 +书名: Brilliant Beacons: A History of the American Lighthouse +评分: 3.0 +价格: 11.45 +------------------------------------------ +排名: 7 +书名: Brazen: The Courage to Find the You That's Been Hiding +评分: 2.0 +价格: 19.22 +------------------------------------------ +排名: 8 +书名: Between the World and Me +评分: 4.0 +价格: 56.91 +------------------------------------------ +排名: 9 +书名: Being Mortal: Medicine and What Matters in the End +评分: 4.0 +价格: 55.06 +------------------------------------------ +排名: 10 +书名: A Murder Over a Girl: Justice, Gender, Junior High +评分: 3.0 +价格: 13.20 +------------------------------------------ +排名: 11 +书名: 32 Yolks +评分: 2.0 +价格: 53.63 +------------------------------------------ +排名: 12 +书名: "Most Blessed of the Patriarchs": Thomas Jefferson and the Empire of the Imagination +评分: 5.0 +价格: 44.48 +------------------------------------------ +排名: 13 +书名: You Are a Badass: How to Stop Doubting Your Greatness and Start Living an Awesome Life +评分: 3.0 +价格: 12.08 +------------------------------------------ +排名: 14 +书名: Wildlife of New York: A Five-Borough Coloring Book +评分: 2.0 +价格: 22.14 +------------------------------------------ +排名: 15 +书名: What Happened on Beale Street (Secrets of the South Mysteries #2) +评分: 5.0 +价格: 25.37 +------------------------------------------ +排名: 16 +书名: Unreasonable Hope: Finding Faith in the God Who Brings Purpose to Your Pain +评分: 2.0 +价格: 46.33 +------------------------------------------ +排名: 17 +书名: Under the Tuscan Sun +评分: 3.0 +价格: 37.33 +------------------------------------------ +排名: 18 +书名: Toddlers Are A**holes: It's Not Your Fault +评分: 1.0 +价格: 25.55 +------------------------------------------ +排名: 19 +书名: The Year of Living Biblically: One Man's Humble Quest to Follow the Bible as Literally as Possible +评分: 1.0 +价格: 34.72 +------------------------------------------ +排名: 20 +书名: The Whale +评分: 4.0 +价格: 35.96 +------------------------------------------ +排名: 1 +书名: The Story of Art +评分: 4.0 +价格: 41.14 +------------------------------------------ +排名: 2 +书名: The Origin of Species +评分: 4.0 +价格: 10.01 +------------------------------------------ +排名: 3 +书名: The Great Gatsby +评分: 4.0 +价格: 36.05 +------------------------------------------ +排名: 4 +书名: The Good Girl +评分: 3.0 +价格: 49.03 +------------------------------------------ +排名: 5 +书名: The Glass Castle +评分: 1.0 +价格: 16.24 +------------------------------------------ +排名: 6 +书名: The Faith of Christopher Hitchens: The Restless Soul of the World's Most Notorious Atheist +评分: 1.0 +价格: 39.55 +------------------------------------------ +排名: 7 +书名: The Drowning Girls +评分: 3.0 +价格: 35.67 +------------------------------------------ +排名: 8 +书名: The Constant Princess (The Tudor Court #1) +评分: 3.0 +价格: 16.62 +------------------------------------------ +排名: 9 +书名: The Bourne Identity (Jason Bourne #1) +评分: 4.0 +价格: 42.78 +------------------------------------------ +排名: 10 +书名: The Bachelor Girl's Guide to Murder (Herringford and Watts Mysteries #1) +评分: 5.0 +价格: 52.30 +------------------------------------------ +排名: 11 +书名: The Art Book +评分: 2.0 +价格: 32.34 +------------------------------------------ +排名: 12 +书名: The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change +评分: 4.0 +价格: 33.17 +------------------------------------------ +排名: 13 +书名: Team of Rivals: The Political Genius of Abraham Lincoln +评分: 5.0 +价格: 20.12 +------------------------------------------ +排名: 14 +书名: Steal Like an Artist: 10 Things Nobody Told You About Being Creative +评分: 2.0 +价格: 20.90 +------------------------------------------ +排名: 15 +书名: Sit, Stay, Love +评分: 3.0 +价格: 20.90 +------------------------------------------ +排名: 16 +书名: Sister Dear +评分: 4.0 +价格: 40.20 +------------------------------------------ +排名: 17 +书名: Shrunken Treasures: Literary Classics, Short, Sweet, and Silly +评分: 3.0 +价格: 52.87 +------------------------------------------ +排名: 18 +书名: Rich Dad, Poor Dad +评分: 1.0 +价格: 51.74 +------------------------------------------ +排名: 19 +书名: Raymie Nightingale +评分: 2.0 +价格: 34.41 +------------------------------------------ +排名: 20 +书名: Playing from the Heart +评分: 1.0 +价格: 32.38 +------------------------------------------ +排名: 1 +书名: Nightstruck: A Novel +评分: 4.0 +价格: 50.35 +------------------------------------------ +排名: 2 +书名: Naturally Lean: 125 Nourishing Gluten-Free, Plant-Based Recipes--All Under 300 Calories +评分: 5.0 +价格: 11.38 +------------------------------------------ +排名: 3 +书名: Meternity +评分: 3.0 +价格: 43.58 +------------------------------------------ +排名: 4 +书名: Memoirs of a Geisha +评分: 3.0 +价格: 49.67 +------------------------------------------ +排名: 5 +书名: Like Never Before (Walker Family #2) +评分: 2.0 +价格: 28.77 +------------------------------------------ +排名: 6 +书名: Life of Pi +评分: 4.0 +价格: 13.22 +------------------------------------------ +排名: 7 +书名: Leave This Song Behind: Teen Poetry at Its Best +评分: 5.0 +价格: 51.17 +------------------------------------------ +排名: 8 +书名: King's Folly (The Kinsman Chronicles #1) +评分: 5.0 +价格: 39.61 +------------------------------------------ +排名: 9 +书名: John Adams +评分: 4.0 +价格: 57.43 +------------------------------------------ +排名: 10 +书名: How to Cook Everything Vegetarian: Simple Meatless Recipes for Great Food (How to Cook Everything) +评分: 4.0 +价格: 46.01 +------------------------------------------ +排名: 11 +书名: How to Be a Domestic Goddess: Baking and the Art of Comfort Cooking +评分: 2.0 +价格: 28.25 +------------------------------------------ +排名: 12 +书名: Good in Bed (Cannie Shapiro #1) +评分: 5.0 +价格: 37.05 +------------------------------------------ +排名: 13 +书名: Fruits Basket, Vol. 7 (Fruits Basket #7) +评分: 1.0 +价格: 19.57 +------------------------------------------ +排名: 14 +书名: For the Love: Fighting for Grace in a World of Impossible Standards +评分: 3.0 +价格: 45.13 +------------------------------------------ +排名: 15 +书名: Finding God in the Ruins: How God Redeems Pain +评分: 2.0 +价格: 46.64 +------------------------------------------ +排名: 16 +书名: Every Heart a Doorway (Every Heart A Doorway #1) +评分: 5.0 +价格: 12.16 +------------------------------------------ +排名: 17 +书名: Delivering the Truth (Quaker Midwife Mystery #1) +评分: 4.0 +价格: 20.89 +------------------------------------------ +排名: 18 +书名: Counted With the Stars (Out from Egypt #1) +评分: 5.0 +价格: 17.97 +------------------------------------------ +排名: 19 +书名: Chronicles, Vol. 1 +评分: 2.0 +价格: 52.60 +------------------------------------------ +排名: 20 +书名: Blue Like Jazz: Nonreligious Thoughts on Christian Spirituality +评分: 1.0 +价格: 25.77 +------------------------------------------ +排名: 1 +书名: Benjamin Franklin: An American Life +评分: 3.0 +价格: 48.19 +------------------------------------------ +排名: 2 +书名: At The Existentialist Café: Freedom, Being, and apricot cocktails with: Jean-Paul Sartre, Simone de Beauvoir, Albert Camus, Martin Heidegger, Edmund Husserl, Karl Jaspers, Maurice Merleau-Ponty and others +评分: 5.0 +价格: 29.93 +------------------------------------------ +排名: 3 +书名: A Summer In Europe +评分: 2.0 +价格: 44.34 +------------------------------------------ +排名: 4 +书名: A Short History of Nearly Everything +评分: 5.0 +价格: 52.40 +------------------------------------------ +排名: 5 +书名: A Gathering of Shadows (Shades of Magic #2) +评分: 4.0 +价格: 44.81 +------------------------------------------ +排名: 6 +书名: The Sound Of Love +评分: 5.0 +价格: 57.84 +------------------------------------------ +排名: 7 +书名: The Rise and Fall of the Third Reich: A History of Nazi Germany +评分: 2.0 +价格: 39.67 +------------------------------------------ +排名: 8 +书名: The Perks of Being a Wallflower +评分: 3.0 +价格: 55.02 +------------------------------------------ +排名: 9 +书名: The Mysterious Affair at Styles (Hercule Poirot #1) +评分: 4.0 +价格: 24.80 +------------------------------------------ +排名: 10 +书名: The Man Who Mistook His Wife for a Hat and Other Clinical Tales +评分: 4.0 +价格: 59.45 +------------------------------------------ +排名: 11 +书名: The Makings of a Fatherless Child +评分: 2.0 +价格: 31.58 +------------------------------------------ +排名: 12 +书名: The Joy of Cooking +评分: 4.0 +价格: 43.27 +------------------------------------------ +排名: 13 +书名: The Invention of Wings +评分: 1.0 +价格: 37.34 +------------------------------------------ +排名: 14 +书名: The Hobbit (Middle-Earth Universe) +评分: 5.0 +价格: 17.80 +------------------------------------------ +排名: 15 +书名: The Great Railway Bazaar +评分: 1.0 +价格: 30.54 +------------------------------------------ +排名: 16 +书名: The Golden Compass (His Dark Materials #1) +评分: 1.0 +价格: 18.77 +------------------------------------------ +排名: 17 +书名: The God Delusion +评分: 3.0 +价格: 46.85 +------------------------------------------ +排名: 18 +书名: The Girl You Left Behind (The Girl You Left Behind #1) +评分: 1.0 +价格: 15.79 +------------------------------------------ +排名: 19 +书名: The Fellowship of the Ring (The Lord of the Rings #1) +评分: 2.0 +价格: 10.27 +------------------------------------------ +排名: 20 +书名: The Collected Poems of W.B. Yeats (The Collected Works of W.B. Yeats #1) +评分: 5.0 +价格: 15.42 +------------------------------------------ +排名: 1 +书名: The Barefoot Contessa Cookbook +评分: 5.0 +价格: 59.92 +------------------------------------------ +排名: 2 +书名: Tell the Wolves I'm Home +评分: 2.0 +价格: 50.96 +------------------------------------------ +排名: 3 +书名: Ship Leaves Harbor: Essays on Travel by a Recovering Journeyman +评分: 3.0 +价格: 30.60 +------------------------------------------ +排名: 4 +书名: Pride and Prejudice +评分: 4.0 +价格: 19.27 +------------------------------------------ +排名: 5 +书名: Musicophilia: Tales of Music and the Brain +评分: 1.0 +价格: 46.58 +------------------------------------------ +排名: 6 +书名: Mere Christianity +评分: 3.0 +价格: 48.51 +------------------------------------------ +排名: 7 +书名: Me Before You (Me Before You #1) +评分: 1.0 +价格: 19.02 +------------------------------------------ +排名: 8 +书名: In the Woods (Dublin Murder Squad #1) +评分: 2.0 +价格: 38.38 +------------------------------------------ +排名: 9 +书名: In Cold Blood +评分: 4.0 +价格: 49.98 +------------------------------------------ +排名: 10 +书名: How to Stop Worrying and Start Living +评分: 5.0 +价格: 46.49 +------------------------------------------ +排名: 11 +书名: Give It Back +评分: 2.0 +价格: 18.32 +------------------------------------------ +排名: 12 +书名: Girl, Interrupted +评分: 3.0 +价格: 42.14 +------------------------------------------ +排名: 13 +书名: Fun Home: A Family Tragicomic +评分: 4.0 +价格: 56.59 +------------------------------------------ +排名: 14 +书名: Fruits Basket, Vol. 6 (Fruits Basket #6) +评分: 4.0 +价格: 20.96 +------------------------------------------ +排名: 15 +书名: Deception Point +评分: 4.0 +价格: 40.32 +------------------------------------------ +排名: 16 +书名: Death Note, Vol. 6: Give-and-Take (Death Note #6) +评分: 3.0 +价格: 36.39 +------------------------------------------ +排名: 17 +书名: Catherine the Great: Portrait of a Woman +评分: 4.0 +价格: 58.55 +------------------------------------------ +排名: 18 +书名: Better Homes and Gardens New Cook Book +评分: 3.0 +价格: 39.61 +------------------------------------------ +排名: 19 +书名: An Unquiet Mind: A Memoir of Moods and Madness +评分: 3.0 +价格: 21.30 +------------------------------------------ +排名: 20 +书名: A Year in Provence (Provence #1) +评分: 4.0 +价格: 56.88 +------------------------------------------ +排名: 1 +书名: World Without End (The Pillars of the Earth #2) +评分: 4.0 +价格: 32.97 +------------------------------------------ +排名: 2 +书名: Will Grayson, Will Grayson (Will Grayson, Will Grayson) +评分: 4.0 +价格: 47.31 +------------------------------------------ +排名: 3 +书名: Why Save the Bankers?: And Other Essays on Our Economic and Political Crisis +评分: 2.0 +价格: 48.67 +------------------------------------------ +排名: 4 +书名: Where She Went (If I Stay #2) +评分: 4.0 +价格: 41.73 +------------------------------------------ +排名: 5 +书名: What If?: Serious Scientific Answers to Absurd Hypothetical Questions +评分: 4.0 +价格: 53.68 +------------------------------------------ +排名: 6 +书名: Two Summers +评分: 1.0 +价格: 14.64 +------------------------------------------ +排名: 7 +书名: This Is Your Brain on Music: The Science of a Human Obsession +评分: 1.0 +价格: 38.40 +------------------------------------------ +排名: 8 +书名: The Secret Garden +评分: 4.0 +价格: 15.08 +------------------------------------------ +排名: 9 +书名: The Raven King (The Raven Cycle #4) +评分: 2.0 +价格: 30.57 +------------------------------------------ +排名: 10 +书名: The Raven Boys (The Raven Cycle #1) +评分: 4.0 +价格: 57.74 +------------------------------------------ +排名: 11 +书名: The Power Greens Cookbook: 140 Delicious Superfood Recipes +评分: 5.0 +价格: 11.05 +------------------------------------------ +排名: 12 +书名: The Metamorphosis +评分: 1.0 +价格: 28.58 +------------------------------------------ +排名: 13 +书名: The Mathews Men: Seven Brothers and the War Against Hitler's U-boats +评分: 5.0 +价格: 42.91 +------------------------------------------ +排名: 14 +书名: The Little Paris Bookshop +评分: 3.0 +价格: 24.73 +------------------------------------------ +排名: 15 +书名: The Hiding Place +评分: 4.0 +价格: 55.91 +------------------------------------------ +排名: 16 +书名: The Grand Design +评分: 3.0 +价格: 13.76 +------------------------------------------ +排名: 17 +书名: The Firm +评分: 3.0 +价格: 45.56 +------------------------------------------ +排名: 18 +书名: The Fault in Our Stars +评分: 1.0 +价格: 47.22 +------------------------------------------ +排名: 19 +书名: The False Prince (The Ascendance Trilogy #1) +评分: 5.0 +价格: 56.00 +------------------------------------------ +排名: 20 +书名: The Expatriates +评分: 2.0 +价格: 44.58 +------------------------------------------ +排名: 1 +书名: The Dream Thieves (The Raven Cycle #2) +评分: 1.0 +价格: 34.50 +------------------------------------------ +排名: 2 +书名: The Darkest Corners +评分: 5.0 +价格: 11.33 +------------------------------------------ +排名: 3 +书名: The Crossover +评分: 4.0 +价格: 38.77 +------------------------------------------ +排名: 4 +书名: The 5th Wave (The 5th Wave #1) +评分: 2.0 +价格: 11.83 +------------------------------------------ +排名: 5 +书名: Tell the Wind and Fire +评分: 3.0 +价格: 45.51 +------------------------------------------ +排名: 6 +书名: Tell Me Three Things +评分: 1.0 +价格: 41.81 +------------------------------------------ +排名: 7 +书名: Talking to Girls About Duran Duran: One Young Man's Quest for True Love and a Cooler Haircut +评分: 4.0 +价格: 25.15 +------------------------------------------ +排名: 8 +书名: Siddhartha +评分: 5.0 +价格: 34.22 +------------------------------------------ +排名: 9 +书名: Shiver (The Wolves of Mercy Falls #1) +评分: 5.0 +价格: 16.23 +------------------------------------------ +排名: 10 +书名: Remember Me? +评分: 3.0 +价格: 11.48 +------------------------------------------ +排名: 11 +书名: Red Dragon (Hannibal Lecter #1) +评分: 3.0 +价格: 23.37 +------------------------------------------ +排名: 12 +书名: Peak: Secrets from the New Science of Expertise +评分: 2.0 +价格: 16.28 +------------------------------------------ +排名: 13 +书名: My Mother Was Nuts +评分: 4.0 +价格: 31.63 +------------------------------------------ +排名: 14 +书名: Mexican Today: New and Rediscovered Recipes for Contemporary Kitchens +评分: 5.0 +价格: 24.91 +------------------------------------------ +排名: 15 +书名: Maybe Something Beautiful: How Art Transformed a Neighborhood +评分: 1.0 +价格: 22.54 +------------------------------------------ +排名: 16 +书名: Lola and the Boy Next Door (Anna and the French Kiss #2) +评分: 4.0 +价格: 23.63 +------------------------------------------ +排名: 17 +书名: Logan Kade (Fallen Crest High #5.5) +评分: 2.0 +价格: 13.12 +------------------------------------------ +排名: 18 +书名: Last One Home (New Beginnings #1) +评分: 3.0 +价格: 59.98 +------------------------------------------ +排名: 19 +书名: Killing Floor (Jack Reacher #1) +评分: 4.0 +价格: 31.49 +------------------------------------------ +排名: 20 +书名: Kill the Boy Band +评分: 5.0 +价格: 15.52 +------------------------------------------ +排名: 1 +书名: Isla and the Happily Ever After (Anna and the French Kiss #3) +评分: 5.0 +价格: 48.13 +------------------------------------------ +排名: 2 +书名: If I Stay (If I Stay #1) +评分: 5.0 +价格: 38.13 +------------------------------------------ +排名: 3 +书名: I Know Why the Caged Bird Sings (Maya Angelou's Autobiography #1) +评分: 2.0 +价格: 36.55 +------------------------------------------ +排名: 4 +书名: Harry Potter and the Deathly Hallows (Harry Potter #7) +评分: 1.0 +价格: 23.32 +------------------------------------------ +排名: 5 +书名: Fruits Basket, Vol. 5 (Fruits Basket #5) +评分: 1.0 +价格: 16.33 +------------------------------------------ +排名: 6 +书名: Foundation (Foundation (Publication Order) #1) +评分: 1.0 +价格: 32.42 +------------------------------------------ +排名: 7 +书名: Fool Me Once +评分: 1.0 +价格: 16.96 +------------------------------------------ +排名: 8 +书名: Find Her (Detective D.D. Warren #8) +评分: 1.0 +价格: 22.37 +------------------------------------------ +排名: 9 +书名: Evicted: Poverty and Profit in the American City +评分: 1.0 +价格: 42.27 +------------------------------------------ +排名: 10 +书名: Drama +评分: 2.0 +价格: 38.70 +------------------------------------------ +排名: 11 +书名: Dracula the Un-Dead +评分: 5.0 +价格: 35.63 +------------------------------------------ +排名: 12 +书名: Digital Fortress +评分: 5.0 +价格: 58.00 +------------------------------------------ +排名: 13 +书名: Death Note, Vol. 5: Whiteout (Death Note #5) +评分: 1.0 +价格: 52.41 +------------------------------------------ +排名: 14 +书名: Data, A Love Story: How I Gamed Online Dating to Meet My Match +评分: 3.0 +价格: 32.35 +------------------------------------------ +排名: 15 +书名: Critique of Pure Reason +评分: 1.0 +价格: 20.75 +------------------------------------------ +排名: 16 +书名: Booked +评分: 5.0 +价格: 17.49 +------------------------------------------ +排名: 17 +书名: Blue Lily, Lily Blue (The Raven Cycle #3) +评分: 5.0 +价格: 34.13 +------------------------------------------ +排名: 18 +书名: Approval Junkie: Adventures in Caring Too Much +评分: 5.0 +价格: 58.81 +------------------------------------------ +排名: 19 +书名: An Abundance of Katherines +评分: 5.0 +价格: 10.00 +------------------------------------------ +排名: 20 +书名: America's War for the Greater Middle East: A Military History +评分: 2.0 +价格: 51.22 +------------------------------------------ +排名: 1 +书名: Alight (The Generations Trilogy #2) +评分: 4.0 +价格: 58.59 +------------------------------------------ +排名: 2 +书名: A Girl's Guide to Moving On (New Beginnings #2) +评分: 1.0 +价格: 31.30 +------------------------------------------ +排名: 3 +书名: A Game of Thrones (A Song of Ice and Fire #1) +评分: 2.0 +价格: 46.42 +------------------------------------------ +排名: 4 +书名: A Feast for Crows (A Song of Ice and Fire #4) +评分: 4.0 +价格: 17.21 +------------------------------------------ +排名: 5 +书名: A Clash of Kings (A Song of Ice and Fire #2) +评分: 3.0 +价格: 10.79 +------------------------------------------ +排名: 6 +书名: Vogue Colors A to Z: A Fashion Coloring Book +评分: 4.0 +价格: 52.35 +------------------------------------------ +排名: 7 +书名: The Shining (The Shining #1) +评分: 3.0 +价格: 27.88 +------------------------------------------ +排名: 8 +书名: The Pilgrim's Progress +评分: 2.0 +价格: 50.26 +------------------------------------------ +排名: 9 +书名: The Perfect Play (Play by Play #1) +评分: 3.0 +价格: 59.99 +------------------------------------------ +排名: 10 +书名: The Passion of Dolssa +评分: 5.0 +价格: 28.32 +------------------------------------------ +排名: 11 +书名: The Jazz of Physics: The Secret Link Between Music and the Structure of the Universe +评分: 3.0 +价格: 38.71 +------------------------------------------ +排名: 12 +书名: The Hunger Games (The Hunger Games #1) +评分: 5.0 +价格: 29.85 +------------------------------------------ +排名: 13 +书名: The Hound of the Baskervilles (Sherlock Holmes #5) +评分: 2.0 +价格: 14.82 +------------------------------------------ +排名: 14 +书名: The Gunning of America: Business and the Making of American Gun Culture +评分: 4.0 +价格: 16.81 +------------------------------------------ +排名: 15 +书名: The Geography of Bliss: One Grump's Search for the Happiest Places in the World +评分: 2.0 +价格: 28.23 +------------------------------------------ +排名: 16 +书名: The Demonists (Demonist #1) +评分: 2.0 +价格: 52.11 +------------------------------------------ +排名: 17 +书名: The Demon Prince of Momochi House, Vol. 4 (The Demon Prince of Momochi House #4) +评分: 2.0 +价格: 27.88 +------------------------------------------ +排名: 18 +书名: The Bone Hunters (Lexy Vaughan & Steven Macaulay #2) +评分: 3.0 +价格: 59.71 +------------------------------------------ +排名: 19 +书名: The Beast (Black Dagger Brotherhood #14) +评分: 5.0 +价格: 46.08 +------------------------------------------ +排名: 20 +书名: Some Women +评分: 5.0 +价格: 13.73 +------------------------------------------ +排名: 1 +书名: Shopaholic Ties the Knot (Shopaholic #3) +评分: 5.0 +价格: 48.39 +------------------------------------------ +排名: 2 +书名: Paper and Fire (The Great Library #2) +评分: 5.0 +价格: 49.45 +------------------------------------------ +排名: 3 +书名: Outlander (Outlander #1) +评分: 5.0 +价格: 19.67 +------------------------------------------ +排名: 4 +书名: Orchestra of Exiles: The Story of Bronislaw Huberman, the Israel Philharmonic, and the One Thousand Jews He Saved from Nazi Horrors +评分: 3.0 +价格: 12.36 +------------------------------------------ +排名: 5 +书名: No One Here Gets Out Alive +评分: 5.0 +价格: 20.02 +------------------------------------------ +排名: 6 +书名: Night Shift (Night Shift #1-20) +评分: 4.0 +价格: 12.75 +------------------------------------------ +排名: 7 +书名: Needful Things +评分: 4.0 +价格: 47.51 +------------------------------------------ +排名: 8 +书名: Mockingjay (The Hunger Games #3) +评分: 4.0 +价格: 20.44 +------------------------------------------ +排名: 9 +书名: Misery +评分: 2.0 +价格: 34.79 +------------------------------------------ +排名: 10 +书名: Little Women (Little Women #1) +评分: 4.0 +价格: 28.07 +------------------------------------------ +排名: 11 +书名: It +评分: 3.0 +价格: 25.01 +------------------------------------------ +排名: 12 +书名: Harry Potter and the Sorcerer's Stone (Harry Potter #1) +评分: 3.0 +价格: 13.90 +------------------------------------------ +排名: 13 +书名: Harry Potter and the Prisoner of Azkaban (Harry Potter #3) +评分: 4.0 +价格: 24.17 +------------------------------------------ +排名: 14 +书名: Harry Potter and the Order of the Phoenix (Harry Potter #5) +评分: 4.0 +价格: 31.63 +------------------------------------------ +排名: 15 +书名: Harry Potter and the Half-Blood Prince (Harry Potter #6) +评分: 5.0 +价格: 48.75 +------------------------------------------ +排名: 16 +书名: Harry Potter and the Chamber of Secrets (Harry Potter #2) +评分: 1.0 +价格: 14.74 +------------------------------------------ +排名: 17 +书名: Gone with the Wind +评分: 3.0 +价格: 32.49 +------------------------------------------ +排名: 18 +书名: God Is Not Great: How Religion Poisons Everything +评分: 1.0 +价格: 27.80 +------------------------------------------ +排名: 19 +书名: Girl With a Pearl Earring +评分: 1.0 +价格: 26.77 +------------------------------------------ +排名: 20 +书名: Fruits Basket, Vol. 4 (Fruits Basket #4) +评分: 4.0 +价格: 50.44 +------------------------------------------ +排名: 1 +书名: Far From True (Promise Falls Trilogy #2) +评分: 2.0 +价格: 34.93 +------------------------------------------ +排名: 2 +书名: Dark Lover (Black Dagger Brotherhood #1) +评分: 1.0 +价格: 12.87 +------------------------------------------ +排名: 3 +书名: Confessions of a Shopaholic (Shopaholic #1) +评分: 2.0 +价格: 48.94 +------------------------------------------ +排名: 4 +书名: Changing the Game (Play by Play #2) +评分: 3.0 +价格: 13.38 +------------------------------------------ +排名: 5 +书名: Candide +评分: 3.0 +价格: 58.63 +------------------------------------------ +排名: 6 +书名: Can You Keep a Secret? +评分: 1.0 +价格: 21.94 +------------------------------------------ +排名: 7 +书名: Atlas Shrugged +评分: 5.0 +价格: 26.58 +------------------------------------------ +排名: 8 +书名: Animal Farm +评分: 3.0 +价格: 57.22 +------------------------------------------ +排名: 9 +书名: A Walk to Remember +评分: 1.0 +价格: 56.43 +------------------------------------------ +排名: 10 +书名: A New Earth: Awakening to Your Life's Purpose +评分: 5.0 +价格: 55.65 +------------------------------------------ +排名: 11 +书名: A History of God: The 4,000-Year Quest of Judaism, Christianity, and Islam +评分: 1.0 +价格: 27.62 +------------------------------------------ +排名: 12 +书名: 'Salem's Lot +评分: 4.0 +价格: 49.56 +------------------------------------------ +排名: 13 +书名: Zero History (Blue Ant #3) +评分: 1.0 +价格: 34.77 +------------------------------------------ +排名: 14 +书名: Wuthering Heights +评分: 3.0 +价格: 17.73 +------------------------------------------ +排名: 15 +书名: World War Z: An Oral History of the Zombie War +评分: 1.0 +价格: 21.80 +------------------------------------------ +排名: 16 +书名: Wild: From Lost to Found on the Pacific Crest Trail +评分: 3.0 +价格: 46.02 +------------------------------------------ +排名: 17 +书名: Where'd You Go, Bernadette +评分: 1.0 +价格: 18.13 +------------------------------------------ +排名: 18 +书名: When You Are Engulfed in Flames +评分: 5.0 +价格: 30.89 +------------------------------------------ +排名: 19 +书名: We the People: The Modern-Day Figures Who Have Reshaped and Affirmed the Founding Fathers' Vision of America +评分: 3.0 +价格: 31.95 +------------------------------------------ +排名: 20 +书名: We Are All Completely Beside Ourselves +评分: 1.0 +价格: 24.04 +------------------------------------------ +排名: 1 +书名: Walk the Edge (Thunder Road #2) +评分: 3.0 +价格: 32.36 +------------------------------------------ +排名: 2 +书名: Voyager (Outlander #3) +评分: 5.0 +价格: 21.07 +------------------------------------------ +排名: 3 +书名: Very Good Lives: The Fringe Benefits of Failure and the Importance of Imagination +评分: 3.0 +价格: 50.66 +------------------------------------------ +排名: 4 +书名: Vegan Vegetarian Omnivore: Dinner for Everyone at the Table +评分: 2.0 +价格: 13.66 +------------------------------------------ +排名: 5 +书名: Unstuffed: Decluttering Your Home, Mind, and Soul +评分: 1.0 +价格: 58.09 +------------------------------------------ +排名: 6 +书名: Under the Banner of Heaven: A Story of Violent Faith +评分: 1.0 +价格: 30.00 +------------------------------------------ +排名: 7 +书名: Two Boys Kissing +评分: 2.0 +价格: 32.74 +------------------------------------------ +排名: 8 +书名: Twilight (Twilight #1) +评分: 2.0 +价格: 41.93 +------------------------------------------ +排名: 9 +书名: Twenties Girl +评分: 2.0 +价格: 42.80 +------------------------------------------ +排名: 10 +书名: Trespassing Across America: One Man's Epic, Never-Done-Before (and Sort of Illegal) Hike Across the Heartland +评分: 1.0 +价格: 53.51 +------------------------------------------ +排名: 11 +书名: Three-Martini Lunch +评分: 3.0 +价格: 23.21 +------------------------------------------ +排名: 12 +书名: Thinking, Fast and Slow +评分: 1.0 +价格: 21.14 +------------------------------------------ +排名: 13 +书名: The Wild Robot +评分: 3.0 +价格: 56.07 +------------------------------------------ +排名: 14 +书名: The Wicked + The Divine, Vol. 3: Commercial Suicide (The Wicked + The Divine) +评分: 3.0 +价格: 14.41 +------------------------------------------ +排名: 15 +书名: The Undomestic Goddess +评分: 4.0 +价格: 45.75 +------------------------------------------ +排名: 16 +书名: The Travelers +评分: 1.0 +价格: 15.77 +------------------------------------------ +排名: 17 +书名: The Tipping Point: How Little Things Can Make a Big Difference +评分: 2.0 +价格: 10.02 +------------------------------------------ +排名: 18 +书名: The Thing About Jellyfish +评分: 1.0 +价格: 48.77 +------------------------------------------ +排名: 19 +书名: The Stand +评分: 2.0 +价格: 57.86 +------------------------------------------ +排名: 20 +书名: The Smitten Kitchen Cookbook +评分: 1.0 +价格: 23.59 +------------------------------------------ +排名: 1 +书名: The Silkworm (Cormoran Strike #2) +评分: 5.0 +价格: 23.05 +------------------------------------------ +排名: 2 +书名: The Sandman, Vol. 3: Dream Country (The Sandman (volumes) #3) +评分: 5.0 +价格: 55.55 +------------------------------------------ +排名: 3 +书名: The Rose & the Dagger (The Wrath and the Dawn #2) +评分: 4.0 +价格: 58.64 +------------------------------------------ +排名: 4 +书名: The Road to Little Dribbling: Adventures of an American in Britain (Notes From a Small Island #2) +评分: 1.0 +价格: 23.21 +------------------------------------------ +排名: 5 +书名: The Rise of Theodore Roosevelt (Theodore Roosevelt #1) +评分: 3.0 +价格: 42.57 +------------------------------------------ +排名: 6 +书名: The Restaurant at the End of the Universe (Hitchhiker's Guide to the Galaxy #2) +评分: 1.0 +价格: 10.92 +------------------------------------------ +排名: 7 +书名: The Rest Is Noise: Listening to the Twentieth Century +评分: 1.0 +价格: 34.77 +------------------------------------------ +排名: 8 +书名: The Red Tent +评分: 5.0 +价格: 35.66 +------------------------------------------ +排名: 9 +书名: The Purpose Driven Life: What on Earth Am I Here for? +评分: 3.0 +价格: 37.19 +------------------------------------------ +排名: 10 +书名: The Purest Hook (Second Circle Tattoos #3) +评分: 1.0 +价格: 12.25 +------------------------------------------ +排名: 11 +书名: The Picture of Dorian Gray +评分: 2.0 +价格: 29.70 +------------------------------------------ +排名: 12 +书名: The Paris Wife +评分: 3.0 +价格: 36.80 +------------------------------------------ +排名: 13 +书名: The Obsession +评分: 1.0 +价格: 45.43 +------------------------------------------ +排名: 14 +书名: The Nightingale +评分: 4.0 +价格: 26.26 +------------------------------------------ +排名: 15 +书名: The New Guy (and Other Senior Year Distractions) +评分: 3.0 +价格: 44.92 +------------------------------------------ +排名: 16 +书名: The Nanny Diaries (Nanny #1) +评分: 5.0 +价格: 52.53 +------------------------------------------ +排名: 17 +书名: The Name of God is Mercy +评分: 2.0 +价格: 37.25 +------------------------------------------ +排名: 18 +书名: The Maze Runner (The Maze Runner #1) +评分: 1.0 +价格: 20.93 +------------------------------------------ +排名: 19 +书名: The Lover's Dictionary +评分: 2.0 +价格: 58.09 +------------------------------------------ +排名: 20 +书名: The Lonely Ones +评分: 5.0 +价格: 43.59 +------------------------------------------ +排名: 1 +书名: The Lean Startup: How Today's Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses +评分: 3.0 +价格: 33.92 +------------------------------------------ +排名: 2 +书名: The Last Painting of Sara de Vos +评分: 2.0 +价格: 55.55 +------------------------------------------ +排名: 3 +书名: The Land of 10,000 Madonnas +评分: 4.0 +价格: 29.64 +------------------------------------------ +排名: 4 +书名: The Infinities +评分: 1.0 +价格: 27.41 +------------------------------------------ +排名: 5 +书名: The Husband's Secret +评分: 5.0 +价格: 52.51 +------------------------------------------ +排名: 6 +书名: The Hitchhiker's Guide to the Galaxy (Hitchhiker's Guide to the Galaxy #1) +评分: 3.0 +价格: 47.80 +------------------------------------------ +排名: 7 +书名: The Guns of August +评分: 2.0 +价格: 14.54 +------------------------------------------ +排名: 8 +书名: The Guernsey Literary and Potato Peel Pie Society +评分: 1.0 +价格: 49.53 +------------------------------------------ +排名: 9 +书名: The Goldfinch +评分: 3.0 +价格: 43.58 +------------------------------------------ +排名: 10 +书名: The Giver (The Giver Quartet #1) +评分: 1.0 +价格: 12.30 +------------------------------------------ +排名: 11 +书名: The Girl with All the Gifts +评分: 3.0 +价格: 49.47 +------------------------------------------ +排名: 12 +书名: The Girl Who Played with Fire (Millennium Trilogy #2) +评分: 2.0 +价格: 22.14 +------------------------------------------ +排名: 13 +书名: The Girl Who Kicked the Hornet's Nest (Millennium Trilogy #3) +评分: 1.0 +价格: 57.48 +------------------------------------------ +排名: 14 +书名: The Exiled +评分: 3.0 +价格: 43.45 +------------------------------------------ +排名: 15 +书名: The End of Faith: Religion, Terror, and the Future of Reason +评分: 4.0 +价格: 22.13 +------------------------------------------ +排名: 16 +书名: The Elegant Universe: Superstrings, Hidden Dimensions, and the Quest for the Ultimate Theory +评分: 4.0 +价格: 13.03 +------------------------------------------ +排名: 17 +书名: The Disappearing Spoon: And Other True Tales of Madness, Love, and the History of the World from the Periodic Table of the Elements +评分: 5.0 +价格: 57.35 +------------------------------------------ +排名: 18 +书名: The Devil Wears Prada (The Devil Wears Prada #1) +评分: 1.0 +价格: 44.29 +------------------------------------------ +排名: 19 +书名: The Demon-Haunted World: Science as a Candle in the Dark +评分: 4.0 +价格: 52.25 +------------------------------------------ +排名: 20 +书名: The Day the Crayons Came Home (Crayons) +评分: 5.0 +价格: 26.33 +------------------------------------------ +排名: 1 +书名: The Da Vinci Code (Robert Langdon #2) +评分: 2.0 +价格: 22.96 +------------------------------------------ +排名: 2 +书名: The Cuckoo's Calling (Cormoran Strike #1) +评分: 1.0 +价格: 19.21 +------------------------------------------ +排名: 3 +书名: The Complete Stories and Poems (The Works of Edgar Allan Poe [Cameo Edition]) +评分: 4.0 +价格: 26.78 +------------------------------------------ +排名: 4 +书名: The Complete Poems +评分: 5.0 +价格: 41.32 +------------------------------------------ +排名: 5 +书名: The Catcher in the Rye +评分: 1.0 +价格: 24.55 +------------------------------------------ +排名: 6 +书名: The Cat in the Hat (Beginner Books B-1) +评分: 2.0 +价格: 16.26 +------------------------------------------ +排名: 7 +书名: The Case for Christ (Cases for Christianity) +评分: 1.0 +价格: 47.84 +------------------------------------------ +排名: 8 +书名: The Book Thief +评分: 2.0 +价格: 53.49 +------------------------------------------ +排名: 9 +书名: The Book of Basketball: The NBA According to The Sports Guy +评分: 5.0 +价格: 44.84 +------------------------------------------ +排名: 10 +书名: The Blind Side: Evolution of a Game +评分: 5.0 +价格: 53.71 +------------------------------------------ +排名: 11 +书名: The Autobiography of Malcolm X +评分: 2.0 +价格: 23.43 +------------------------------------------ +排名: 12 +书名: The Art of Simple Food: Notes, Lessons, and Recipes from a Delicious Revolution +评分: 3.0 +价格: 34.32 +------------------------------------------ +排名: 13 +书名: The Art of Fielding +评分: 1.0 +价格: 22.10 +------------------------------------------ +排名: 14 +书名: Surely You're Joking, Mr. Feynman!: Adventures of a Curious Character +评分: 2.0 +价格: 25.83 +------------------------------------------ +排名: 15 +书名: Stiff: The Curious Lives of Human Cadavers +评分: 3.0 +价格: 36.74 +------------------------------------------ +排名: 16 +书名: Spilled Milk: Based on a True Story +评分: 1.0 +价格: 49.51 +------------------------------------------ +排名: 17 +书名: Something Borrowed (Darcy & Rachel #1) +评分: 5.0 +价格: 48.96 +------------------------------------------ +排名: 18 +书名: Something Blue (Darcy & Rachel #2) +评分: 1.0 +价格: 54.62 +------------------------------------------ +排名: 19 +书名: Soldier (Talon #3) +评分: 2.0 +价格: 24.72 +------------------------------------------ +排名: 20 +书名: Shopaholic & Baby (Shopaholic #5) +评分: 2.0 +价格: 46.45 +------------------------------------------ +排名: 1 +书名: Seven Days in the Art World +评分: 2.0 +价格: 52.33 +------------------------------------------ +排名: 2 +书名: Seven Brief Lessons on Physics +评分: 4.0 +价格: 30.60 +------------------------------------------ +排名: 3 +书名: Scarlet (The Lunar Chronicles #2) +评分: 4.0 +价格: 14.57 +------------------------------------------ +排名: 4 +书名: Sarah's Key +评分: 1.0 +价格: 46.29 +------------------------------------------ +排名: 5 +书名: Saga, Volume 3 (Saga (Collected Editions) #3) +评分: 5.0 +价格: 21.57 +------------------------------------------ +排名: 6 +书名: Running with Scissors +评分: 4.0 +价格: 12.91 +------------------------------------------ +排名: 7 +书名: Rogue Lawyer (Rogue Lawyer #1) +评分: 3.0 +价格: 50.11 +------------------------------------------ +排名: 8 +书名: Rise of the Rocket Girls: The Women Who Propelled Us, from Missiles to the Moon to Mars +评分: 4.0 +价格: 41.67 +------------------------------------------ +排名: 9 +书名: Rework +评分: 2.0 +价格: 44.88 +------------------------------------------ +排名: 10 +书名: Reservations for Two +评分: 3.0 +价格: 11.10 +------------------------------------------ +排名: 11 +书名: Red: The True Story of Red Riding Hood +评分: 3.0 +价格: 28.54 +------------------------------------------ +排名: 12 +书名: Ready Player One +评分: 4.0 +价格: 19.07 +------------------------------------------ +排名: 13 +书名: Quiet: The Power of Introverts in a World That Can't Stop Talking +评分: 1.0 +价格: 43.55 +------------------------------------------ +排名: 14 +书名: Prodigy: The Graphic Novel (Legend: The Graphic Novel #2) +评分: 3.0 +价格: 43.63 +------------------------------------------ +排名: 15 +书名: Persepolis: The Story of a Childhood (Persepolis #1-2) +评分: 1.0 +价格: 39.13 +------------------------------------------ +排名: 16 +书名: Packing for Mars: The Curious Science of Life in the Void +评分: 2.0 +价格: 56.68 +------------------------------------------ +排名: 17 +书名: Outliers: The Story of Success +评分: 1.0 +价格: 14.16 +------------------------------------------ +排名: 18 +书名: Original Fake +评分: 3.0 +价格: 31.45 +------------------------------------------ +排名: 19 +书名: Orange Is the New Black +评分: 2.0 +价格: 24.61 +------------------------------------------ +排名: 20 +书名: One for the Money (Stephanie Plum #1) +评分: 2.0 +价格: 32.87 +------------------------------------------ +排名: 1 +书名: Notes from a Small Island (Notes From a Small Island #1) +评分: 1.0 +价格: 40.17 +------------------------------------------ +排名: 2 +书名: Night (The Night Trilogy #1) +评分: 1.0 +价格: 13.51 +------------------------------------------ +排名: 3 +书名: Neither Here nor There: Travels in Europe +评分: 3.0 +价格: 38.95 +------------------------------------------ +排名: 4 +书名: Naked +评分: 3.0 +价格: 31.69 +------------------------------------------ +排名: 5 +书名: Morning Star (Red Rising #3) +评分: 1.0 +价格: 29.40 +------------------------------------------ +排名: 6 +书名: Miracles from Heaven: A Little Girl, Her Journey to Heaven, and Her Amazing Story of Healing +评分: 1.0 +价格: 57.83 +------------------------------------------ +排名: 7 +书名: Midnight Riot (Peter Grant/ Rivers of London - books #1) +评分: 2.0 +价格: 55.46 +------------------------------------------ +排名: 8 +书名: Me Talk Pretty One Day +评分: 2.0 +价格: 57.60 +------------------------------------------ +排名: 9 +书名: Manuscript Found in Accra +评分: 2.0 +价格: 34.98 +------------------------------------------ +排名: 10 +书名: Lust & Wonder +评分: 2.0 +价格: 11.87 +------------------------------------------ +排名: 11 +书名: Lila (Gilead #3) +评分: 3.0 +价格: 12.47 +------------------------------------------ +排名: 12 +书名: Life, the Universe and Everything (Hitchhiker's Guide to the Galaxy #3) +评分: 2.0 +价格: 33.26 +------------------------------------------ +排名: 13 +书名: Life Without a Recipe +评分: 5.0 +价格: 59.04 +------------------------------------------ +排名: 14 +书名: Life After Life +评分: 2.0 +价格: 26.13 +------------------------------------------ +排名: 15 +书名: Letter to a Christian Nation +评分: 1.0 +价格: 22.20 +------------------------------------------ +排名: 16 +书名: Let's Pretend This Never Happened: A Mostly True Memoir +评分: 1.0 +价格: 45.11 +------------------------------------------ +排名: 17 +书名: Legend (Legend #1) +评分: 4.0 +价格: 43.69 +------------------------------------------ +排名: 18 +书名: Lean In: Women, Work, and the Will to Lead +评分: 1.0 +价格: 25.02 +------------------------------------------ +排名: 19 +书名: Lamb: The Gospel According to Biff, Christ's Childhood Pal +评分: 5.0 +价格: 55.50 +------------------------------------------ +排名: 20 +书名: Lady Renegades (Rebel Belle #3) +评分: 5.0 +价格: 53.04 +------------------------------------------ +排名: 1 +书名: Jurassic Park (Jurassic Park #1) +评分: 1.0 +价格: 44.97 +------------------------------------------ +排名: 2 +书名: It's Never Too Late to Begin Again: Discovering Creativity and Meaning at Midlife and Beyond +评分: 1.0 +价格: 42.38 +------------------------------------------ +排名: 3 +书名: Is Everyone Hanging Out Without Me? (And Other Concerns) +评分: 3.0 +价格: 20.11 +------------------------------------------ +排名: 4 +书名: Into the Wild +评分: 5.0 +价格: 56.70 +------------------------------------------ +排名: 5 +书名: Inferno (Robert Langdon #4) +评分: 5.0 +价格: 41.00 +------------------------------------------ +排名: 6 +书名: In the Garden of Beasts: Love, Terror, and an American Family in Hitler's Berlin +评分: 3.0 +价格: 28.85 +------------------------------------------ +排名: 7 +书名: If I Run (If I Run #1) +评分: 4.0 +价格: 49.97 +------------------------------------------ +排名: 8 +书名: I've Got Your Number +评分: 1.0 +价格: 19.69 +------------------------------------------ +排名: 9 +书名: I Am Malala: The Girl Who Stood Up for Education and Was Shot by the Taliban +评分: 2.0 +价格: 28.88 +------------------------------------------ +排名: 10 +书名: Hungry Girl Clean & Hungry: Easy All-Natural Recipes for Healthy Eating in the Real World +评分: 3.0 +价格: 33.14 +------------------------------------------ +排名: 11 +书名: House of Lost Worlds: Dinosaurs, Dynasties, and the Story of Life on Earth +评分: 2.0 +价格: 43.70 +------------------------------------------ +排名: 12 +书名: House of Leaves +评分: 1.0 +价格: 54.89 +------------------------------------------ +排名: 13 +书名: Horrible Bear! +评分: 2.0 +价格: 37.52 +------------------------------------------ +排名: 14 +书名: Holidays on Ice +评分: 2.0 +价格: 51.07 +------------------------------------------ +排名: 15 +书名: Heir to the Sky +评分: 4.0 +价格: 44.07 +------------------------------------------ +排名: 16 +书名: Green Eggs and Ham (Beginner Books B-16) +评分: 4.0 +价格: 10.79 +------------------------------------------ +排名: 17 +书名: Grayson, Vol 3: Nemesis (Grayson #3) +评分: 1.0 +价格: 42.72 +------------------------------------------ +排名: 18 +书名: Gratitude +评分: 5.0 +价格: 26.66 +------------------------------------------ +排名: 19 +书名: Gone Girl +评分: 5.0 +价格: 37.60 +------------------------------------------ +排名: 20 +书名: Golden (Heart of Dread #3) +评分: 4.0 +价格: 42.21 +------------------------------------------ +排名: 1 +书名: Girl in the Blue Coat +评分: 2.0 +价格: 46.83 +------------------------------------------ +排名: 2 +书名: Fruits Basket, Vol. 3 (Fruits Basket #3) +评分: 2.0 +价格: 45.17 +------------------------------------------ +排名: 3 +书名: Friday Night Lights: A Town, a Team, and a Dream +评分: 3.0 +价格: 51.22 +------------------------------------------ +排名: 4 +书名: Fire Bound (Sea Haven/Sisters of the Heart #5) +评分: 4.0 +价格: 21.28 +------------------------------------------ +排名: 5 +书名: Fifty Shades Freed (Fifty Shades #3) +评分: 5.0 +价格: 15.36 +------------------------------------------ +排名: 6 +书名: Fellside +评分: 1.0 +价格: 38.62 +------------------------------------------ +排名: 7 +书名: Extreme Prey (Lucas Davenport #26) +评分: 3.0 +价格: 25.40 +------------------------------------------ +排名: 8 +书名: Eragon (The Inheritance Cycle #1) +评分: 3.0 +价格: 43.87 +------------------------------------------ +排名: 9 +书名: Eclipse (Twilight #3) +评分: 1.0 +价格: 18.74 +------------------------------------------ +排名: 10 +书名: Dune (Dune #1) +评分: 1.0 +价格: 54.86 +------------------------------------------ +排名: 11 +书名: Dracula +评分: 3.0 +价格: 52.62 +------------------------------------------ +排名: 12 +书名: Do Androids Dream of Electric Sheep? (Blade Runner #1) +评分: 1.0 +价格: 51.48 +------------------------------------------ +排名: 13 +书名: Disrupted: My Misadventure in the Start-Up Bubble +评分: 5.0 +价格: 15.28 +------------------------------------------ +排名: 14 +书名: Dead Wake: The Last Crossing of the Lusitania +评分: 5.0 +价格: 39.24 +------------------------------------------ +排名: 15 +书名: David and Goliath: Underdogs, Misfits, and the Art of Battling Giants +评分: 1.0 +价格: 17.81 +------------------------------------------ +排名: 16 +书名: Darkfever (Fever #1) +评分: 1.0 +价格: 56.02 +------------------------------------------ +排名: 17 +书名: Dark Places +评分: 5.0 +价格: 23.90 +------------------------------------------ +排名: 18 +书名: Crazy Rich Asians (Crazy Rich Asians #1) +评分: 5.0 +价格: 49.13 +------------------------------------------ +排名: 19 +书名: Counting Thyme +评分: 1.0 +价格: 10.62 +------------------------------------------ +排名: 20 +书名: Cosmos +评分: 2.0 +价格: 36.17 +------------------------------------------ +排名: 1 +书名: Civilization and Its Discontents +评分: 2.0 +价格: 59.95 +------------------------------------------ +排名: 2 +书名: Cinder (The Lunar Chronicles #1) +评分: 1.0 +价格: 26.09 +------------------------------------------ +排名: 3 +书名: Catastrophic Happiness: Finding Joy in Childhood's Messy Years +评分: 2.0 +价格: 37.35 +------------------------------------------ +排名: 4 +书名: Career of Evil (Cormoran Strike #3) +评分: 2.0 +价格: 24.72 +------------------------------------------ +排名: 5 +书名: Breaking Dawn (Twilight #4) +评分: 5.0 +价格: 35.28 +------------------------------------------ +排名: 6 +书名: Brave Enough +评分: 5.0 +价格: 51.32 +------------------------------------------ +排名: 7 +书名: Boy Meets Boy +评分: 3.0 +价格: 21.12 +------------------------------------------ +排名: 8 +书名: Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the World Has Never Seen +评分: 2.0 +价格: 27.35 +------------------------------------------ +排名: 9 +书名: Blink: The Power of Thinking Without Thinking +评分: 5.0 +价格: 21.74 +------------------------------------------ +排名: 10 +书名: Black Flags: The Rise of ISIS +评分: 1.0 +价格: 40.87 +------------------------------------------ +排名: 11 +书名: Black Butler, Vol. 1 (Black Butler #1) +评分: 1.0 +价格: 49.31 +------------------------------------------ +排名: 12 +书名: Big Little Lies +评分: 1.0 +价格: 22.11 +------------------------------------------ +排名: 13 +书名: Between Shades of Gray +评分: 5.0 +价格: 20.79 +------------------------------------------ +排名: 14 +书名: Best of My Love (Fool's Gold #20) +评分: 2.0 +价格: 27.41 +------------------------------------------ +排名: 15 +书名: Beowulf +评分: 2.0 +价格: 38.35 +------------------------------------------ +排名: 16 +书名: Beautiful Creatures (Caster Chronicles #1) +评分: 5.0 +价格: 21.55 +------------------------------------------ +排名: 17 +书名: Awkward +评分: 2.0 +价格: 38.02 +------------------------------------------ +排名: 18 +书名: Ash +评分: 4.0 +价格: 22.06 +------------------------------------------ +排名: 19 +书名: Are We There Yet? +评分: 3.0 +价格: 10.66 +------------------------------------------ +排名: 20 +书名: Are We Smart Enough to Know How Smart Animals Are? +评分: 1.0 +价格: 56.58 +------------------------------------------ +排名: 1 +书名: Annie on My Mind +评分: 5.0 +价格: 36.83 +------------------------------------------ +排名: 2 +书名: And Then There Were None +评分: 2.0 +价格: 35.01 +------------------------------------------ +排名: 3 +书名: A Walk in the Woods: Rediscovering America on the Appalachian Trail +评分: 4.0 +价格: 30.48 +------------------------------------------ +排名: 4 +书名: A Visit from the Goon Squad +评分: 5.0 +价格: 14.08 +------------------------------------------ +排名: 5 +书名: A Storm of Swords (A Song of Ice and Fire #3) +评分: 2.0 +价格: 31.22 +------------------------------------------ +排名: 6 +书名: A Heartbreaking Work of Staggering Genius +评分: 5.0 +价格: 54.29 +------------------------------------------ +排名: 7 +书名: 8 Keys to Mental Health Through Exercise +评分: 1.0 +价格: 31.04 +------------------------------------------ +排名: 8 +书名: #GIRLBOSS +评分: 1.0 +价格: 50.96 +------------------------------------------ +排名: 9 +书名: The Suffragettes (Little Black Classics, #96) +评分: 2.0 +价格: 11.89 +------------------------------------------ +排名: 10 +书名: The Sense of an Ending +评分: 3.0 +价格: 31.38 +------------------------------------------ +排名: 11 +书名: The Sandman, Vol. 2: The Doll's House (The Sandman (volumes) #2) +评分: 1.0 +价格: 54.81 +------------------------------------------ +排名: 12 +书名: The Course of Love +评分: 3.0 +价格: 16.78 +------------------------------------------ +排名: 13 +书名: Sugar Rush (Offensive Line #2) +评分: 1.0 +价格: 24.42 +------------------------------------------ +排名: 14 +书名: Saga, Volume 2 (Saga (Collected Editions) #2) +评分: 3.0 +价格: 11.75 +------------------------------------------ +排名: 15 +书名: Run, Spot, Run: The Ethics of Keeping Pets +评分: 1.0 +价格: 20.02 +------------------------------------------ +排名: 16 +书名: New Moon (Twilight #2) +评分: 4.0 +价格: 12.86 +------------------------------------------ +排名: 17 +书名: Life +评分: 5.0 +价格: 31.58 +------------------------------------------ +排名: 18 +书名: Kindle Paperwhite User's Guide +评分: 3.0 +价格: 34.00 +------------------------------------------ +排名: 19 +书名: H is for Hawk +评分: 5.0 +价格: 57.42 +------------------------------------------ +排名: 20 +书名: Girl Online On Tour (Girl Online #2) +评分: 1.0 +价格: 53.47 +------------------------------------------ +排名: 1 +书名: Fruits Basket, Vol. 2 (Fruits Basket #2) +评分: 5.0 +价格: 11.64 +------------------------------------------ +排名: 2 +书名: Diary of a Minecraft Zombie Book 1: A Scare of a Dare (An Unofficial Minecraft Book) +评分: 4.0 +价格: 52.88 +------------------------------------------ +排名: 3 +书名: Y: The Last Man, Vol. 1: Unmanned (Y: The Last Man #1) +评分: 4.0 +价格: 18.51 +------------------------------------------ +排名: 4 +书名: While You Were Mine +评分: 5.0 +价格: 41.32 +------------------------------------------ +排名: 5 +书名: Where Lightning Strikes (Bleeding Stars #3) +评分: 3.0 +价格: 39.77 +------------------------------------------ +排名: 6 +书名: When I'm Gone +评分: 3.0 +价格: 51.96 +------------------------------------------ +排名: 7 +书名: Ways of Seeing +评分: 5.0 +价格: 39.51 +------------------------------------------ +排名: 8 +书名: Vampire Knight, Vol. 1 (Vampire Knight #1) +评分: 1.0 +价格: 15.40 +------------------------------------------ +排名: 9 +书名: Vampire Girl (Vampire Girl #1) +评分: 2.0 +价格: 53.82 +------------------------------------------ +排名: 10 +书名: Twenty Love Poems and a Song of Despair +评分: 4.0 +价格: 30.95 +------------------------------------------ +排名: 11 +书名: Travels with Charley: In Search of America +评分: 5.0 +价格: 57.82 +------------------------------------------ +排名: 12 +书名: Three Wishes (River of Time: California #1) +评分: 2.0 +价格: 44.18 +------------------------------------------ +排名: 13 +书名: This One Moment (Pushing Limits #1) +评分: 1.0 +价格: 48.71 +------------------------------------------ +排名: 14 +书名: The Zombie Room +评分: 5.0 +价格: 19.69 +------------------------------------------ +排名: 15 +书名: The Wicked + The Divine, Vol. 1: The Faust Act (The Wicked + The Divine) +评分: 2.0 +价格: 36.52 +------------------------------------------ +排名: 16 +书名: The Tumor +评分: 5.0 +价格: 41.56 +------------------------------------------ +排名: 17 +书名: The Story of Hong Gildong +评分: 4.0 +价格: 43.19 +------------------------------------------ +排名: 18 +书名: The Silent Wife +评分: 5.0 +价格: 12.34 +------------------------------------------ +排名: 19 +书名: The Silent Twin (Detective Jennifer Knight #3) +评分: 3.0 +价格: 36.25 +------------------------------------------ +排名: 20 +书名: The Selfish Gene +评分: 1.0 +价格: 29.45 +------------------------------------------ +排名: 1 +书名: The Secret Healer +评分: 3.0 +价格: 34.56 +------------------------------------------ +排名: 2 +书名: The Sandman, Vol. 1: Preludes and Nocturnes (The Sandman (volumes) #1) +评分: 3.0 +价格: 54.12 +------------------------------------------ +排名: 3 +书名: The Republic +评分: 3.0 +价格: 33.78 +------------------------------------------ +排名: 4 +书名: The Odyssey +评分: 3.0 +价格: 29.64 +------------------------------------------ +排名: 5 +书名: The No. 1 Ladies' Detective Agency (No. 1 Ladies' Detective Agency #1) +评分: 4.0 +价格: 57.70 +------------------------------------------ +排名: 6 +书名: The Nicomachean Ethics +评分: 1.0 +价格: 36.34 +------------------------------------------ +排名: 7 +书名: The Name of the Wind (The Kingkiller Chronicle #1) +评分: 3.0 +价格: 50.59 +------------------------------------------ +排名: 8 +书名: The Mirror & the Maze (The Wrath and the Dawn #1.5) +评分: 1.0 +价格: 29.38 +------------------------------------------ +排名: 9 +书名: The Little Prince +评分: 2.0 +价格: 45.42 +------------------------------------------ +排名: 10 +书名: The Light of the Fireflies +评分: 1.0 +价格: 54.43 +------------------------------------------ +排名: 11 +书名: The Last Girl (The Dominion Trilogy #1) +评分: 2.0 +价格: 36.26 +------------------------------------------ +排名: 12 +书名: The Iliad +评分: 1.0 +价格: 16.16 +------------------------------------------ +排名: 13 +书名: The Hook Up (Game On #1) +评分: 5.0 +价格: 36.29 +------------------------------------------ +排名: 14 +书名: The Haters +评分: 5.0 +价格: 27.89 +------------------------------------------ +排名: 15 +书名: The Girl You Lost +评分: 5.0 +价格: 12.29 +------------------------------------------ +排名: 16 +书名: The Girl In The Ice (DCI Erika Foster #1) +评分: 3.0 +价格: 15.85 +------------------------------------------ +排名: 17 +书名: The End of the Jesus Era (An Investigation #1) +评分: 1.0 +价格: 14.40 +------------------------------------------ +排名: 18 +书名: The Edge of Reason (Bridget Jones #2) +评分: 4.0 +价格: 19.18 +------------------------------------------ +排名: 19 +书名: The Complete Maus (Maus #1-2) +评分: 3.0 +价格: 10.64 +------------------------------------------ +排名: 20 +书名: The Communist Manifesto +评分: 3.0 +价格: 14.76 +------------------------------------------ +排名: 1 +书名: The Bhagavad Gita +评分: 3.0 +价格: 57.49 +------------------------------------------ +排名: 2 +书名: The Bette Davis Club +评分: 3.0 +价格: 30.66 +------------------------------------------ +排名: 3 +书名: The Art of Not Breathing +评分: 4.0 +价格: 40.83 +------------------------------------------ +排名: 4 +书名: Taking Shots (Assassins #1) +评分: 2.0 +价格: 18.88 +------------------------------------------ +排名: 5 +书名: Starlark +评分: 3.0 +价格: 25.83 +------------------------------------------ +排名: 6 +书名: Skip Beat!, Vol. 01 (Skip Beat! #1) +评分: 3.0 +价格: 42.12 +------------------------------------------ +排名: 7 +书名: Sister Sable (The Mad Queen #1) +评分: 3.0 +价格: 13.33 +------------------------------------------ +排名: 8 +书名: Shatter Me (Shatter Me #1) +评分: 1.0 +价格: 42.40 +------------------------------------------ +排名: 9 +书名: Shameless +评分: 3.0 +价格: 58.35 +------------------------------------------ +排名: 10 +书名: Shadow Rites (Jane Yellowrock #10) +评分: 4.0 +价格: 21.72 +------------------------------------------ +排名: 11 +书名: Settling the Score (The Summer Games #1) +评分: 2.0 +价格: 44.91 +------------------------------------------ +排名: 12 +书名: Sense and Sensibility +评分: 1.0 +价格: 37.46 +------------------------------------------ +排名: 13 +书名: Saga, Volume 1 (Saga (Collected Editions) #1) +评分: 1.0 +价格: 28.48 +------------------------------------------ +排名: 14 +书名: Rhythm, Chord & Malykhin +评分: 2.0 +价格: 28.34 +------------------------------------------ +排名: 15 +书名: Rat Queens, Vol. 1: Sass & Sorcery (Rat Queens (Collected Editions) #1-5) +评分: 5.0 +价格: 46.96 +------------------------------------------ +排名: 16 +书名: Paradise Lost (Paradise #1) +评分: 1.0 +价格: 24.96 +------------------------------------------ +排名: 17 +书名: Paper Girls, Vol. 1 (Paper Girls #1-5) +评分: 4.0 +价格: 21.71 +------------------------------------------ +排名: 18 +书名: Ouran High School Host Club, Vol. 1 (Ouran High School Host Club #1) +评分: 3.0 +价格: 29.87 +------------------------------------------ +排名: 19 +书名: Origins (Alphas 0.5) +评分: 1.0 +价格: 28.99 +------------------------------------------ +排名: 20 +书名: One Second (Seven #7) +评分: 2.0 +价格: 52.94 +------------------------------------------ +排名: 1 +书名: On the Road (Duluoz Legend) +评分: 3.0 +价格: 32.36 +------------------------------------------ +排名: 2 +书名: Old Records Never Die: One Man's Quest for His Vinyl and His Past +评分: 2.0 +价格: 55.66 +------------------------------------------ +排名: 3 +书名: Off Sides (Off #1) +评分: 5.0 +价格: 39.45 +------------------------------------------ +排名: 4 +书名: Of Mice and Men +评分: 2.0 +价格: 47.11 +------------------------------------------ +排名: 5 +书名: Myriad (Prentor #1) +评分: 4.0 +价格: 58.75 +------------------------------------------ +排名: 6 +书名: My Perfect Mistake (Over the Top #1) +评分: 2.0 +价格: 38.92 +------------------------------------------ +排名: 7 +书名: Ms. Marvel, Vol. 1: No Normal (Ms. Marvel (2014-2015) #1) +评分: 4.0 +价格: 39.39 +------------------------------------------ +排名: 8 +书名: Meditations +评分: 2.0 +价格: 25.89 +------------------------------------------ +排名: 9 +书名: Matilda +评分: 1.0 +价格: 28.34 +------------------------------------------ +排名: 10 +书名: Lost Among the Living +评分: 4.0 +价格: 27.70 +------------------------------------------ +排名: 11 +书名: Lord of the Flies +评分: 3.0 +价格: 24.89 +------------------------------------------ +排名: 12 +书名: Listen to Me (Fusion #1) +评分: 3.0 +价格: 58.99 +------------------------------------------ +排名: 13 +书名: Kitchens of the Great Midwest +评分: 5.0 +价格: 57.20 +------------------------------------------ +排名: 14 +书名: Jane Eyre +评分: 5.0 +价格: 38.43 +------------------------------------------ +排名: 15 +书名: Imperfect Harmony +评分: 4.0 +价格: 34.74 +------------------------------------------ +排名: 16 +书名: Icing (Aces Hockey #2) +评分: 4.0 +价格: 40.44 +------------------------------------------ +排名: 17 +书名: Hawkeye, Vol. 1: My Life as a Weapon (Hawkeye #1) +评分: 3.0 +价格: 45.24 +------------------------------------------ +排名: 18 +书名: Having the Barbarian's Baby (Ice Planet Barbarians #7.5) +评分: 4.0 +价格: 34.96 +------------------------------------------ +排名: 19 +书名: Giant Days, Vol. 1 (Giant Days #1-4) +评分: 4.0 +价格: 56.76 +------------------------------------------ +排名: 20 +书名: Fruits Basket, Vol. 1 (Fruits Basket #1) +评分: 5.0 +价格: 40.28 +------------------------------------------ +排名: 1 +书名: Frankenstein +评分: 2.0 +价格: 38.00 +------------------------------------------ +排名: 2 +书名: Forever Rockers (The Rocker #12) +评分: 3.0 +价格: 28.80 +------------------------------------------ +排名: 3 +书名: Fighting Fate (Fighting #6) +评分: 3.0 +价格: 39.24 +------------------------------------------ +排名: 4 +书名: Emma +评分: 2.0 +价格: 32.93 +------------------------------------------ +排名: 5 +书名: Eat, Pray, Love +评分: 3.0 +价格: 51.32 +------------------------------------------ +排名: 6 +书名: Deep Under (Walker Security #1) +评分: 5.0 +价格: 47.09 +------------------------------------------ +排名: 7 +书名: Choosing Our Religion: The Spiritual Lives of America's Nones +评分: 4.0 +价格: 28.42 +------------------------------------------ +排名: 8 +书名: Charlie and the Chocolate Factory (Charlie Bucket #1) +评分: 3.0 +价格: 22.85 +------------------------------------------ +排名: 9 +书名: Charity's Cross (Charles Towne Belles #4) +评分: 1.0 +价格: 41.24 +------------------------------------------ +排名: 10 +书名: Bright Lines +评分: 5.0 +价格: 39.07 +------------------------------------------ +排名: 11 +书名: Bridget Jones's Diary (Bridget Jones #1) +评分: 1.0 +价格: 29.82 +------------------------------------------ +排名: 12 +书名: Bounty (Colorado Mountain #7) +评分: 4.0 +价格: 37.26 +------------------------------------------ +排名: 13 +书名: Blood Defense (Samantha Brinkman #1) +评分: 3.0 +价格: 20.30 +------------------------------------------ +排名: 14 +书名: Bleach, Vol. 1: Strawberry and the Soul Reapers (Bleach #1) +评分: 5.0 +价格: 34.65 +------------------------------------------ +排名: 15 +书名: Beyond Good and Evil +评分: 1.0 +价格: 43.38 +------------------------------------------ +排名: 16 +书名: Alice in Wonderland (Alice's Adventures in Wonderland #1) +评分: 1.0 +价格: 55.53 +------------------------------------------ +排名: 17 +书名: Ajin: Demi-Human, Volume 1 (Ajin: Demi-Human #1) +评分: 4.0 +价格: 57.06 +------------------------------------------ +排名: 18 +书名: A Spy's Devotion (The Regency Spies of London #1) +评分: 5.0 +价格: 16.97 +------------------------------------------ +排名: 19 +书名: 1st to Die (Women's Murder Club #1) +评分: 1.0 +价格: 53.98 +------------------------------------------ +排名: 20 +书名: 1,000 Places to See Before You Die +评分: 5.0 +价格: 26.08 +------------------------------------------ diff --git a/project/pom.xml b/project/pom.xml new file mode 100644 index 0000000..cafbee2 --- /dev/null +++ b/project/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + com.crawler + web-crawler + 1.0-SNAPSHOT + jar + + Web Crawler + Multi-site web crawler with CLI, MVC, Command pattern and Strategy pattern + + + 11 + 11 + UTF-8 + + + + + org.jsoup + jsoup + 1.16.1 + + + com.google.code.gson + gson + 2.10.1 + + + org.slf4j + slf4j-api + 2.0.9 + + + org.slf4j + slf4j-simple + 2.0.9 + + + info.picocli + picocli + 4.7.5 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + com.crawler.Main + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 11 + 11 + + + + + diff --git a/project/run.bat b/project/run.bat new file mode 100644 index 0000000..ffa773c --- /dev/null +++ b/project/run.bat @@ -0,0 +1,24 @@ +@echo off +echo ======================================== +echo Web Crawler Application +echo ======================================== +echo. + +if not exist "target\web-crawler-1.0-SNAPSHOT.jar" ( + echo Compiling project... + mvn clean package + if errorlevel 1 ( + echo Compilation failed! + pause + exit /b 1 + ) + echo. +) + +echo Running crawler... +echo. + +java -jar target\web-crawler-1.0-SNAPSHOT.jar %* + +echo. +pause diff --git a/project/src/main/java/CrawlerManager.java b/project/src/main/java/CrawlerManager.java new file mode 100644 index 0000000..d40a482 --- /dev/null +++ b/project/src/main/java/CrawlerManager.java @@ -0,0 +1 @@ +// 此文件已废弃,请使用 main.CrawlerManager diff --git a/project/src/main/java/cli/CrawlerCLI.java b/project/src/main/java/cli/CrawlerCLI.java new file mode 100644 index 0000000..651828f --- /dev/null +++ b/project/src/main/java/cli/CrawlerCLI.java @@ -0,0 +1,133 @@ +package cli; + +import command.*; +import controller.CrawlerController; +import exception.CrawlerException; +import exception.CrawlerResult; +import exception.ValidationException; +import view.CrawlerView; + +import java.util.Arrays; + +public class CrawlerCLI { + private final CrawlerController controller; + private final CrawlerView view; + private final CommandRegistry commandRegistry; + + public CrawlerCLI() { + this.controller = new CrawlerController(); + this.view = new CrawlerView(); + this.commandRegistry = new CommandRegistry(); + initCommands(); + } + + public CrawlerCLI(String outputDir) { + this.controller = new CrawlerController(outputDir); + this.view = new CrawlerView(); + this.commandRegistry = new CommandRegistry(); + initCommands(); + } + + private void initCommands() { + commandRegistry.register(new RunAllCommand(controller)); + commandRegistry.register(new ListCrawlersCommand(controller)); + commandRegistry.register(new StatsCommand(controller)); + commandRegistry.register(new ClearCommand(controller)); + } + + public void run(String[] args) { + view.showWelcome(); + + if (args == null || args.length == 0) { + view.showHelp(); + return; + } + + String commandName = args[0].toLowerCase().trim(); + + try { + switch (commandName) { + case "help": + case "-h": + case "--help": + view.showHelp(); + break; + + case "list": + case "ls": + handleList(); + break; + + case "run": + handleRun(args); + break; + + case "run-all": + case "all": + handleRunAll(); + break; + + case "stats": + handleStats(); + break; + + case "clear": + handleClear(); + break; + + default: + view.showError("未知命令: " + commandName + "\n使用 'help' 查看可用命令"); + } + } catch (ValidationException e) { + view.showError(e.getMessage()); + view.showHelp(); + } catch (CrawlerException e) { + view.showError("爬虫错误 [" + e.getErrorCode() + "]: " + e.getMessage()); + } catch (Exception e) { + view.showError("系统错误: " + e.getMessage()); + e.printStackTrace(); + } + } + + private void handleList() { + Command cmd = commandRegistry.getCommand("list"); + cmd.execute(); + view.showCrawlerList(controller.getAllCrawlerNames()); + } + + private void handleRun(String[] args) { + if (args.length < 2) { + view.showError("请指定爬虫名称\n示例: run 豆瓣电影Top250"); + view.showCrawlerList(controller.getAllCrawlerNames()); + return; + } + + String crawlerName = args[1]; + Command cmd = new RunSingleCommand(controller, crawlerName); + CrawlerResult result = cmd.execute(); + view.showResult(result); + } + + private void handleRunAll() { + Command cmd = commandRegistry.getCommand("run-all"); + CrawlerResult result = cmd.execute(); + view.showResult(result); + } + + private void handleStats() { + Command cmd = commandRegistry.getCommand("stats"); + CrawlerResult result = cmd.execute(); + view.showMessage(result.getMessage()); + } + + private void handleClear() { + Command cmd = commandRegistry.getCommand("clear"); + CrawlerResult result = cmd.execute(); + view.showResult(result); + } + + public static void main(String[] args) { + CrawlerCLI cli = new CrawlerCLI(); + cli.run(args); + } +} diff --git a/project/src/main/java/com/crawler/Main.java b/project/src/main/java/com/crawler/Main.java new file mode 100644 index 0000000..7450e33 --- /dev/null +++ b/project/src/main/java/com/crawler/Main.java @@ -0,0 +1,34 @@ +package com.crawler; + +import com.crawler.controller.CrawlerController; +import picocli.CommandLine; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; + +@Command(name = "crawler", mixinStandardHelpOptions = true, version = "1.0", + description = "Web Crawler - Crawl Douban Movies, Douban Books, and Books to Scrape") +public class Main implements Runnable { + + @Option(names = {"-s", "--site"}, description = "Site to crawl: douban-movie, douban-book, books-to-scrape, all", + defaultValue = "all") + private String site; + + @Option(names = {"-i", "--interactive"}, description = "Run in interactive mode") + private boolean interactive; + + public static void main(String[] args) { + int exitCode = new CommandLine(new Main()).execute(args); + System.exit(exitCode); + } + + @Override + public void run() { + CrawlerController controller = new CrawlerController(); + + if (interactive) { + controller.runInteractive(); + } else { + controller.crawlBySite(site); + } + } +} diff --git a/project/src/main/java/com/crawler/command/Command.java b/project/src/main/java/com/crawler/command/Command.java new file mode 100644 index 0000000..4a9ea49 --- /dev/null +++ b/project/src/main/java/com/crawler/command/Command.java @@ -0,0 +1,8 @@ +package com.crawler.command; + +import com.crawler.exception.CrawlerException; + +public interface Command { + void execute() throws CrawlerException; + String getDescription(); +} diff --git a/project/src/main/java/com/crawler/command/CrawlAllCommand.java b/project/src/main/java/com/crawler/command/CrawlAllCommand.java new file mode 100644 index 0000000..92e5842 --- /dev/null +++ b/project/src/main/java/com/crawler/command/CrawlAllCommand.java @@ -0,0 +1,37 @@ +package com.crawler.command; + +import com.crawler.exception.CrawlerException; + +import java.util.ArrayList; +import java.util.List; + +public class CrawlAllCommand implements Command { + private final List commands; + private final String description; + + public CrawlAllCommand(String description) { + this.commands = new ArrayList<>(); + this.description = description; + } + + public void addCommand(Command command) { + commands.add(command); + } + + @Override + public void execute() throws CrawlerException { + for (Command command : commands) { + try { + command.execute(); + } catch (CrawlerException e) { + System.err.println("Error executing command: " + command.getDescription()); + System.err.println("Error: " + e.getMessage()); + } + } + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/project/src/main/java/com/crawler/command/CrawlCommand.java b/project/src/main/java/com/crawler/command/CrawlCommand.java new file mode 100644 index 0000000..6534153 --- /dev/null +++ b/project/src/main/java/com/crawler/command/CrawlCommand.java @@ -0,0 +1,28 @@ +package com.crawler.command; + +import com.crawler.exception.CrawlerException; +import com.crawler.strategy.CrawlerStrategy; +import com.crawler.util.FileUtil; + +import java.util.List; + +public class CrawlCommand implements Command { + private final CrawlerStrategy strategy; + private final String description; + + public CrawlCommand(CrawlerStrategy strategy, String description) { + this.strategy = strategy; + this.description = description; + } + + @Override + public void execute() throws CrawlerException { + List data = strategy.crawl(); + FileUtil.saveToJsonFile(data, strategy.getOutputFileName()); + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/project/src/main/java/com/crawler/controller/CrawlerController.java b/project/src/main/java/com/crawler/controller/CrawlerController.java new file mode 100644 index 0000000..5caa438 --- /dev/null +++ b/project/src/main/java/com/crawler/controller/CrawlerController.java @@ -0,0 +1,119 @@ +package com.crawler.controller; + +import com.crawler.command.Command; +import com.crawler.command.CrawlAllCommand; +import com.crawler.command.CrawlCommand; +import com.crawler.exception.CrawlerException; +import com.crawler.strategy.BooksToScrapeStrategy; +import com.crawler.strategy.CrawlerStrategy; +import com.crawler.strategy.DoubanBookStrategy; +import com.crawler.strategy.DoubanMovieStrategy; +import com.crawler.view.ConsoleView; + +import java.util.Scanner; + +public class CrawlerController { + private final ConsoleView view; + private final Scanner scanner; + + public CrawlerController() { + this.view = new ConsoleView(); + this.scanner = new Scanner(System.in); + } + + public void runInteractive() { + view.displayWelcome(); + + while (true) { + view.displayMenu(); + String input = scanner.nextLine().trim(); + + try { + int choice = Integer.parseInt(input); + switch (choice) { + case 1: + crawlDoubanMovies(); + break; + case 2: + crawlDoubanBooks(); + break; + case 3: + crawlBooksToScrape(); + break; + case 4: + crawlAll(); + break; + case 0: + view.displayGoodbye(); + return; + default: + view.displayInvalidChoice(); + } + } catch (NumberFormatException e) { + view.displayInvalidChoice(); + } + } + } + + public void crawlDoubanMovies() { + CrawlerStrategy strategy = new DoubanMovieStrategy(); + Command command = new CrawlCommand<>(strategy, "Douban Movies"); + executeCommand(command, strategy.getOutputFileName()); + } + + public void crawlDoubanBooks() { + CrawlerStrategy strategy = new DoubanBookStrategy(); + Command command = new CrawlCommand<>(strategy, "Douban Books"); + executeCommand(command, strategy.getOutputFileName()); + } + + public void crawlBooksToScrape() { + CrawlerStrategy strategy = new BooksToScrapeStrategy(); + Command command = new CrawlCommand<>(strategy, "Books to Scrape"); + executeCommand(command, strategy.getOutputFileName()); + } + + public void crawlAll() { + CrawlAllCommand allCommand = new CrawlAllCommand("Crawl All"); + allCommand.addCommand(new CrawlCommand<>(new DoubanMovieStrategy(), "Douban Movies")); + allCommand.addCommand(new CrawlCommand<>(new DoubanBookStrategy(), "Douban Books")); + allCommand.addCommand(new CrawlCommand<>(new BooksToScrapeStrategy(), "Books to Scrape")); + + try { + view.displayCrawling("All Websites"); + allCommand.execute(); + view.displaySuccess("data/ (all files)"); + } catch (CrawlerException e) { + view.displayError(e.getMessage()); + } + } + + public void crawlBySite(String site) { + switch (site.toLowerCase()) { + case "douban-movie": + crawlDoubanMovies(); + break; + case "douban-book": + crawlDoubanBooks(); + break; + case "books-to-scrape": + crawlBooksToScrape(); + break; + case "all": + crawlAll(); + break; + default: + view.displayError("Unknown site: " + site); + } + } + + private void executeCommand(Command command, String fileName) { + try { + view.displayCrawling(command.getDescription()); + command.execute(); + view.displaySuccess(fileName); + } catch (CrawlerException e) { + view.displayError(e.getMessage()); + } + } +} diff --git a/project/src/main/java/com/crawler/exception/CrawlerException.java b/project/src/main/java/com/crawler/exception/CrawlerException.java new file mode 100644 index 0000000..5ac3e7a --- /dev/null +++ b/project/src/main/java/com/crawler/exception/CrawlerException.java @@ -0,0 +1,11 @@ +package com.crawler.exception; + +public class CrawlerException extends Exception { + public CrawlerException(String message) { + super(message); + } + + public CrawlerException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/project/src/main/java/com/crawler/exception/FileException.java b/project/src/main/java/com/crawler/exception/FileException.java new file mode 100644 index 0000000..86d924a --- /dev/null +++ b/project/src/main/java/com/crawler/exception/FileException.java @@ -0,0 +1,11 @@ +package com.crawler.exception; + +public class FileException extends CrawlerException { + public FileException(String message) { + super(message); + } + + public FileException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/project/src/main/java/com/crawler/exception/NetworkException.java b/project/src/main/java/com/crawler/exception/NetworkException.java new file mode 100644 index 0000000..8d8b9e7 --- /dev/null +++ b/project/src/main/java/com/crawler/exception/NetworkException.java @@ -0,0 +1,11 @@ +package com.crawler.exception; + +public class NetworkException extends CrawlerException { + public NetworkException(String message) { + super(message); + } + + public NetworkException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/project/src/main/java/com/crawler/exception/ParseException.java b/project/src/main/java/com/crawler/exception/ParseException.java new file mode 100644 index 0000000..9248f23 --- /dev/null +++ b/project/src/main/java/com/crawler/exception/ParseException.java @@ -0,0 +1,11 @@ +package com.crawler.exception; + +public class ParseException extends CrawlerException { + public ParseException(String message) { + super(message); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/project/src/main/java/com/crawler/model/Book.java b/project/src/main/java/com/crawler/model/Book.java new file mode 100644 index 0000000..5ee4d7e --- /dev/null +++ b/project/src/main/java/com/crawler/model/Book.java @@ -0,0 +1,105 @@ +package com.crawler.model; + +public class Book { + private String title; + private String author; + private String rating; + private String ratingCount; + private String publisher; + private String publishDate; + private String price; + private String isbn; + private String summary; + private String url; + + public Book() {} + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getRating() { + return rating; + } + + public void setRating(String rating) { + this.rating = rating; + } + + public String getRatingCount() { + return ratingCount; + } + + public void setRatingCount(String ratingCount) { + this.ratingCount = ratingCount; + } + + public String getPublisher() { + return publisher; + } + + public void setPublisher(String publisher) { + this.publisher = publisher; + } + + public String getPublishDate() { + return publishDate; + } + + public void setPublishDate(String publishDate) { + this.publishDate = publishDate; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @Override + public String toString() { + return "Book{" + + "title='" + title + '\'' + + ", author='" + author + '\'' + + ", rating='" + rating + '\'' + + '}'; + } +} diff --git a/project/src/main/java/com/crawler/model/Movie.java b/project/src/main/java/com/crawler/model/Movie.java new file mode 100644 index 0000000..6313d4c --- /dev/null +++ b/project/src/main/java/com/crawler/model/Movie.java @@ -0,0 +1,96 @@ +package com.crawler.model; + +public class Movie { + private String title; + private String rating; + private String ratingCount; + private String year; + private String director; + private String actors; + private String genre; + private String summary; + private String url; + + public Movie() {} + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getRating() { + return rating; + } + + public void setRating(String rating) { + this.rating = rating; + } + + public String getRatingCount() { + return ratingCount; + } + + public void setRatingCount(String ratingCount) { + this.ratingCount = ratingCount; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public String getActors() { + return actors; + } + + public void setActors(String actors) { + this.actors = actors; + } + + public String getGenre() { + return genre; + } + + public void setGenre(String genre) { + this.genre = genre; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @Override + public String toString() { + return "Movie{" + + "title='" + title + '\'' + + ", rating='" + rating + '\'' + + ", year='" + year + '\'' + + '}'; + } +} diff --git a/project/src/main/java/com/crawler/model/ScrapeBook.java b/project/src/main/java/com/crawler/model/ScrapeBook.java new file mode 100644 index 0000000..7f4f0b1 --- /dev/null +++ b/project/src/main/java/com/crawler/model/ScrapeBook.java @@ -0,0 +1,69 @@ +package com.crawler.model; + +public class ScrapeBook { + private String title; + private String price; + private String rating; + private String availability; + private String imageUrl; + private String productUrl; + + public ScrapeBook() {} + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getRating() { + return rating; + } + + public void setRating(String rating) { + this.rating = rating; + } + + public String getAvailability() { + return availability; + } + + public void setAvailability(String availability) { + this.availability = availability; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getProductUrl() { + return productUrl; + } + + public void setProductUrl(String productUrl) { + this.productUrl = productUrl; + } + + @Override + public String toString() { + return "ScrapeBook{" + + "title='" + title + '\'' + + ", price='" + price + '\'' + + ", rating='" + rating + '\'' + + '}'; + } +} diff --git a/project/src/main/java/com/crawler/strategy/BooksToScrapeStrategy.java b/project/src/main/java/com/crawler/strategy/BooksToScrapeStrategy.java new file mode 100644 index 0000000..880a642 --- /dev/null +++ b/project/src/main/java/com/crawler/strategy/BooksToScrapeStrategy.java @@ -0,0 +1,72 @@ +package com.crawler.strategy; + +import com.crawler.exception.CrawlerException; +import com.crawler.exception.NetworkException; +import com.crawler.exception.ParseException; +import com.crawler.model.ScrapeBook; +import com.crawler.util.HttpUtil; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +public class BooksToScrapeStrategy implements CrawlerStrategy { + private static final String URL = "http://books.toscrape.com/"; + + @Override + public List crawl() throws CrawlerException { + List books = new ArrayList<>(); + try { + Document doc = HttpUtil.getDocument(URL); + Elements items = doc.select("article.product_pod"); + + for (Element item : items) { + ScrapeBook book = new ScrapeBook(); + Element titleEl = item.selectFirst("h3 a"); + if (titleEl != null) { + book.setTitle(titleEl.attr("title")); + book.setProductUrl(URL + titleEl.attr("href")); + } + + Element priceEl = item.selectFirst("p.price_color"); + if (priceEl != null) { + book.setPrice(priceEl.text()); + } + + Element availabilityEl = item.selectFirst("p.instock"); + if (availabilityEl != null) { + book.setAvailability(availabilityEl.text().trim()); + } + + Element starRatingEl = item.selectFirst("p.star-rating"); + if (starRatingEl != null) { + String classes = starRatingEl.className(); + if (classes.contains("One")) book.setRating("1"); + else if (classes.contains("Two")) book.setRating("2"); + else if (classes.contains("Three")) book.setRating("3"); + else if (classes.contains("Four")) book.setRating("4"); + else if (classes.contains("Five")) book.setRating("5"); + } + + Element imgEl = item.selectFirst("img"); + if (imgEl != null) { + book.setImageUrl(URL + imgEl.attr("src")); + } + + books.add(book); + } + } catch (NetworkException e) { + throw e; + } catch (Exception e) { + throw new ParseException("Failed to parse Books to Scrape page", e); + } + return books; + } + + @Override + public String getOutputFileName() { + return "data/books_to_scrape.json"; + } +} diff --git a/project/src/main/java/com/crawler/strategy/CrawlerStrategy.java b/project/src/main/java/com/crawler/strategy/CrawlerStrategy.java new file mode 100644 index 0000000..a9661b8 --- /dev/null +++ b/project/src/main/java/com/crawler/strategy/CrawlerStrategy.java @@ -0,0 +1,9 @@ +package com.crawler.strategy; + +import com.crawler.exception.CrawlerException; +import java.util.List; + +public interface CrawlerStrategy { + List crawl() throws CrawlerException; + String getOutputFileName(); +} diff --git a/project/src/main/java/com/crawler/strategy/DoubanBookStrategy.java b/project/src/main/java/com/crawler/strategy/DoubanBookStrategy.java new file mode 100644 index 0000000..11490c9 --- /dev/null +++ b/project/src/main/java/com/crawler/strategy/DoubanBookStrategy.java @@ -0,0 +1,69 @@ +package com.crawler.strategy; + +import com.crawler.exception.CrawlerException; +import com.crawler.exception.NetworkException; +import com.crawler.exception.ParseException; +import com.crawler.model.Book; +import com.crawler.util.HttpUtil; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +public class DoubanBookStrategy implements CrawlerStrategy { + private static final String URL = "https://book.douban.com/chart"; + + @Override + public List crawl() throws CrawlerException { + List books = new ArrayList<>(); + try { + Document doc = HttpUtil.getDocument(URL); + Elements items = doc.select("li.media"); + + for (Element item : items) { + Book book = new Book(); + Element titleEl = item.selectFirst("h2 a"); + if (titleEl != null) { + book.setTitle(titleEl.text().trim()); + book.setUrl(titleEl.attr("href")); + } + + Element ratingEl = item.selectFirst("span.rating_nums"); + if (ratingEl != null) { + book.setRating(ratingEl.text()); + } + + Element ratingCountEl = item.selectFirst("span.pl"); + if (ratingCountEl != null) { + book.setRatingCount(ratingCountEl.text()); + } + + Element infoEl = item.selectFirst("div.pub"); + if (infoEl != null) { + String info = infoEl.text(); + String[] parts = info.split("/"); + if (parts.length >= 3) { + book.setAuthor(parts[0].trim()); + book.setPublisher(parts[parts.length - 3].trim()); + book.setPublishDate(parts[parts.length - 2].trim()); + book.setPrice(parts[parts.length - 1].trim()); + } + } + + books.add(book); + } + } catch (NetworkException e) { + throw e; + } catch (Exception e) { + throw new ParseException("Failed to parse Douban book page", e); + } + return books; + } + + @Override + public String getOutputFileName() { + return "data/douban_books.json"; + } +} diff --git a/project/src/main/java/com/crawler/strategy/DoubanMovieStrategy.java b/project/src/main/java/com/crawler/strategy/DoubanMovieStrategy.java new file mode 100644 index 0000000..d30b05c --- /dev/null +++ b/project/src/main/java/com/crawler/strategy/DoubanMovieStrategy.java @@ -0,0 +1,74 @@ +package com.crawler.strategy; + +import com.crawler.exception.CrawlerException; +import com.crawler.exception.NetworkException; +import com.crawler.exception.ParseException; +import com.crawler.model.Movie; +import com.crawler.util.HttpUtil; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +public class DoubanMovieStrategy implements CrawlerStrategy { + private static final String URL = "https://movie.douban.com/chart"; + + @Override + public List crawl() throws CrawlerException { + List movies = new ArrayList<>(); + try { + Document doc = HttpUtil.getDocument(URL); + Elements items = doc.select("tr.item"); + + for (Element item : items) { + Movie movie = new Movie(); + Element titleEl = item.selectFirst("div.pl2 a"); + if (titleEl != null) { + movie.setTitle(titleEl.text().split("/")[0].trim()); + movie.setUrl(titleEl.attr("href")); + } + + Element ratingEl = item.selectFirst("span.rating_nums"); + if (ratingEl != null) { + movie.setRating(ratingEl.text()); + } + + Element ratingCountEl = item.selectFirst("span.pl"); + if (ratingCountEl != null) { + movie.setRatingCount(ratingCountEl.text()); + } + + Element infoEl = item.selectFirst("p.pl"); + if (infoEl != null) { + String info = infoEl.text(); + movie.setYear(extractYear(info)); + } + + movies.add(movie); + } + } catch (NetworkException e) { + throw e; + } catch (Exception e) { + throw new ParseException("Failed to parse Douban movie page", e); + } + return movies; + } + + private String extractYear(String info) { + String[] parts = info.split("/"); + for (String part : parts) { + part = part.trim(); + if (part.matches("\\d{4}.*")) { + return part; + } + } + return ""; + } + + @Override + public String getOutputFileName() { + return "data/douban_movies.json"; + } +} diff --git a/project/src/main/java/com/crawler/util/FileUtil.java b/project/src/main/java/com/crawler/util/FileUtil.java new file mode 100644 index 0000000..1981958 --- /dev/null +++ b/project/src/main/java/com/crawler/util/FileUtil.java @@ -0,0 +1,60 @@ +package com.crawler.util; + +import com.crawler.exception.FileException; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +public class FileUtil { + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + public static void saveToJsonFile(List data, String filePath) throws FileException { + try { + Path path = Paths.get(filePath); + Path parentDir = path.getParent(); + if (parentDir != null && !Files.exists(parentDir)) { + Files.createDirectories(parentDir); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { + GSON.toJson(data, writer); + } + } catch (IOException e) { + throw new FileException("Failed to save data to file: " + filePath, e); + } + } + + public static void saveToCsvFile(List data, String filePath, String[] headers, CsvRowMapper rowMapper) throws FileException { + try { + Path path = Paths.get(filePath); + Path parentDir = path.getParent(); + if (parentDir != null && !Files.exists(parentDir)) { + Files.createDirectories(parentDir); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { + writer.write(String.join(",", headers)); + writer.newLine(); + for (T item : data) { + writer.write(rowMapper.mapToCsvRow(item)); + writer.newLine(); + } + } + } catch (IOException e) { + throw new FileException("Failed to save data to CSV file: " + filePath, e); + } + } + + public interface CsvRowMapper { + String mapToCsvRow(T item); + } +} diff --git a/project/src/main/java/com/crawler/util/HttpUtil.java b/project/src/main/java/com/crawler/util/HttpUtil.java new file mode 100644 index 0000000..ff42d5e --- /dev/null +++ b/project/src/main/java/com/crawler/util/HttpUtil.java @@ -0,0 +1,24 @@ +package com.crawler.util; + +import com.crawler.exception.NetworkException; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +public class HttpUtil { + private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; + private static final int TIMEOUT = 10000; + + public static Document getDocument(String url) throws NetworkException { + try { + return Jsoup.connect(url) + .userAgent(USER_AGENT) + .timeout(TIMEOUT) + .ignoreHttpErrors(true) + .get(); + } catch (IOException e) { + throw new NetworkException("Failed to fetch URL: " + url, e); + } + } +} diff --git a/project/src/main/java/com/crawler/view/ConsoleView.java b/project/src/main/java/com/crawler/view/ConsoleView.java new file mode 100644 index 0000000..e836f20 --- /dev/null +++ b/project/src/main/java/com/crawler/view/ConsoleView.java @@ -0,0 +1,59 @@ +package com.crawler.view; + +import java.util.List; + +public class ConsoleView { + public void displayWelcome() { + System.out.println("========================================"); + System.out.println(" Web Crawler Application"); + System.out.println("========================================"); + System.out.println(); + } + + public void displayMenu() { + System.out.println("Please select an option:"); + System.out.println("1. Crawl Douban Movies"); + System.out.println("2. Crawl Douban Books"); + System.out.println("3. Crawl Books to Scrape"); + System.out.println("4. Crawl All"); + System.out.println("0. Exit"); + System.out.println(); + System.out.print("Enter your choice: "); + } + + public void displayCrawling(String description) { + System.out.println(); + System.out.println("----------------------------------------"); + System.out.println("Crawling: " + description); + System.out.println("----------------------------------------"); + } + + public void displaySuccess(String fileName) { + System.out.println("✓ Data saved to: " + fileName); + System.out.println(); + } + + public void displayError(String message) { + System.err.println("✗ Error: " + message); + System.err.println(); + } + + public void displayResults(List data) { + System.out.println("Found " + data.size() + " items:"); + for (Object item : data) { + System.out.println("- " + item); + } + System.out.println(); + } + + public void displayGoodbye() { + System.out.println("========================================"); + System.out.println(" Goodbye!"); + System.out.println("========================================"); + } + + public void displayInvalidChoice() { + System.out.println("Invalid choice. Please try again."); + System.out.println(); + } +} diff --git a/project/src/main/java/command/ClearCommand.java b/project/src/main/java/command/ClearCommand.java new file mode 100644 index 0000000..f172624 --- /dev/null +++ b/project/src/main/java/command/ClearCommand.java @@ -0,0 +1,38 @@ +package command; + +import controller.CrawlerController; +import exception.CrawlerResult; +import java.util.Collections; +import java.util.List; + +public class ClearCommand implements Command { + private final CrawlerController controller; + + public ClearCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public String getName() { + return "clear"; + } + + @Override + public String getDescription() { + return "清空所有数据"; + } + + @Override + public CrawlerResult execute() { + controller.clearAllData(); + return CrawlerResult.success("SYSTEM") + .message("数据已清空") + .dataCount(0) + .build(); + } + + @Override + public List getRequiredSources() { + return Collections.emptyList(); + } +} \ No newline at end of file diff --git a/project/src/main/java/command/Command.java b/project/src/main/java/command/Command.java new file mode 100644 index 0000000..c86404f --- /dev/null +++ b/project/src/main/java/command/Command.java @@ -0,0 +1,11 @@ +package command; + +import exception.CrawlerResult; +import java.util.List; + +public interface Command { + String getName(); + String getDescription(); + CrawlerResult execute(); + List getRequiredSources(); +} \ No newline at end of file diff --git a/project/src/main/java/command/CommandRegistry.java b/project/src/main/java/command/CommandRegistry.java new file mode 100644 index 0000000..3e963a0 --- /dev/null +++ b/project/src/main/java/command/CommandRegistry.java @@ -0,0 +1,41 @@ +package command; + +import exception.CrawlerResult; +import exception.ValidationException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CommandRegistry { + private final Map commands; + + public CommandRegistry() { + this.commands = new HashMap<>(); + } + + public void register(Command command) { + commands.put(command.getName(), command); + } + + public Command getCommand(String name) { + Command command = commands.get(name); + if (command == null) { + throw new ValidationException("未知命令: " + name); + } + return command; + } + + public List getAllCommands() { + return new ArrayList<>(commands.values()); + } + + public String getHelpText() { + StringBuilder sb = new StringBuilder(); + sb.append("可用命令:\n"); + for (Command cmd : commands.values()) { + sb.append(String.format(" %-15s - %s\n", cmd.getName(), cmd.getDescription())); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/project/src/main/java/command/ListCrawlersCommand.java b/project/src/main/java/command/ListCrawlersCommand.java new file mode 100644 index 0000000..50d6a0b --- /dev/null +++ b/project/src/main/java/command/ListCrawlersCommand.java @@ -0,0 +1,37 @@ +package command; + +import controller.CrawlerController; +import exception.CrawlerResult; +import java.util.List; + +public class ListCrawlersCommand implements Command { + private final CrawlerController controller; + + public ListCrawlersCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public String getName() { + return "list"; + } + + @Override + public String getDescription() { + return "列出所有可用爬虫"; + } + + @Override + public CrawlerResult execute() { + List crawlers = controller.getAllCrawlerNames(); + return CrawlerResult.success("SYSTEM") + .message("获取爬虫列表成功") + .dataCount(crawlers.size()) + .build(); + } + + @Override + public List getRequiredSources() { + return controller.getAllCrawlerNames(); + } +} \ No newline at end of file diff --git a/project/src/main/java/command/RunAllCommand.java b/project/src/main/java/command/RunAllCommand.java new file mode 100644 index 0000000..a2842ea --- /dev/null +++ b/project/src/main/java/command/RunAllCommand.java @@ -0,0 +1,59 @@ +package command; + +import controller.CrawlerController; +import exception.CrawlerResult; +import java.util.List; + +public class RunAllCommand implements Command { + private final CrawlerController controller; + + public RunAllCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public String getName() { + return "run-all"; + } + + @Override + public String getDescription() { + return "运行所有爬虫"; + } + + @Override + public CrawlerResult execute() { + long startTime = System.currentTimeMillis(); + List results = controller.runAllCrawlers(); + long elapsedTime = System.currentTimeMillis() - startTime; + + int successCount = 0; + int totalCount = results.size(); + int totalData = 0; + + for (CrawlerResult result : results) { + if (result.isSuccess()) { + successCount++; + totalData += result.getDataCount(); + } + } + + if (successCount == totalCount) { + return CrawlerResult.success("ALL") + .message("所有爬虫执行成功") + .dataCount(totalData) + .elapsedTime(elapsedTime) + .build(); + } else { + return CrawlerResult.failure("ALL", "PARTIAL_FAIL", + String.format("执行完成: %d/%d 成功, 获取 %d 条数据", successCount, totalCount, totalData)) + .elapsedTime(elapsedTime) + .build(); + } + } + + @Override + public List getRequiredSources() { + return controller.getAllCrawlerNames(); + } +} \ No newline at end of file diff --git a/project/src/main/java/command/RunSingleCommand.java b/project/src/main/java/command/RunSingleCommand.java new file mode 100644 index 0000000..dcdb45b --- /dev/null +++ b/project/src/main/java/command/RunSingleCommand.java @@ -0,0 +1,37 @@ +package command; + +import controller.CrawlerController; +import exception.CrawlerResult; +import exception.ValidationException; +import java.util.Collections; +import java.util.List; + +public class RunSingleCommand implements Command { + private final CrawlerController controller; + private final String crawlerName; + + public RunSingleCommand(CrawlerController controller, String crawlerName) { + this.controller = controller; + this.crawlerName = crawlerName; + } + + @Override + public String getName() { + return "run"; + } + + @Override + public String getDescription() { + return "运行指定爬虫: " + crawlerName; + } + + @Override + public CrawlerResult execute() { + return controller.runCrawler(crawlerName); + } + + @Override + public List getRequiredSources() { + return Collections.singletonList(crawlerName); + } +} \ No newline at end of file diff --git a/project/src/main/java/command/StatsCommand.java b/project/src/main/java/command/StatsCommand.java new file mode 100644 index 0000000..d0ec936 --- /dev/null +++ b/project/src/main/java/command/StatsCommand.java @@ -0,0 +1,38 @@ +package command; + +import controller.CrawlerController; +import exception.CrawlerResult; +import java.util.Collections; +import java.util.List; + +public class StatsCommand implements Command { + private final CrawlerController controller; + + public StatsCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public String getName() { + return "stats"; + } + + @Override + public String getDescription() { + return "显示统计信息"; + } + + @Override + public CrawlerResult execute() { + String stats = controller.getStats(); + return CrawlerResult.success("STATS") + .message(stats) + .dataCount(0) + .build(); + } + + @Override + public List getRequiredSources() { + return Collections.emptyList(); + } +} \ No newline at end of file diff --git a/project/src/main/java/config/CrawlerConfig.java b/project/src/main/java/config/CrawlerConfig.java new file mode 100644 index 0000000..6d46a55 --- /dev/null +++ b/project/src/main/java/config/CrawlerConfig.java @@ -0,0 +1,73 @@ +package config; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +/** + * 爬虫配置类 + */ +public class CrawlerConfig { + private static final String CONFIG_FILE = "crawler.properties"; + private static Properties props = new Properties(); + + // 默认配置 + static { + props.setProperty("delay.ms", "1000"); + props.setProperty("timeout.ms", "15000"); + props.setProperty("user.agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"); + props.setProperty("db.path", "crawler.db"); + props.setProperty("output.dir", "output"); + props.setProperty("enable.database", "true"); + props.setProperty("enable.file", "true"); + } + + /** + * 加载配置文件 + */ + public static void load() { + try (InputStream is = new FileInputStream(CONFIG_FILE)) { + props.load(is); + System.out.println("配置文件加载成功: " + CONFIG_FILE); + } catch (IOException e) { + System.out.println("使用默认配置(未找到配置文件: " + CONFIG_FILE + ")"); + } + } + + public static int getDelayMs() { + return Integer.parseInt(props.getProperty("delay.ms", "1000")); + } + + public static int getTimeoutMs() { + return Integer.parseInt(props.getProperty("timeout.ms", "15000")); + } + + public static String getUserAgent() { + return props.getProperty("user.agent"); + } + + public static String getDbPath() { + return props.getProperty("db.path", "crawler.db"); + } + + public static String getOutputDir() { + return props.getProperty("output.dir", "output"); + } + + public static boolean isDatabaseEnabled() { + return Boolean.parseBoolean(props.getProperty("enable.database", "true")); + } + + public static boolean isFileOutputEnabled() { + return Boolean.parseBoolean(props.getProperty("enable.file", "true")); + } + + public static String getProperty(String key) { + return props.getProperty(key); + } + + public static String getProperty(String key, String defaultValue) { + return props.getProperty(key, defaultValue); + } +} diff --git a/project/src/main/java/controller/CrawlerController.java b/project/src/main/java/controller/CrawlerController.java new file mode 100644 index 0000000..1d55611 --- /dev/null +++ b/project/src/main/java/controller/CrawlerController.java @@ -0,0 +1,177 @@ +package controller; + +import exception.CrawlerResult; +import exception.ValidationException; +import model.Movie; +import storage.DataStorage; +import storage.FileStorage; +import storage.StorageStats; +import strategy.CrawlerStrategy; +import strategy.BookCrawlerStrategy; +import strategy.impl.DoubanStrategy; +import strategy.impl.MaoyanStrategy; +import strategy.impl.RottenTomatoesStrategy; +import strategy.impl.DoubanBookStrategy; +import strategy.impl.BooksToScrapeStrategy; +import util.Logger; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CrawlerController { + private Map movieCrawlers; + private Map bookCrawlers; + private DataStorage storage; + private String outputDir; + + public CrawlerController() { + this.movieCrawlers = new HashMap<>(); + this.bookCrawlers = new HashMap<>(); + this.outputDir = "output"; + initStorage(); + registerDefaultCrawlers(); + } + + public CrawlerController(String outputDir) { + this.movieCrawlers = new HashMap<>(); + this.bookCrawlers = new HashMap<>(); + this.outputDir = outputDir; + initStorage(); + registerDefaultCrawlers(); + } + + private void initStorage() { + this.storage = new FileStorage(outputDir); + Logger.info("文件存储初始化完成,输出目录: " + outputDir); + } + + private void registerDefaultCrawlers() { + registerMovieCrawler(new DoubanStrategy()); + registerMovieCrawler(new MaoyanStrategy()); + registerMovieCrawler(new RottenTomatoesStrategy()); + registerBookCrawler(new DoubanBookStrategy()); + registerBookCrawler(new BooksToScrapeStrategy()); + } + + public void registerMovieCrawler(CrawlerStrategy strategy) { + strategy.setStorage(storage); + movieCrawlers.put(strategy.getName(), strategy); + Logger.info("已注册电影爬虫: " + strategy.getName()); + } + + public void registerBookCrawler(BookCrawlerStrategy strategy) { + strategy.setStorage(storage); + bookCrawlers.put(strategy.getName(), strategy); + Logger.info("已注册图书爬虫: " + strategy.getName()); + } + + public void registerCrawler(CrawlerStrategy strategy) { + registerMovieCrawler(strategy); + } + + public void registerCrawler(CrawlerStrategy strategy, DataStorage customStorage) { + strategy.setStorage(customStorage); + movieCrawlers.put(strategy.getName(), strategy); + Logger.info("已注册爬虫: " + strategy.getName()); + } + + public List getAllCrawlerNames() { + List names = new ArrayList<>(); + names.addAll(movieCrawlers.keySet()); + names.addAll(bookCrawlers.keySet()); + return names; + } + + public List getMovieCrawlerNames() { + return new ArrayList<>(movieCrawlers.keySet()); + } + + public List getBookCrawlerNames() { + return new ArrayList<>(bookCrawlers.keySet()); + } + + public CrawlerResult runCrawler(String name) { + if (movieCrawlers.containsKey(name)) { + CrawlerStrategy strategy = movieCrawlers.get(name); + Logger.info("开始执行电影爬虫: " + name); + CrawlerResult result = strategy.execute(); + Logger.info("爬虫执行完成: " + result); + return result; + } else if (bookCrawlers.containsKey(name)) { + BookCrawlerStrategy strategy = bookCrawlers.get(name); + Logger.info("开始执行图书爬虫: " + name); + CrawlerResult result = strategy.execute(); + Logger.info("爬虫执行完成: " + result); + return result; + } else { + throw new ValidationException("未找到爬虫: " + name); + } + } + + public List runAllCrawlers() { + List results = new ArrayList<>(); + int total = movieCrawlers.size() + bookCrawlers.size(); + Logger.info("开始执行所有爬虫,共 " + total + " 个"); + + for (CrawlerStrategy strategy : movieCrawlers.values()) { + try { + CrawlerResult result = strategy.execute(); + results.add(result); + } catch (Exception e) { + Logger.error("爬虫执行失败: " + strategy.getName(), e); + results.add(CrawlerResult.failure(strategy.getName(), "EXEC_ERROR", e.getMessage()).build()); + } + } + + for (BookCrawlerStrategy strategy : bookCrawlers.values()) { + try { + CrawlerResult result = strategy.execute(); + results.add(result); + } catch (Exception e) { + Logger.error("爬虫执行失败: " + strategy.getName(), e); + results.add(CrawlerResult.failure(strategy.getName(), "EXEC_ERROR", e.getMessage()).build()); + } + } + + return results; + } + + public String getStats() { + StringBuilder sb = new StringBuilder(); + sb.append("========== 爬虫统计 ==========\n"); + sb.append("电影爬虫数量: ").append(movieCrawlers.size()).append("\n"); + sb.append("图书爬虫数量: ").append(bookCrawlers.size()).append("\n"); + sb.append("总爬虫数量: ").append(movieCrawlers.size() + bookCrawlers.size()).append("\n"); + sb.append("\n电影爬虫列表:\n"); + for (String name : movieCrawlers.keySet()) { + sb.append(" - ").append(name).append("\n"); + } + sb.append("\n图书爬虫列表:\n"); + for (String name : bookCrawlers.keySet()) { + sb.append(" - ").append(name).append("\n"); + } + sb.append("============================="); + return sb.toString(); + } + + public void clearAllData() { + if (storage != null) { + storage.clearAll(); + Logger.info("所有数据已清空"); + } + } + + public DataStorage getStorage() { + return storage; + } + + public Map getCrawlers() { + return movieCrawlers; + } + + public Map getBookCrawlers() { + return bookCrawlers; + } +} diff --git a/project/src/main/java/crawler/BaseCrawler.java b/project/src/main/java/crawler/BaseCrawler.java new file mode 100644 index 0000000..c9c1c03 --- /dev/null +++ b/project/src/main/java/crawler/BaseCrawler.java @@ -0,0 +1,139 @@ +package crawler; + +import model.Movie; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import storage.DataStorage; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 爬虫抽象基类 + */ +public abstract class BaseCrawler { + protected String name; // 爬虫名称 + protected String baseUrl; // 基础URL + protected int delayMs; // 请求延迟(毫秒) + protected DataStorage storage; // 数据存储 + + public BaseCrawler(String name, String baseUrl) { + this(name, baseUrl, 1000); + } + + public BaseCrawler(String name, String baseUrl, int delayMs) { + this.name = name; + this.baseUrl = baseUrl; + this.delayMs = delayMs; + } + + /** + * 设置数据存储 + */ + public void setStorage(DataStorage storage) { + this.storage = storage; + } + + /** + * 获取爬虫名称 + */ + public String getName() { + return name; + } + + /** + * 获取网页文档 + */ + protected Document fetchDocument(String url) throws IOException { + return Jsoup.connect(url) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .timeout(15000) + .get(); + } + + /** + * 延迟等待 + */ + protected void delay() { + try { + Thread.sleep(delayMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + /** + * 开始爬取(模板方法模式) + */ + public final void crawl() { + System.out.println("========================================"); + System.out.println("开始爬取: " + name); + System.out.println("目标URL: " + baseUrl); + System.out.println("========================================"); + + long startTime = System.currentTimeMillis(); + List allMovies = new ArrayList<>(); + + try { + // 获取所有需要爬取的URL列表 + List urls = getUrls(); + System.out.println("共 " + urls.size() + " 个页面需要爬取"); + + for (int i = 0; i < urls.size(); i++) { + String url = urls.get(i); + System.out.println("\n正在爬取第 " + (i + 1) + "/" + urls.size() + " 页: " + url); + + try { + Document doc = fetchDocument(url); + List movies = parsePage(doc); + + // 设置数据来源 + for (Movie movie : movies) { + movie.setSource(name); + } + + allMovies.addAll(movies); + System.out.println("本页获取 " + movies.size() + " 条数据"); + + // 延迟,避免被封 + if (i < urls.size() - 1) { + delay(); + } + + } catch (IOException e) { + System.err.println("爬取页面失败: " + url + " - " + e.getMessage()); + } + } + + // 保存数据 + if (!allMovies.isEmpty() && storage != null) { + storage.saveBatch(allMovies); + } + + long endTime = System.currentTimeMillis(); + System.out.println("\n========================================"); + System.out.println("爬取完成!"); + System.out.println("总数据量: " + allMovies.size()); + System.out.println("耗时: " + (endTime - startTime) / 1000 + " 秒"); + System.out.println("========================================"); + + } catch (Exception e) { + System.err.println("爬取过程出错: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * 获取所有需要爬取的URL列表(子类实现) + */ + protected abstract List getUrls(); + + /** + * 解析单个页面(子类实现) + */ + protected abstract List parsePage(Document doc); +} diff --git a/project/src/main/java/crawler/DoubanCrawler.java b/project/src/main/java/crawler/DoubanCrawler.java new file mode 100644 index 0000000..df526c8 --- /dev/null +++ b/project/src/main/java/crawler/DoubanCrawler.java @@ -0,0 +1,113 @@ +package crawler; + +import model.Movie; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +/** + * 豆瓣电影Top250爬虫 + */ +public class DoubanCrawler extends BaseCrawler { + + public DoubanCrawler() { + super("豆瓣电影Top250", "https://movie.douban.com/top250", 1500); + } + + @Override + protected List getUrls() { + List urls = new ArrayList<>(); + // 豆瓣Top250共10页,每页25部 + for (int i = 0; i < 10; i++) { + urls.add(baseUrl + "?start=" + (i * 25)); + } + return urls; + } + + @Override + protected List parsePage(Document doc) { + List movies = new ArrayList<>(); + Elements items = doc.select("div.item"); + + for (Element item : items) { + try { + Movie movie = new Movie(); + + // 排名 + String rankStr = item.select("em").text(); + movie.setRank(Integer.parseInt(rankStr)); + + // 电影名称(取第一个标题) + Element titleElement = item.select("span.title").first(); + if (titleElement != null) { + movie.setName(titleElement.text()); + } + + // 评分 + String ratingStr = item.select("span.rating_num").text(); + if (!ratingStr.isEmpty()) { + movie.setRating(Double.parseDouble(ratingStr)); + } + + // 评分人数 + String ratingCountStr = item.select("div.star span").last().text(); + if (ratingCountStr != null && ratingCountStr.contains("人评价")) { + String num = ratingCountStr.replace("人评价", "").trim(); + movie.setRatingCount(parseNumber(num)); + } + + // 其他信息(导演、年份等) + String info = item.select("div.bd p").first().text(); + if (info != null) { + // 提取年份 + String[] parts = info.split(" / "); + if (parts.length > 0) { + String firstPart = parts[0]; + if (firstPart.contains("导演: ")) { + movie.setDirector(firstPart.replace("导演: ", "").trim()); + } + // 提取年份(通常是最后一个数字部分) + for (String part : parts) { + if (part.matches("\\d{4}") || part.matches("\\d{4}.*")) { + movie.setYear(part.trim().split("\\s+")[0]); + break; + } + } + } + } + + // 详情链接 + String link = item.select("div.hd a").attr("href"); + movie.setUrl(link); + + // 海报图片 + String imgUrl = item.select("div.pic img").attr("src"); + movie.setImageUrl(imgUrl); + + movies.add(movie); + + } catch (Exception e) { + System.err.println("解析电影数据出错: " + e.getMessage()); + } + } + + return movies; + } + + /** + * 解析数字(处理中文数字如"万") + */ + private Integer parseNumber(String str) { + try { + if (str.contains("万")) { + return (int) (Double.parseDouble(str.replace("万", "")) * 10000); + } + return Integer.parseInt(str.replace(",", "")); + } catch (NumberFormatException e) { + return null; + } + } +} diff --git a/project/src/main/java/crawler/ImdbCrawler.java b/project/src/main/java/crawler/ImdbCrawler.java new file mode 100644 index 0000000..17dffeb --- /dev/null +++ b/project/src/main/java/crawler/ImdbCrawler.java @@ -0,0 +1,100 @@ +package crawler; + +import model.Movie; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +/** + * IMDB Top250 爬虫示例 + */ +public class ImdbCrawler extends BaseCrawler { + + public ImdbCrawler() { + super("IMDB电影Top250", "https://www.imdb.com/chart/top/", 2000); + } + + @Override + protected List getUrls() { + List urls = new ArrayList<>(); + urls.add(baseUrl); + return urls; + } + + @Override + protected List parsePage(Document doc) { + List movies = new ArrayList<>(); + Elements items = doc.select("li.ipc-metadata-list-summary-item"); + + int rank = 1; + for (Element item : items) { + try { + Movie movie = new Movie(); + movie.setRank(rank++); + + // 电影名称 + Element titleElement = item.select("h3.ipc-title__text").first(); + if (titleElement != null) { + String fullTitle = titleElement.text(); + // 移除排名前缀如 "1. " + if (fullTitle.matches("\\d+\\..*")) { + fullTitle = fullTitle.substring(fullTitle.indexOf(".") + 1).trim(); + } + movie.setName(fullTitle); + } + + // 评分 + String ratingStr = item.select("span.ipc-rating-star--rating").text(); + if (!ratingStr.isEmpty()) { + movie.setRating(Double.parseDouble(ratingStr)); + } + + // 评分人数 + String countStr = item.select("span.ipc-rating-star--voteCount").text(); + if (!countStr.isEmpty()) { + movie.setRatingCount(parseNumber(countStr.replaceAll("[()\\s]", ""))); + } + + // 年份 + String yearStr = item.select("span.cli-title-metadata-item").first().text(); + if (yearStr != null && yearStr.matches("\\d{4}")) { + movie.setYear(yearStr); + } + + // 详情链接 + String link = item.select("a.ipc-title-link-wrapper").attr("href"); + if (!link.isEmpty()) { + movie.setUrl("https://www.imdb.com" + link); + } + + // 海报图片 + String imgUrl = item.select("img.ipc-image").attr("src"); + movie.setImageUrl(imgUrl); + + movies.add(movie); + + } catch (Exception e) { + System.err.println("解析电影数据出错: " + e.getMessage()); + } + } + + return movies; + } + + private Integer parseNumber(String str) { + try { + if (str.contains("M")) { + return (int) (Double.parseDouble(str.replace("M", "")) * 1000000); + } + if (str.contains("K")) { + return (int) (Double.parseDouble(str.replace("K", "")) * 1000); + } + return Integer.parseInt(str.replace(",", "")); + } catch (NumberFormatException e) { + return null; + } + } +} diff --git a/project/src/main/java/crawler/MaoyanCrawler.java b/project/src/main/java/crawler/MaoyanCrawler.java new file mode 100644 index 0000000..90d7cc3 --- /dev/null +++ b/project/src/main/java/crawler/MaoyanCrawler.java @@ -0,0 +1,92 @@ +package crawler; + +import model.Movie; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +/** + * 猫眼电影 Top100 爬虫 + */ +public class MaoyanCrawler extends BaseCrawler { + + public MaoyanCrawler() { + super("猫眼电影Top100", "https://maoyan.com/board/4", 1500); + } + + @Override + protected List getUrls() { + List urls = new ArrayList<>(); + // 猫眼Top100共10页,每页10部 + for (int i = 0; i < 10; i++) { + urls.add(baseUrl + "?offset=" + (i * 10)); + } + return urls; + } + + @Override + protected List parsePage(Document doc) { + List movies = new ArrayList<>(); + Elements items = doc.select("dl.board-wrapper dd"); + + for (Element item : items) { + try { + Movie movie = new Movie(); + + // 排名 + String rankStr = item.select("i.board-index").text(); + movie.setRank(Integer.parseInt(rankStr)); + + // 电影名称 + String name = item.select("p.name a").text(); + movie.setName(name); + + // 评分 + String ratingStr = item.select("i.integer").text() + + item.select("i.fraction").text(); + if (!ratingStr.isEmpty()) { + movie.setRating(Double.parseDouble(ratingStr)); + } + + // 主演 + String actors = item.select("p.star").text(); + if (actors != null && actors.contains("主演:")) { + movie.setActors(actors.replace("主演:", "").trim()); + } + + // 上映时间 + String releaseTime = item.select("p.releasetime").text(); + if (releaseTime != null && releaseTime.contains("上映时间:")) { + String timeStr = releaseTime.replace("上映时间:", "").trim(); + // 提取年份 + if (timeStr.matches("\\d{4}.*")) { + movie.setYear(timeStr.substring(0, 4)); + } + } + + // 详情链接 + String link = item.select("p.name a").attr("href"); + if (!link.isEmpty()) { + movie.setUrl("https://maoyan.com" + link); + } + + // 海报图片 + String imgUrl = item.select("img.board-img").attr("data-src"); + if (imgUrl.isEmpty()) { + imgUrl = item.select("img.board-img").attr("src"); + } + movie.setImageUrl(imgUrl); + + movies.add(movie); + + } catch (Exception e) { + System.err.println("解析猫眼电影数据出错: " + e.getMessage()); + } + } + + return movies; + } +} diff --git a/project/src/main/java/crawler/RottenTomatoesCrawler.java b/project/src/main/java/crawler/RottenTomatoesCrawler.java new file mode 100644 index 0000000..f443186 --- /dev/null +++ b/project/src/main/java/crawler/RottenTomatoesCrawler.java @@ -0,0 +1,102 @@ +package crawler; + +import model.Movie; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +/** + * 烂番茄 (Rotten Tomatoes) Top100 爬虫 + */ +public class RottenTomatoesCrawler extends BaseCrawler { + + public RottenTomatoesCrawler() { + super("烂番茄Top100", "https://www.rottentomatoes.com/top/bestofrt/", 2000); + } + + @Override + protected List getUrls() { + List urls = new ArrayList<>(); + urls.add(baseUrl); + return urls; + } + + @Override + protected List parsePage(Document doc) { + List movies = new ArrayList<>(); + Elements items = doc.select("table.table tr"); + + // 跳过表头 + int rank = 0; + for (Element item : items) { + try { + // 跳过表头行 + Element rankElement = item.selectFirst("td.rank"); + if (rankElement == null) continue; + + Movie movie = new Movie(); + + // 排名 + String rankStr = rankElement.text(); + if (!rankStr.isEmpty()) { + movie.setRank(Integer.parseInt(rankStr)); + } else { + movie.setRank(++rank); + } + + // 电影名称和年份 + Element titleElement = item.selectFirst("td.title a"); + if (titleElement != null) { + String fullTitle = titleElement.text(); + // 提取年份(通常在括号里) + if (fullTitle.contains("(") && fullTitle.contains(")")) { + int start = fullTitle.lastIndexOf("("); + int end = fullTitle.lastIndexOf(")"); + if (start > 0 && end > start) { + String yearStr = fullTitle.substring(start + 1, end); + if (yearStr.matches("\\d{4}")) { + movie.setYear(yearStr); + } + movie.setName(fullTitle.substring(0, start).trim()); + } else { + movie.setName(fullTitle); + } + } else { + movie.setName(fullTitle); + } + + // 详情链接 + String link = titleElement.attr("href"); + if (!link.isEmpty()) { + if (link.startsWith("/")) { + movie.setUrl("https://www.rottentomatoes.com" + link); + } else { + movie.setUrl(link); + } + } + } + + // 新鲜度评分(烂番茄特有) + Element scoreElement = item.selectFirst("td.score span.tMeterScore"); + if (scoreElement != null) { + String scoreStr = scoreElement.text(); + if (scoreStr.matches("\\d+%")) { + // 转换为10分制 + double rating = Double.parseDouble(scoreStr.replace("%", "")) / 10; + movie.setRating(Math.round(rating * 10) / 10.0); + } + } + + movies.add(movie); + + } catch (Exception e) { + System.err.println("解析烂番茄数据出错: " + e.getMessage()); + } + } + + return movies; + } +} diff --git a/project/src/main/java/exception/CrawlerException.java b/project/src/main/java/exception/CrawlerException.java new file mode 100644 index 0000000..fd4822f --- /dev/null +++ b/project/src/main/java/exception/CrawlerException.java @@ -0,0 +1,55 @@ +package exception; + +public class CrawlerException extends RuntimeException { + private final String source; + private final String errorCode; + + public CrawlerException(String message) { + super(message); + this.source = "UNKNOWN"; + this.errorCode = "CRAWLER_001"; + } + + public CrawlerException(String message, String source) { + super(message); + this.source = source; + this.errorCode = "CRAWLER_001"; + } + + public CrawlerException(String message, Throwable cause) { + super(message, cause); + this.source = "UNKNOWN"; + this.errorCode = "CRAWLER_002"; + } + + public CrawlerException(String message, String source, Throwable cause) { + super(message, cause); + this.source = source; + this.errorCode = "CRAWLER_002"; + } + + public CrawlerException(String message, String source, String errorCode) { + super(message); + this.source = source; + this.errorCode = errorCode; + } + + public CrawlerException(String message, String source, String errorCode, Throwable cause) { + super(message, cause); + this.source = source; + this.errorCode = errorCode; + } + + public String getSource() { + return source; + } + + public String getErrorCode() { + return errorCode; + } + + @Override + public String toString() { + return String.format("[%s] [%s] %s (source: %s)", errorCode, getClass().getSimpleName(), getMessage(), source); + } +} \ No newline at end of file diff --git a/project/src/main/java/exception/CrawlerResult.java b/project/src/main/java/exception/CrawlerResult.java new file mode 100644 index 0000000..a066ced --- /dev/null +++ b/project/src/main/java/exception/CrawlerResult.java @@ -0,0 +1,103 @@ +package exception; + +public class CrawlerResult { + private final boolean success; + private final String source; + private final String message; + private final int dataCount; + private final long elapsedTime; + private final String errorCode; + + private CrawlerResult(Builder builder) { + this.success = builder.success; + this.source = builder.source; + this.message = builder.message; + this.dataCount = builder.dataCount; + this.elapsedTime = builder.elapsedTime; + this.errorCode = builder.errorCode; + } + + public boolean isSuccess() { + return success; + } + + public String getSource() { + return source; + } + + public String getMessage() { + return message; + } + + public int getDataCount() { + return dataCount; + } + + public long getElapsedTime() { + return elapsedTime; + } + + public String getErrorCode() { + return errorCode; + } + + public static Builder success(String source) { + return new Builder().success(true).source(source); + } + + public static Builder failure(String source, String errorCode, String message) { + return new Builder().success(false).source(source).errorCode(errorCode).message(message); + } + + public static class Builder { + private boolean success; + private String source; + private String message; + private int dataCount; + private long elapsedTime; + private String errorCode; + + public Builder success(boolean success) { + this.success = success; + return this; + } + + public Builder source(String source) { + this.source = source; + return this; + } + + public Builder message(String message) { + this.message = message; + return this; + } + + public Builder dataCount(int dataCount) { + this.dataCount = dataCount; + return this; + } + + public Builder elapsedTime(long elapsedTime) { + this.elapsedTime = elapsedTime; + return this; + } + + public Builder errorCode(String errorCode) { + this.errorCode = errorCode; + return this; + } + + public CrawlerResult build() { + return new CrawlerResult(this); + } + } + + @Override + public String toString() { + if (success) { + return String.format("[SUCCESS] %s - 获取 %d 条数据 (耗时: %dms)", source, dataCount, elapsedTime); + } else { + return String.format("[FAILURE] [%s] %s - %s", errorCode, source, message); + } + } +} \ No newline at end of file diff --git a/project/src/main/java/exception/NetworkException.java b/project/src/main/java/exception/NetworkException.java new file mode 100644 index 0000000..64fa86a --- /dev/null +++ b/project/src/main/java/exception/NetworkException.java @@ -0,0 +1,20 @@ +package exception; + +public class NetworkException extends CrawlerException { + + public NetworkException(String message) { + super(message); + } + + public NetworkException(String message, String source) { + super(message, source); + } + + public NetworkException(String message, Throwable cause) { + super(message, cause); + } + + public NetworkException(String message, String source, Throwable cause) { + super(message, source, cause); + } +} \ No newline at end of file diff --git a/project/src/main/java/exception/ParseException.java b/project/src/main/java/exception/ParseException.java new file mode 100644 index 0000000..0f327e4 --- /dev/null +++ b/project/src/main/java/exception/ParseException.java @@ -0,0 +1,20 @@ +package exception; + +public class ParseException extends CrawlerException { + + public ParseException(String message) { + super(message); + } + + public ParseException(String message, String source) { + super(message, source); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } + + public ParseException(String message, String source, Throwable cause) { + super(message, source, cause); + } +} \ No newline at end of file diff --git a/project/src/main/java/exception/StorageException.java b/project/src/main/java/exception/StorageException.java new file mode 100644 index 0000000..678ccf3 --- /dev/null +++ b/project/src/main/java/exception/StorageException.java @@ -0,0 +1,20 @@ +package exception; + +public class StorageException extends CrawlerException { + + public StorageException(String message) { + super(message); + } + + public StorageException(String message, String source) { + super(message, source); + } + + public StorageException(String message, Throwable cause) { + super(message, cause); + } + + public StorageException(String message, String source, Throwable cause) { + super(message, source, cause); + } +} \ No newline at end of file diff --git a/project/src/main/java/exception/ValidationException.java b/project/src/main/java/exception/ValidationException.java new file mode 100644 index 0000000..dc460d3 --- /dev/null +++ b/project/src/main/java/exception/ValidationException.java @@ -0,0 +1,20 @@ +package exception; + +public class ValidationException extends CrawlerException { + + public ValidationException(String message) { + super(message); + } + + public ValidationException(String message, String source) { + super(message, source); + } + + public ValidationException(String message, Throwable cause) { + super(message, cause); + } + + public ValidationException(String message, String source, Throwable cause) { + super(message, source, cause); + } +} \ No newline at end of file diff --git a/project/src/main/java/main/CrawlerManager.java b/project/src/main/java/main/CrawlerManager.java new file mode 100644 index 0000000..cf4bb06 --- /dev/null +++ b/project/src/main/java/main/CrawlerManager.java @@ -0,0 +1,236 @@ +package main; + +import config.CrawlerConfig; +import crawler.BaseCrawler; +import crawler.DoubanCrawler; +import crawler.ImdbCrawler; +import crawler.MaoyanCrawler; +import crawler.RottenTomatoesCrawler; +import model.Book; +import model.Movie; +import storage.DataStorage; +import storage.FileStorage; +import storage.SQLiteStorage; +import storage.StorageStats; +import util.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class CrawlerManager { + private List crawlers; + private DataStorage databaseStorage; + private DataStorage fileStorage; + + public CrawlerManager() { + crawlers = new ArrayList<>(); + + CrawlerConfig.load(); + + if (CrawlerConfig.isDatabaseEnabled()) { + databaseStorage = new SQLiteStorage(); + Logger.info("数据库存储已启用"); + } + if (CrawlerConfig.isFileOutputEnabled()) { + fileStorage = new FileStorage(CrawlerConfig.getOutputDir()); + Logger.info("文件输出已启用"); + } + + registerCrawler(new DoubanCrawler()); + registerCrawler(new MaoyanCrawler()); + registerCrawler(new RottenTomatoesCrawler()); + } + + public void registerCrawler(BaseCrawler crawler) { + if (databaseStorage != null) { + crawler.setStorage(new MultiStorage(databaseStorage, fileStorage)); + } else { + crawler.setStorage(fileStorage); + } + crawlers.add(crawler); + Logger.info("已注册爬虫: " + crawler.getName()); + } + + public void runAll() { + Logger.info("开始运行所有爬虫,共 " + crawlers.size() + " 个"); + for (BaseCrawler crawler : crawlers) { + crawler.crawl(); + System.out.println(); + } + showStats(); + } + + public void runCrawler(String name) { + for (BaseCrawler crawler : crawlers) { + if (crawler.getName().equals(name)) { + crawler.crawl(); + showStats(); + return; + } + } + Logger.error("未找到爬虫: " + name); + } + + public void showStats() { + if (databaseStorage != null) { + StorageStats stats = databaseStorage.getStats(); + System.out.println("\n========== 数据库统计 =========="); + System.out.println("总记录数: " + stats.getTotalCount()); + System.out.println("数据源数量: " + stats.getSourceCount()); + System.out.println("================================\n"); + } + } + + public void showMenu() { + System.out.println("\n========== 爬虫管理系统 =========="); + System.out.println("1. 运行所有爬虫"); + System.out.println("2. 运行指定爬虫"); + System.out.println("3. 查看统计信息"); + System.out.println("4. 清空数据库"); + System.out.println("5. 退出"); + System.out.println("=================================="); + System.out.print("请选择操作: "); + } + + public void interactive() { + Scanner scanner = new Scanner(System.in); + + while (true) { + showMenu(); + String choice = scanner.nextLine().trim(); + + switch (choice) { + case "1": + runAll(); + break; + + case "2": + System.out.println("\n可用爬虫:"); + for (int i = 0; i < crawlers.size(); i++) { + System.out.println((i + 1) + ". " + crawlers.get(i).getName()); + } + System.out.print("请输入爬虫名称: "); + String crawlerName = scanner.nextLine().trim(); + runCrawler(crawlerName); + break; + + case "3": + showStats(); + break; + + case "4": + System.out.print("确定要清空所有数据吗?(yes/no): "); + String confirm = scanner.nextLine().trim(); + if ("yes".equalsIgnoreCase(confirm) && databaseStorage != null) { + databaseStorage.clearAll(); + } + break; + + case "5": + System.out.println("再见!"); + close(); + return; + + default: + System.out.println("无效选择,请重试"); + } + } + } + + public void close() { + if (databaseStorage != null) { + databaseStorage.close(); + } + } + + private static class MultiStorage implements DataStorage { + private DataStorage primary; + private DataStorage secondary; + + public MultiStorage(DataStorage primary, DataStorage secondary) { + this.primary = primary; + this.secondary = secondary; + } + + @Override + public void save(Movie movie) { + primary.save(movie); + if (secondary != null) secondary.save(movie); + } + + @Override + public void saveBatch(List movies) { + primary.saveBatch(movies); + if (secondary != null) secondary.saveBatch(movies); + } + + @Override + public List findAll() { + return primary.findAll(); + } + + @Override + public List findBySource(String source) { + return primary.findBySource(source); + } + + @Override + public List findByRankRange(int start, int end) { + return primary.findByRankRange(start, end); + } + + @Override + public void saveBook(Book book) { + primary.saveBook(book); + if (secondary != null) secondary.saveBook(book); + } + + @Override + public void saveBookBatch(List books) { + primary.saveBookBatch(books); + if (secondary != null) secondary.saveBookBatch(books); + } + + @Override + public List findAllBooks() { + return primary.findAllBooks(); + } + + @Override + public List findBooksBySource(String source) { + return primary.findBooksBySource(source); + } + + @Override + public void deleteBySource(String source) { + primary.deleteBySource(source); + } + + @Override + public void clearAll() { + primary.clearAll(); + } + + @Override + public StorageStats getStats() { + return primary.getStats(); + } + + @Override + public void close() { + primary.close(); + } + } + + public static void main(String[] args) { + CrawlerManager manager = new CrawlerManager(); + + if (args.length > 0 && args[0].equals("--auto")) { + manager.runAll(); + manager.close(); + } else { + manager.interactive(); + } + } +} diff --git a/project/src/main/java/model/Book.java b/project/src/main/java/model/Book.java new file mode 100644 index 0000000..09959e7 --- /dev/null +++ b/project/src/main/java/model/Book.java @@ -0,0 +1,86 @@ +package model; + +import java.time.LocalDateTime; + +public class Book { + private Integer id; + private String source; + private Integer rank; + private String title; + private String author; + private String publisher; + private String year; + private Double price; + private Double rating; + private Integer ratingCount; + private String category; + private String description; + private String url; + private String imageUrl; + private String isbn; + private LocalDateTime crawlTime; + + public Book() {} + + public Book(String source, Integer rank, String title, Double rating) { + this.source = source; + this.rank = rank; + this.title = title; + this.rating = rating; + this.crawlTime = LocalDateTime.now(); + } + + public Integer getId() { return id; } + public void setId(Integer id) { this.id = id; } + + public String getSource() { return source; } + public void setSource(String source) { this.source = source; } + + public Integer getRank() { return rank; } + public void setRank(Integer rank) { this.rank = rank; } + + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + + public String getAuthor() { return author; } + public void setAuthor(String author) { this.author = author; } + + public String getPublisher() { return publisher; } + public void setPublisher(String publisher) { this.publisher = publisher; } + + public String getYear() { return year; } + public void setYear(String year) { this.year = year; } + + public Double getPrice() { return price; } + public void setPrice(Double price) { this.price = price; } + + public Double getRating() { return rating; } + public void setRating(Double rating) { this.rating = rating; } + + public Integer getRatingCount() { return ratingCount; } + public void setRatingCount(Integer ratingCount) { this.ratingCount = ratingCount; } + + public String getCategory() { return category; } + public void setCategory(String category) { this.category = category; } + + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getImageUrl() { return imageUrl; } + public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } + + public String getIsbn() { return isbn; } + public void setIsbn(String isbn) { this.isbn = isbn; } + + public LocalDateTime getCrawlTime() { return crawlTime; } + public void setCrawlTime(LocalDateTime crawlTime) { this.crawlTime = crawlTime; } + + @Override + public String toString() { + return String.format("Book{source='%s', rank=%d, title='%s', rating=%.1f}", + source, rank, title, rating != null ? rating : 0.0); + } +} diff --git a/project/src/main/java/model/Movie.java b/project/src/main/java/model/Movie.java new file mode 100644 index 0000000..95aaa48 --- /dev/null +++ b/project/src/main/java/model/Movie.java @@ -0,0 +1,78 @@ +package model; + +import java.time.LocalDateTime; + +/** + * 电影数据模型类 + */ +public class Movie { + private Integer id; + private String source; // 数据来源网站 + private Integer rank; // 排名 + private String name; // 电影名称 + private String director; // 导演 + private String actors; // 演员 + private String year; // 年份 + private Double rating; // 评分 + private Integer ratingCount; // 评分人数 + private String description; // 简介 + private String url; // 详情链接 + private String imageUrl; // 海报图片 + private LocalDateTime crawlTime; // 爬取时间 + + public Movie() {} + + public Movie(String source, Integer rank, String name, Double rating) { + this.source = source; + this.rank = rank; + this.name = name; + this.rating = rating; + this.crawlTime = LocalDateTime.now(); + } + + // Getters and Setters + public Integer getId() { return id; } + public void setId(Integer id) { this.id = id; } + + public String getSource() { return source; } + public void setSource(String source) { this.source = source; } + + public Integer getRank() { return rank; } + public void setRank(Integer rank) { this.rank = rank; } + + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public String getDirector() { return director; } + public void setDirector(String director) { this.director = director; } + + public String getActors() { return actors; } + public void setActors(String actors) { this.actors = actors; } + + public String getYear() { return year; } + public void setYear(String year) { this.year = year; } + + public Double getRating() { return rating; } + public void setRating(Double rating) { this.rating = rating; } + + public Integer getRatingCount() { return ratingCount; } + public void setRatingCount(Integer ratingCount) { this.ratingCount = ratingCount; } + + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getImageUrl() { return imageUrl; } + public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } + + public LocalDateTime getCrawlTime() { return crawlTime; } + public void setCrawlTime(LocalDateTime crawlTime) { this.crawlTime = crawlTime; } + + @Override + public String toString() { + return String.format("Movie{source='%s', rank=%d, name='%s', rating=%.1f}", + source, rank, name, rating); + } +} diff --git a/project/src/main/java/storage/DataStorage.java b/project/src/main/java/storage/DataStorage.java new file mode 100644 index 0000000..7c9533f --- /dev/null +++ b/project/src/main/java/storage/DataStorage.java @@ -0,0 +1,34 @@ +package storage; + +import model.Movie; +import model.Book; +import java.util.List; + +public interface DataStorage { + + void save(Movie movie); + + void saveBatch(List movies); + + List findAll(); + + List findBySource(String source); + + List findByRankRange(int start, int end); + + void deleteBySource(String source); + + void clearAll(); + + StorageStats getStats(); + + void close(); + + void saveBook(model.Book book); + + void saveBookBatch(List books); + + List findAllBooks(); + + List findBooksBySource(String source); +} diff --git a/project/src/main/java/storage/FileStorage.java b/project/src/main/java/storage/FileStorage.java new file mode 100644 index 0000000..60a24f5 --- /dev/null +++ b/project/src/main/java/storage/FileStorage.java @@ -0,0 +1,237 @@ +package storage; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import model.Book; +import model.Movie; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +public class FileStorage implements DataStorage { + private static final Gson gson = new GsonBuilder() + .setPrettyPrinting() + .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter()) + .create(); + + private final String outputDir; + + public FileStorage() { + this("output"); + } + + public FileStorage(String outputDir) { + this.outputDir = outputDir; + File dir = new File(outputDir); + if (!dir.exists()) { + dir.mkdirs(); + } + } + + @Override + public void save(Movie movie) { + List list = new ArrayList<>(); + list.add(movie); + saveBatch(list); + } + + @Override + public void saveBatch(List movies) { + if (movies.isEmpty()) return; + + String source = movies.get(0).getSource(); + + saveMoviesAsJson(movies, source); + saveMoviesAsTxt(movies, source); + } + + private void saveMoviesAsJson(List movies, String source) { + String filename = outputDir + "/" + sanitizeFilename(source) + "_" + + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + ".json"; + + try (Writer writer = new OutputStreamWriter( + new FileOutputStream(filename), StandardCharsets.UTF_8)) { + gson.toJson(movies, writer); + System.out.println("JSON文件已保存: " + filename); + } catch (IOException e) { + System.err.println("保存JSON失败: " + e.getMessage()); + } + } + + private void saveMoviesAsTxt(List movies, String source) { + String filename = outputDir + "/" + sanitizeFilename(source) + "_" + + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + ".txt"; + + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( + new FileOutputStream(filename), StandardCharsets.UTF_8))) { + + writer.write("=========================================="); + writer.newLine(); + writer.write(" 数据来源: " + source); + writer.newLine(); + writer.write(" 爬取时间: " + LocalDateTime.now()); + writer.newLine(); + writer.write(" 电影数量: " + movies.size()); + writer.newLine(); + writer.write("=========================================="); + writer.newLine(); + writer.newLine(); + + for (Movie movie : movies) { + writer.write(String.format("排名: %d", movie.getRank())); + writer.newLine(); + writer.write(String.format("电影: %s", movie.getName())); + writer.newLine(); + writer.write(String.format("评分: %.1f", movie.getRating())); + writer.newLine(); + if (movie.getDirector() != null) { + writer.write(String.format("导演: %s", movie.getDirector())); + writer.newLine(); + } + if (movie.getYear() != null) { + writer.write(String.format("年份: %s", movie.getYear())); + writer.newLine(); + } + writer.write("------------------------------------------"); + writer.newLine(); + } + + System.out.println("TXT文件已保存: " + filename); + } catch (IOException e) { + System.err.println("保存TXT失败: " + e.getMessage()); + } + } + + @Override + public void saveBook(Book book) { + List list = new ArrayList<>(); + list.add(book); + saveBookBatch(list); + } + + @Override + public void saveBookBatch(List books) { + if (books.isEmpty()) return; + + String source = books.get(0).getSource(); + + saveBooksAsJson(books, source); + saveBooksAsTxt(books, source); + } + + private void saveBooksAsJson(List books, String source) { + String filename = outputDir + "/" + sanitizeFilename(source) + "_" + + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + ".json"; + + try (Writer writer = new OutputStreamWriter( + new FileOutputStream(filename), StandardCharsets.UTF_8)) { + gson.toJson(books, writer); + System.out.println("JSON文件已保存: " + filename); + } catch (IOException e) { + System.err.println("保存JSON失败: " + e.getMessage()); + } + } + + private void saveBooksAsTxt(List books, String source) { + String filename = outputDir + "/" + sanitizeFilename(source) + "_" + + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + ".txt"; + + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( + new FileOutputStream(filename), StandardCharsets.UTF_8))) { + + writer.write("=========================================="); + writer.newLine(); + writer.write(" 数据来源: " + source); + writer.newLine(); + writer.write(" 爬取时间: " + LocalDateTime.now()); + writer.newLine(); + writer.write(" 图书数量: " + books.size()); + writer.newLine(); + writer.write("=========================================="); + writer.newLine(); + writer.newLine(); + + for (Book book : books) { + if (book.getRank() != null) { + writer.write(String.format("排名: %d", book.getRank())); + writer.newLine(); + } + writer.write(String.format("书名: %s", book.getTitle())); + writer.newLine(); + if (book.getRating() != null) { + writer.write(String.format("评分: %.1f", book.getRating())); + writer.newLine(); + } + if (book.getAuthor() != null) { + writer.write(String.format("作者: %s", book.getAuthor())); + writer.newLine(); + } + if (book.getPublisher() != null) { + writer.write(String.format("出版社: %s", book.getPublisher())); + writer.newLine(); + } + if (book.getPrice() != null) { + writer.write(String.format("价格: %.2f", book.getPrice())); + writer.newLine(); + } + if (book.getYear() != null) { + writer.write(String.format("年份: %s", book.getYear())); + writer.newLine(); + } + writer.write("------------------------------------------"); + writer.newLine(); + } + + System.out.println("TXT文件已保存: " + filename); + } catch (IOException e) { + System.err.println("保存TXT失败: " + e.getMessage()); + } + } + + private String sanitizeFilename(String filename) { + return filename.replaceAll("[\\\\/:*?\"<>|]", "_"); + } + + @Override + public List findAll() { + return new ArrayList<>(); + } + + @Override + public List findBySource(String source) { + return new ArrayList<>(); + } + + @Override + public List findByRankRange(int start, int end) { + return new ArrayList<>(); + } + + @Override + public List findAllBooks() { + return new ArrayList<>(); + } + + @Override + public List findBooksBySource(String source) { + return new ArrayList<>(); + } + + @Override + public void deleteBySource(String source) {} + + @Override + public void clearAll() {} + + @Override + public StorageStats getStats() { + return new StorageStats(0, 0); + } + + @Override + public void close() {} +} diff --git a/project/src/main/java/storage/LocalDateTimeAdapter.java b/project/src/main/java/storage/LocalDateTimeAdapter.java new file mode 100644 index 0000000..9619ac9 --- /dev/null +++ b/project/src/main/java/storage/LocalDateTimeAdapter.java @@ -0,0 +1,25 @@ +package storage; + +import com.google.gson.*; + +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * Gson LocalDateTime 适配器 + */ +public class LocalDateTimeAdapter implements JsonSerializer, JsonDeserializer { + private static final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + + @Override + public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(formatter.format(src)); + } + + @Override + public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return LocalDateTime.parse(json.getAsString(), formatter); + } +} diff --git a/project/src/main/java/storage/SQLiteStorage.java b/project/src/main/java/storage/SQLiteStorage.java new file mode 100644 index 0000000..cfea335 --- /dev/null +++ b/project/src/main/java/storage/SQLiteStorage.java @@ -0,0 +1,414 @@ +package storage; + +import model.Book; +import model.Movie; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class SQLiteStorage implements DataStorage { + private static final String DB_URL = "jdbc:sqlite:crawler.db"; + private Connection connection; + + public SQLiteStorage() { + try { + connection = DriverManager.getConnection(DB_URL); + initTable(); + } catch (SQLException e) { + throw new RuntimeException("数据库连接失败: " + e.getMessage(), e); + } + } + + private void initTable() throws SQLException { + String movieSql = "CREATE TABLE IF NOT EXISTS movies (" + + "id INTEGER PRIMARY KEY AUTOINCREMENT," + + "source TEXT NOT NULL," + + "rank INTEGER," + + "name TEXT NOT NULL," + + "director TEXT," + + "actors TEXT," + + "year TEXT," + + "rating REAL," + + "rating_count INTEGER," + + "description TEXT," + + "url TEXT," + + "image_url TEXT," + + "crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP" + + ")"; + + String bookSql = "CREATE TABLE IF NOT EXISTS books (" + + "id INTEGER PRIMARY KEY AUTOINCREMENT," + + "source TEXT NOT NULL," + + "rank INTEGER," + + "title TEXT NOT NULL," + + "author TEXT," + + "publisher TEXT," + + "year TEXT," + + "price REAL," + + "rating REAL," + + "rating_count INTEGER," + + "category TEXT," + + "description TEXT," + + "url TEXT," + + "image_url TEXT," + + "isbn TEXT," + + "crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP" + + ")"; + + try (Statement stmt = connection.createStatement()) { + stmt.execute(movieSql); + stmt.execute(bookSql); + } + + String indexSql1 = "CREATE INDEX IF NOT EXISTS idx_movie_source ON movies(source)"; + String indexSql2 = "CREATE INDEX IF NOT EXISTS idx_book_source ON books(source)"; + try (Statement stmt = connection.createStatement()) { + stmt.execute(indexSql1); + stmt.execute(indexSql2); + } + } + + @Override + public void save(Movie movie) { + String sql = "INSERT INTO movies (source, rank, name, director, actors, year, " + + "rating, rating_count, description, url, image_url, crawl_time) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + try (PreparedStatement pstmt = connection.prepareStatement(sql)) { + pstmt.setString(1, movie.getSource()); + pstmt.setObject(2, movie.getRank()); + pstmt.setString(3, movie.getName()); + pstmt.setString(4, movie.getDirector()); + pstmt.setString(5, movie.getActors()); + pstmt.setString(6, movie.getYear()); + pstmt.setObject(7, movie.getRating()); + pstmt.setObject(8, movie.getRatingCount()); + pstmt.setString(9, movie.getDescription()); + pstmt.setString(10, movie.getUrl()); + pstmt.setString(11, movie.getImageUrl()); + pstmt.setTimestamp(12, movie.getCrawlTime() != null ? + Timestamp.valueOf(movie.getCrawlTime()) : null); + pstmt.executeUpdate(); + } catch (SQLException e) { + System.err.println("保存电影失败: " + movie.getName() + " - " + e.getMessage()); + } + } + + @Override + public void saveBatch(List movies) { + String sql = "INSERT INTO movies (source, rank, name, director, actors, year, " + + "rating, rating_count, description, url, image_url, crawl_time) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + try (PreparedStatement pstmt = connection.prepareStatement(sql)) { + connection.setAutoCommit(false); + + for (Movie movie : movies) { + pstmt.setString(1, movie.getSource()); + pstmt.setObject(2, movie.getRank()); + pstmt.setString(3, movie.getName()); + pstmt.setString(4, movie.getDirector()); + pstmt.setString(5, movie.getActors()); + pstmt.setString(6, movie.getYear()); + pstmt.setObject(7, movie.getRating()); + pstmt.setObject(8, movie.getRatingCount()); + pstmt.setString(9, movie.getDescription()); + pstmt.setString(10, movie.getUrl()); + pstmt.setString(11, movie.getImageUrl()); + pstmt.setTimestamp(12, movie.getCrawlTime() != null ? + Timestamp.valueOf(movie.getCrawlTime()) : null); + pstmt.addBatch(); + } + + pstmt.executeBatch(); + connection.commit(); + System.out.println("批量保存 " + movies.size() + " 条数据成功"); + } catch (SQLException e) { + try { + connection.rollback(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + System.err.println("批量保存失败: " + e.getMessage()); + } finally { + try { + connection.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public void saveBook(Book book) { + String sql = "INSERT INTO books (source, rank, title, author, publisher, year, " + + "price, rating, rating_count, category, description, url, image_url, isbn, crawl_time) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + try (PreparedStatement pstmt = connection.prepareStatement(sql)) { + pstmt.setString(1, book.getSource()); + pstmt.setObject(2, book.getRank()); + pstmt.setString(3, book.getTitle()); + pstmt.setString(4, book.getAuthor()); + pstmt.setString(5, book.getPublisher()); + pstmt.setString(6, book.getYear()); + pstmt.setObject(7, book.getPrice()); + pstmt.setObject(8, book.getRating()); + pstmt.setObject(9, book.getRatingCount()); + pstmt.setString(10, book.getCategory()); + pstmt.setString(11, book.getDescription()); + pstmt.setString(12, book.getUrl()); + pstmt.setString(13, book.getImageUrl()); + pstmt.setString(14, book.getIsbn()); + pstmt.setTimestamp(15, book.getCrawlTime() != null ? + Timestamp.valueOf(book.getCrawlTime()) : null); + pstmt.executeUpdate(); + } catch (SQLException e) { + System.err.println("保存图书失败: " + book.getTitle() + " - " + e.getMessage()); + } + } + + @Override + public void saveBookBatch(List books) { + String sql = "INSERT INTO books (source, rank, title, author, publisher, year, " + + "price, rating, rating_count, category, description, url, image_url, isbn, crawl_time) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + try (PreparedStatement pstmt = connection.prepareStatement(sql)) { + connection.setAutoCommit(false); + + for (Book book : books) { + pstmt.setString(1, book.getSource()); + pstmt.setObject(2, book.getRank()); + pstmt.setString(3, book.getTitle()); + pstmt.setString(4, book.getAuthor()); + pstmt.setString(5, book.getPublisher()); + pstmt.setString(6, book.getYear()); + pstmt.setObject(7, book.getPrice()); + pstmt.setObject(8, book.getRating()); + pstmt.setObject(9, book.getRatingCount()); + pstmt.setString(10, book.getCategory()); + pstmt.setString(11, book.getDescription()); + pstmt.setString(12, book.getUrl()); + pstmt.setString(13, book.getImageUrl()); + pstmt.setString(14, book.getIsbn()); + pstmt.setTimestamp(15, book.getCrawlTime() != null ? + Timestamp.valueOf(book.getCrawlTime()) : null); + pstmt.addBatch(); + } + + pstmt.executeBatch(); + connection.commit(); + System.out.println("批量保存 " + books.size() + " 条图书数据成功"); + } catch (SQLException e) { + try { + connection.rollback(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + System.err.println("批量保存图书失败: " + e.getMessage()); + } finally { + try { + connection.setAutoCommit(true); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public List findAll() { + List movies = new ArrayList<>(); + String sql = "SELECT * FROM movies ORDER BY source, rank"; + + try (Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + while (rs.next()) { + movies.add(mapResultSetToMovie(rs)); + } + } catch (SQLException e) { + System.err.println("查询失败: " + e.getMessage()); + } + return movies; + } + + @Override + public List findBySource(String source) { + List movies = new ArrayList<>(); + String sql = "SELECT * FROM movies WHERE source = ? ORDER BY rank"; + + try (PreparedStatement pstmt = connection.prepareStatement(sql)) { + pstmt.setString(1, source); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + movies.add(mapResultSetToMovie(rs)); + } + } catch (SQLException e) { + System.err.println("查询失败: " + e.getMessage()); + } + return movies; + } + + @Override + public List findByRankRange(int start, int end) { + List movies = new ArrayList<>(); + String sql = "SELECT * FROM movies WHERE rank BETWEEN ? AND ? ORDER BY rank"; + + try (PreparedStatement pstmt = connection.prepareStatement(sql)) { + pstmt.setInt(1, start); + pstmt.setInt(2, end); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + movies.add(mapResultSetToMovie(rs)); + } + } catch (SQLException e) { + System.err.println("查询失败: " + e.getMessage()); + } + return movies; + } + + @Override + public List findAllBooks() { + List books = new ArrayList<>(); + String sql = "SELECT * FROM books ORDER BY source, rank"; + + try (Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + while (rs.next()) { + books.add(mapResultSetToBook(rs)); + } + } catch (SQLException e) { + System.err.println("查询失败: " + e.getMessage()); + } + return books; + } + + @Override + public List findBooksBySource(String source) { + List books = new ArrayList<>(); + String sql = "SELECT * FROM books WHERE source = ? ORDER BY rank"; + + try (PreparedStatement pstmt = connection.prepareStatement(sql)) { + pstmt.setString(1, source); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + books.add(mapResultSetToBook(rs)); + } + } catch (SQLException e) { + System.err.println("查询失败: " + e.getMessage()); + } + return books; + } + + @Override + public void deleteBySource(String source) { + String sql1 = "DELETE FROM movies WHERE source = ?"; + String sql2 = "DELETE FROM books WHERE source = ?"; + try (PreparedStatement pstmt1 = connection.prepareStatement(sql1); + PreparedStatement pstmt2 = connection.prepareStatement(sql2)) { + pstmt1.setString(1, source); + pstmt2.setString(1, source); + int count1 = pstmt1.executeUpdate(); + int count2 = pstmt2.executeUpdate(); + System.out.println("删除 " + source + " 的 " + (count1 + count2) + " 条数据"); + } catch (SQLException e) { + System.err.println("删除失败: " + e.getMessage()); + } + } + + @Override + public void clearAll() { + try (Statement stmt = connection.createStatement()) { + stmt.execute("DELETE FROM movies"); + stmt.execute("DELETE FROM books"); + System.out.println("清空所有数据"); + } catch (SQLException e) { + System.err.println("清空失败: " + e.getMessage()); + } + } + + @Override + public StorageStats getStats() { + int totalCount = 0; + int sourceCount = 0; + + try (Statement stmt = connection.createStatement()) { + ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM movies"); + if (rs.next()) { + totalCount = rs.getInt(1); + } + rs = stmt.executeQuery("SELECT COUNT(*) FROM books"); + if (rs.next()) { + totalCount += rs.getInt(1); + } + rs = stmt.executeQuery("SELECT COUNT(DISTINCT source) FROM movies"); + if (rs.next()) { + sourceCount = rs.getInt(1); + } + rs = stmt.executeQuery("SELECT COUNT(DISTINCT source) FROM books"); + if (rs.next()) { + sourceCount += rs.getInt(1); + } + } catch (SQLException e) { + System.err.println("统计失败: " + e.getMessage()); + } + return new StorageStats(totalCount, sourceCount); + } + + @Override + public void close() { + try { + if (connection != null && !connection.isClosed()) { + connection.close(); + } + } catch (SQLException e) { + System.err.println("关闭连接失败: " + e.getMessage()); + } + } + + private Movie mapResultSetToMovie(ResultSet rs) throws SQLException { + Movie movie = new Movie(); + movie.setId(rs.getInt("id")); + movie.setSource(rs.getString("source")); + movie.setRank(rs.getInt("rank")); + movie.setName(rs.getString("name")); + movie.setDirector(rs.getString("director")); + movie.setActors(rs.getString("actors")); + movie.setYear(rs.getString("year")); + movie.setRating(rs.getDouble("rating")); + movie.setRatingCount(rs.getInt("rating_count")); + movie.setDescription(rs.getString("description")); + movie.setUrl(rs.getString("url")); + movie.setImageUrl(rs.getString("image_url")); + Timestamp ts = rs.getTimestamp("crawl_time"); + if (ts != null) { + movie.setCrawlTime(ts.toLocalDateTime()); + } + return movie; + } + + private Book mapResultSetToBook(ResultSet rs) throws SQLException { + Book book = new Book(); + book.setId(rs.getInt("id")); + book.setSource(rs.getString("source")); + book.setRank(rs.getInt("rank")); + book.setTitle(rs.getString("title")); + book.setAuthor(rs.getString("author")); + book.setPublisher(rs.getString("publisher")); + book.setYear(rs.getString("year")); + book.setPrice(rs.getDouble("price")); + book.setRating(rs.getDouble("rating")); + book.setRatingCount(rs.getInt("rating_count")); + book.setCategory(rs.getString("category")); + book.setDescription(rs.getString("description")); + book.setUrl(rs.getString("url")); + book.setImageUrl(rs.getString("image_url")); + book.setIsbn(rs.getString("isbn")); + Timestamp ts = rs.getTimestamp("crawl_time"); + if (ts != null) { + book.setCrawlTime(ts.toLocalDateTime()); + } + return book; + } +} diff --git a/project/src/main/java/storage/StorageStats.java b/project/src/main/java/storage/StorageStats.java new file mode 100644 index 0000000..878d58d --- /dev/null +++ b/project/src/main/java/storage/StorageStats.java @@ -0,0 +1,23 @@ +package storage; + +/** + * 存储统计信息 + */ +public class StorageStats { + private int totalCount; + private int sourceCount; + + public StorageStats(int totalCount, int sourceCount) { + this.totalCount = totalCount; + this.sourceCount = sourceCount; + } + + public int getTotalCount() { return totalCount; } + public int getSourceCount() { return sourceCount; } + + @Override + public String toString() { + return String.format("StorageStats{totalCount=%d, sourceCount=%d}", + totalCount, sourceCount); + } +} diff --git a/project/src/main/java/strategy/AbstractBookCrawlerStrategy.java b/project/src/main/java/strategy/AbstractBookCrawlerStrategy.java new file mode 100644 index 0000000..403cdf7 --- /dev/null +++ b/project/src/main/java/strategy/AbstractBookCrawlerStrategy.java @@ -0,0 +1,115 @@ +package strategy; + +import exception.CrawlerResult; +import exception.NetworkException; +import exception.ParseException; +import model.Book; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import storage.DataStorage; +import util.Logger; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractBookCrawlerStrategy implements BookCrawlerStrategy { + protected DataStorage storage; + protected int delayMs = 1500; + + @Override + public void setStorage(DataStorage storage) { + this.storage = storage; + } + + @Override + public int getDelayMs() { + return delayMs; + } + + protected Document fetchDocument(String url) throws IOException { + return Jsoup.connect(url) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .timeout(15000) + .get(); + } + + protected void delay() { + try { + Thread.sleep(delayMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + @Override + public CrawlerResult execute() { + long startTime = System.currentTimeMillis(); + String sourceName = getName(); + List allBooks = new ArrayList<>(); + + try { + List urls = getPageUrls(); + Logger.info(String.format("[%s] 开始爬取,共 %d 个页面", sourceName, urls.size())); + + for (int i = 0; i < urls.size(); i++) { + String url = urls.get(i); + Logger.info(String.format("[%s] 爬取第 %d/%d 页: %s", sourceName, i + 1, urls.size(), url)); + + try { + Document doc = fetchDocument(url); + List books = parseBooks(doc.html()); + + for (Book book : books) { + book.setSource(sourceName); + } + + allBooks.addAll(books); + Logger.info(String.format("[%s] 第 %d 页获取 %d 条数据", sourceName, i + 1, books.size())); + + } catch (IOException e) { + Logger.error(String.format("[%s] 网络请求失败: %s", sourceName, url), e); + throw new NetworkException("网络请求失败: " + url, sourceName, e); + } catch (Exception e) { + Logger.error(String.format("[%s] 解析页面失败: %s", sourceName, url), e); + throw new ParseException("解析页面失败: " + url, sourceName, e); + } + + if (i < urls.size() - 1) { + delay(); + } + } + + if (storage != null && !allBooks.isEmpty()) { + storage.saveBookBatch(allBooks); + Logger.info(String.format("[%s] 数据已保存到存储", sourceName)); + } + + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.success(sourceName) + .message("爬取成功") + .dataCount(allBooks.size()) + .elapsedTime(elapsedTime) + .build(); + + } catch (NetworkException e) { + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.failure(sourceName, "NETWORK_ERROR", e.getMessage()) + .elapsedTime(elapsedTime) + .build(); + } catch (ParseException e) { + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.failure(sourceName, "PARSE_ERROR", e.getMessage()) + .elapsedTime(elapsedTime) + .build(); + } catch (Exception e) { + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.failure(sourceName, "UNKNOWN_ERROR", e.getMessage()) + .elapsedTime(elapsedTime) + .build(); + } + } +} diff --git a/project/src/main/java/strategy/AbstractCrawlerStrategy.java b/project/src/main/java/strategy/AbstractCrawlerStrategy.java new file mode 100644 index 0000000..febc0c4 --- /dev/null +++ b/project/src/main/java/strategy/AbstractCrawlerStrategy.java @@ -0,0 +1,114 @@ +package strategy; + +import exception.CrawlerResult; +import exception.NetworkException; +import exception.ParseException; +import model.Movie; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import storage.DataStorage; +import util.Logger; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractCrawlerStrategy implements CrawlerStrategy { + protected DataStorage storage; + protected int delayMs = 1500; + + public void setStorage(DataStorage storage) { + this.storage = storage; + } + + @Override + public int getDelayMs() { + return delayMs; + } + + protected Document fetchDocument(String url) throws IOException { + return Jsoup.connect(url) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .timeout(15000) + .get(); + } + + protected void delay() { + try { + Thread.sleep(delayMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + @Override + public CrawlerResult execute() { + long startTime = System.currentTimeMillis(); + String sourceName = getName(); + List allMovies = new ArrayList<>(); + + try { + List urls = getPageUrls(); + Logger.info(String.format("[%s] 开始爬取,共 %d 个页面", sourceName, urls.size())); + + for (int i = 0; i < urls.size(); i++) { + String url = urls.get(i); + Logger.info(String.format("[%s] 爬取第 %d/%d 页: %s", sourceName, i + 1, urls.size(), url)); + + try { + Document doc = fetchDocument(url); + List movies = parseMovies(doc.html()); + + for (Movie movie : movies) { + movie.setSource(sourceName); + } + + allMovies.addAll(movies); + Logger.info(String.format("[%s] 第 %d 页获取 %d 条数据", sourceName, i + 1, movies.size())); + + } catch (IOException e) { + Logger.error(String.format("[%s] 网络请求失败: %s", sourceName, url), e); + throw new NetworkException("网络请求失败: " + url, sourceName, e); + } catch (Exception e) { + Logger.error(String.format("[%s] 解析页面失败: %s", sourceName, url), e); + throw new ParseException("解析页面失败: " + url, sourceName, e); + } + + if (i < urls.size() - 1) { + delay(); + } + } + + if (storage != null && !allMovies.isEmpty()) { + storage.saveBatch(allMovies); + Logger.info(String.format("[%s] 数据已保存到存储", sourceName)); + } + + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.success(sourceName) + .message("爬取成功") + .dataCount(allMovies.size()) + .elapsedTime(elapsedTime) + .build(); + + } catch (NetworkException e) { + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.failure(sourceName, "NETWORK_ERROR", e.getMessage()) + .elapsedTime(elapsedTime) + .build(); + } catch (ParseException e) { + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.failure(sourceName, "PARSE_ERROR", e.getMessage()) + .elapsedTime(elapsedTime) + .build(); + } catch (Exception e) { + long elapsedTime = System.currentTimeMillis() - startTime; + return CrawlerResult.failure(sourceName, "UNKNOWN_ERROR", e.getMessage()) + .elapsedTime(elapsedTime) + .build(); + } + } +} \ No newline at end of file diff --git a/project/src/main/java/strategy/BookCrawlerStrategy.java b/project/src/main/java/strategy/BookCrawlerStrategy.java new file mode 100644 index 0000000..3947808 --- /dev/null +++ b/project/src/main/java/strategy/BookCrawlerStrategy.java @@ -0,0 +1,15 @@ +package strategy; + +import exception.CrawlerResult; +import storage.DataStorage; +import java.util.List; + +public interface BookCrawlerStrategy { + String getName(); + String getBaseUrl(); + List getPageUrls(); + List parseBooks(String htmlContent); + CrawlerResult execute(); + int getDelayMs(); + void setStorage(DataStorage storage); +} diff --git a/project/src/main/java/strategy/CrawlerStrategy.java b/project/src/main/java/strategy/CrawlerStrategy.java new file mode 100644 index 0000000..e76baa6 --- /dev/null +++ b/project/src/main/java/strategy/CrawlerStrategy.java @@ -0,0 +1,16 @@ +package strategy; + +import exception.CrawlerResult; +import model.Movie; +import storage.DataStorage; +import java.util.List; + +public interface CrawlerStrategy { + String getName(); + String getBaseUrl(); + List getPageUrls(); + List parseMovies(String htmlContent); + CrawlerResult execute(); + int getDelayMs(); + void setStorage(DataStorage storage); +} \ No newline at end of file diff --git a/project/src/main/java/strategy/impl/BooksToScrapeStrategy.java b/project/src/main/java/strategy/impl/BooksToScrapeStrategy.java new file mode 100644 index 0000000..0c23fa7 --- /dev/null +++ b/project/src/main/java/strategy/impl/BooksToScrapeStrategy.java @@ -0,0 +1,116 @@ +package strategy.impl; + +import model.Book; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import strategy.AbstractBookCrawlerStrategy; + +import java.util.ArrayList; +import java.util.List; + +public class BooksToScrapeStrategy extends AbstractBookCrawlerStrategy { + private static final String NAME = "BooksToScrape"; + private static final String BASE_URL = "https://books.toscrape.com"; + + public BooksToScrapeStrategy() { + this.delayMs = 1000; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public List getPageUrls() { + List urls = new ArrayList<>(); + urls.add(BASE_URL); + for (int i = 2; i <= 50; i++) { + urls.add(BASE_URL + "/catalogue/page-" + i + ".html"); + } + return urls; + } + + @Override + public List parseBooks(String htmlContent) { + List books = new ArrayList<>(); + Document doc = Jsoup.parse(htmlContent); + Elements items = doc.select("article.product_pod"); + + int rank = 1; + for (Element item : items) { + try { + Book book = new Book(); + + Element titleElement = item.select("h3 a").first(); + if (titleElement != null) { + book.setTitle(titleElement.attr("title")); + String href = titleElement.attr("href"); + if (href.startsWith("../")) { + book.setUrl(BASE_URL + "/catalogue/" + href.substring(3)); + } else { + book.setUrl(BASE_URL + "/" + href); + } + } + + Element priceElement = item.select("p.price_color").first(); + if (priceElement != null) { + String priceStr = priceElement.text().replace("£", "").replace("Â", "").trim(); + try { + book.setPrice(Double.parseDouble(priceStr)); + } catch (NumberFormatException e) { + // ignore + } + } + + Element ratingElement = item.select("p.star-rating").first(); + if (ratingElement != null) { + String ratingClass = ratingElement.className(); + int rating = parseRating(ratingClass); + book.setRating((double) rating); + } + + Element imgElement = item.select("img").first(); + if (imgElement != null) { + String src = imgElement.attr("src"); + if (src.startsWith("../")) { + book.setImageUrl(BASE_URL + "/" + src.substring(3)); + } else { + book.setImageUrl(BASE_URL + "/" + src); + } + } + + Element availabilityElement = item.select("p.instock.availability").first(); + if (availabilityElement != null) { + String availability = availabilityElement.text().trim(); + } + + book.setRank(rank++); + + if (book.getTitle() != null && !book.getTitle().isEmpty()) { + books.add(book); + } + } catch (Exception e) { + // skip invalid item + } + } + + return books; + } + + private int parseRating(String ratingClass) { + if (ratingClass.contains("One")) return 1; + if (ratingClass.contains("Two")) return 2; + if (ratingClass.contains("Three")) return 3; + if (ratingClass.contains("Four")) return 4; + if (ratingClass.contains("Five")) return 5; + return 0; + } +} diff --git a/project/src/main/java/strategy/impl/DoubanBookStrategy.java b/project/src/main/java/strategy/impl/DoubanBookStrategy.java new file mode 100644 index 0000000..1bb2b13 --- /dev/null +++ b/project/src/main/java/strategy/impl/DoubanBookStrategy.java @@ -0,0 +1,159 @@ +package strategy.impl; + +import model.Book; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import strategy.AbstractBookCrawlerStrategy; + +import java.util.ArrayList; +import java.util.List; + +public class DoubanBookStrategy extends AbstractBookCrawlerStrategy { + private static final String NAME = "豆瓣读书Top250"; + private static final String BASE_URL = "https://book.douban.com/top250"; + + public DoubanBookStrategy() { + this.delayMs = 2000; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public List getPageUrls() { + List urls = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + urls.add(BASE_URL + "?start=" + (i * 25)); + } + return urls; + } + + @Override + public List parseBooks(String htmlContent) { + List books = new ArrayList<>(); + Document doc = Jsoup.parse(htmlContent); + Elements items = doc.select("tr.item"); + + for (Element item : items) { + try { + Book book = new Book(); + + Element indent = item.select("td.indent").first(); + if (indent != null) { + String rankStr = indent.select("div.starcount").text(); + if (!rankStr.isEmpty()) { + book.setRank(parseNumber(rankStr)); + } + } + + if (book.getRank() == null) { + Element order = item.select("div.starcount").first(); + if (order != null) { + book.setRank(parseNumber(order.text())); + } + } + + Element titleElement = item.select("div.pl2 a").first(); + if (titleElement != null) { + String title = titleElement.attr("title"); + if (title.isEmpty()) { + title = titleElement.text().split("\\s")[0]; + } + book.setTitle(title.trim()); + book.setUrl(titleElement.attr("href")); + } + + Element ratingElement = item.select("span.rating_nums").first(); + if (ratingElement != null) { + String ratingStr = ratingElement.text(); + if (!ratingStr.isEmpty()) { + book.setRating(Double.parseDouble(ratingStr)); + } + } + + Element countElement = item.select("span.pl").first(); + if (countElement != null) { + String countText = countElement.text(); + if (countText.contains("人评价")) { + String num = countText.replace("人评价", "").replace("(", "").replace(")", "").trim(); + book.setRatingCount(parseNumber(num)); + } + } + + Element infoElement = item.select("p.pl").first(); + if (infoElement != null) { + String info = infoElement.text(); + parseBookInfo(book, info); + } + + Element imgElement = item.select("img").first(); + if (imgElement != null) { + book.setImageUrl(imgElement.attr("src")); + } + + if (book.getTitle() != null && !book.getTitle().isEmpty()) { + books.add(book); + } + } catch (Exception e) { + // skip invalid item + } + } + + return books; + } + + private void parseBookInfo(Book book, String info) { + String[] parts = info.split(" / "); + for (int i = 0; i < parts.length; i++) { + String part = parts[i].trim(); + + if (i == 0 && !part.matches("\\d{4}.*") && !part.matches(".*\\d+\\.\\d+.*")) { + book.setAuthor(part); + } + + if (part.matches("\\d{4}")) { + book.setYear(part); + } + + if (part.contains("出版社")) { + book.setPublisher(part.replace("出版社", "").trim()); + } + + if (part.matches(".*\\d+\\.\\d+元")) { + String priceStr = part.replace("元", "").trim(); + try { + book.setPrice(Double.parseDouble(priceStr)); + } catch (NumberFormatException e) { + // ignore + } + } + + if (part.matches("ISBN.*")) { + book.setIsbn(part.replace("ISBN", "").trim()); + } + } + } + + private Integer parseNumber(String str) { + try { + if (str == null || str.isEmpty()) return null; + str = str.replaceAll("[^0-9.]", ""); + if (str.isEmpty()) return null; + if (str.contains(".")) { + return (int) Double.parseDouble(str); + } + return Integer.parseInt(str); + } catch (NumberFormatException e) { + return null; + } + } +} diff --git a/project/src/main/java/strategy/impl/DoubanStrategy.java b/project/src/main/java/strategy/impl/DoubanStrategy.java new file mode 100644 index 0000000..4c130db --- /dev/null +++ b/project/src/main/java/strategy/impl/DoubanStrategy.java @@ -0,0 +1,111 @@ +package strategy.impl; + +import model.Movie; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import strategy.AbstractCrawlerStrategy; + +import java.util.ArrayList; +import java.util.List; + +public class DoubanStrategy extends AbstractCrawlerStrategy { + private static final String NAME = "豆瓣电影Top250"; + private static final String BASE_URL = "https://movie.douban.com/top250"; + + public DoubanStrategy() { + this.delayMs = 1500; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public List getPageUrls() { + List urls = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + urls.add(BASE_URL + "?start=" + (i * 25)); + } + return urls; + } + + @Override + public List parseMovies(String htmlContent) { + List movies = new ArrayList<>(); + Document doc = Jsoup.parse(htmlContent); + Elements items = doc.select("div.item"); + + for (Element item : items) { + try { + Movie movie = new Movie(); + + String rankStr = item.select("em").text(); + movie.setRank(Integer.parseInt(rankStr)); + + Element titleElement = item.select("span.title").first(); + if (titleElement != null) { + movie.setName(titleElement.text()); + } + + String ratingStr = item.select("span.rating_num").text(); + if (!ratingStr.isEmpty()) { + movie.setRating(Double.parseDouble(ratingStr)); + } + + String ratingCountStr = item.select("div.star span").last().text(); + if (ratingCountStr != null && ratingCountStr.contains("人评价")) { + String num = ratingCountStr.replace("人评价", "").trim(); + movie.setRatingCount(parseNumber(num)); + } + + String info = item.select("div.bd p").first().text(); + if (info != null) { + String[] parts = info.split(" / "); + if (parts.length > 0) { + String firstPart = parts[0]; + if (firstPart.contains("导演: ")) { + movie.setDirector(firstPart.replace("导演: ", "").trim()); + } + for (String part : parts) { + if (part.matches("\\d{4}") || part.matches("\\d{4}.*")) { + movie.setYear(part.trim().split("\\s+")[0]); + break; + } + } + } + } + + String link = item.select("div.hd a").attr("href"); + movie.setUrl(link); + + String imgUrl = item.select("div.pic img").attr("src"); + movie.setImageUrl(imgUrl); + + movies.add(movie); + } catch (Exception e) { + // skip invalid item + } + } + + return movies; + } + + private Integer parseNumber(String str) { + try { + if (str.contains("万")) { + return (int) (Double.parseDouble(str.replace("万", "")) * 10000); + } + return Integer.parseInt(str.replace(",", "")); + } catch (NumberFormatException e) { + return null; + } + } +} \ No newline at end of file diff --git a/project/src/main/java/strategy/impl/MaoyanStrategy.java b/project/src/main/java/strategy/impl/MaoyanStrategy.java new file mode 100644 index 0000000..85f046d --- /dev/null +++ b/project/src/main/java/strategy/impl/MaoyanStrategy.java @@ -0,0 +1,94 @@ +package strategy.impl; + +import model.Movie; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import strategy.AbstractCrawlerStrategy; + +import java.util.ArrayList; +import java.util.List; + +public class MaoyanStrategy extends AbstractCrawlerStrategy { + private static final String NAME = "猫眼电影Top100"; + private static final String BASE_URL = "https://maoyan.com/board/4"; + + public MaoyanStrategy() { + this.delayMs = 1500; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public List getPageUrls() { + List urls = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + urls.add(BASE_URL + "?offset=" + (i * 10)); + } + return urls; + } + + @Override + public List parseMovies(String htmlContent) { + List movies = new ArrayList<>(); + Document doc = Jsoup.parse(htmlContent); + Elements items = doc.select("dl.board-wrapper dd"); + + for (Element item : items) { + try { + Movie movie = new Movie(); + + String rankStr = item.select("i.board-index").text(); + movie.setRank(Integer.parseInt(rankStr)); + + String name = item.select("p.name a").text(); + movie.setName(name); + + String ratingStr = item.select("i.integer").text() + + item.select("i.fraction").text(); + if (!ratingStr.isEmpty()) { + movie.setRating(Double.parseDouble(ratingStr)); + } + + String actors = item.select("p.star").text(); + if (actors != null && actors.contains("主演:")) { + movie.setActors(actors.replace("主演:", "").trim()); + } + + String releaseTime = item.select("p.releasetime").text(); + if (releaseTime != null && releaseTime.contains("上映时间:")) { + String timeStr = releaseTime.replace("上映时间:", "").trim(); + if (timeStr.matches("\\d{4}.*")) { + movie.setYear(timeStr.substring(0, 4)); + } + } + + String link = item.select("p.name a").attr("href"); + if (!link.isEmpty()) { + movie.setUrl("https://maoyan.com" + link); + } + + String imgUrl = item.select("img.board-img").attr("data-src"); + if (imgUrl.isEmpty()) { + imgUrl = item.select("img.board-img").attr("src"); + } + movie.setImageUrl(imgUrl); + + movies.add(movie); + } catch (Exception e) { + // skip invalid item + } + } + + return movies; + } +} \ No newline at end of file diff --git a/project/src/main/java/strategy/impl/RottenTomatoesStrategy.java b/project/src/main/java/strategy/impl/RottenTomatoesStrategy.java new file mode 100644 index 0000000..0951971 --- /dev/null +++ b/project/src/main/java/strategy/impl/RottenTomatoesStrategy.java @@ -0,0 +1,105 @@ +package strategy.impl; + +import model.Movie; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import strategy.AbstractCrawlerStrategy; + +import java.util.ArrayList; +import java.util.List; + +public class RottenTomatoesStrategy extends AbstractCrawlerStrategy { + private static final String NAME = "烂番茄Top100"; + private static final String BASE_URL = "https://www.rottentomatoes.com/top/bestofrt/"; + + public RottenTomatoesStrategy() { + this.delayMs = 2000; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getBaseUrl() { + return BASE_URL; + } + + @Override + public List getPageUrls() { + List urls = new ArrayList<>(); + urls.add(BASE_URL); + return urls; + } + + @Override + public List parseMovies(String htmlContent) { + List movies = new ArrayList<>(); + Document doc = Jsoup.parse(htmlContent); + Elements items = doc.select("table.table tr"); + + int rank = 0; + for (Element item : items) { + try { + Element rankElement = item.selectFirst("td.rank"); + if (rankElement == null) continue; + + Movie movie = new Movie(); + + String rankStr = rankElement.text(); + if (!rankStr.isEmpty()) { + movie.setRank(Integer.parseInt(rankStr)); + } else { + movie.setRank(++rank); + } + + Element titleElement = item.selectFirst("td.title a"); + if (titleElement != null) { + String fullTitle = titleElement.text(); + if (fullTitle.contains("(") && fullTitle.contains(")")) { + int start = fullTitle.lastIndexOf("("); + int end = fullTitle.lastIndexOf(")"); + if (start > 0 && end > start) { + String yearStr = fullTitle.substring(start + 1, end); + if (yearStr.matches("\\d{4}")) { + movie.setYear(yearStr); + } + movie.setName(fullTitle.substring(0, start).trim()); + } else { + movie.setName(fullTitle); + } + } else { + movie.setName(fullTitle); + } + + String link = titleElement.attr("href"); + if (!link.isEmpty()) { + if (link.startsWith("/")) { + movie.setUrl("https://www.rottentomatoes.com" + link); + } else { + movie.setUrl(link); + } + } + } + + Element scoreElement = item.selectFirst("td.score span.tMeterScore"); + if (scoreElement != null) { + String scoreStr = scoreElement.text(); + if (scoreStr.matches("\\d+%")) { + double rating = Double.parseDouble(scoreStr.replace("%", "")) / 10; + movie.setRating(Math.round(rating * 10) / 10.0); + } + } + + movies.add(movie); + } catch (Exception e) { + // skip invalid item + } + } + + return movies; + } +} \ No newline at end of file diff --git a/project/src/main/java/util/Logger.java b/project/src/main/java/util/Logger.java new file mode 100644 index 0000000..2702bc3 --- /dev/null +++ b/project/src/main/java/util/Logger.java @@ -0,0 +1,54 @@ +package util; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * 简单日志工具类 + */ +public class Logger { + private static final DateTimeFormatter formatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public enum Level { + DEBUG, INFO, WARN, ERROR + } + + private static Level currentLevel = Level.INFO; + + public static void setLevel(Level level) { + currentLevel = level; + } + + private static void log(Level level, String message) { + if (level.ordinal() >= currentLevel.ordinal()) { + String timestamp = LocalDateTime.now().format(formatter); + String threadName = Thread.currentThread().getName(); + System.out.printf("[%s] [%s] [%s] %s%n", + timestamp, level, threadName, message); + } + } + + public static void debug(String message) { + log(Level.DEBUG, message); + } + + public static void info(String message) { + log(Level.INFO, message); + } + + public static void warn(String message) { + log(Level.WARN, message); + } + + public static void error(String message) { + log(Level.ERROR, message); + } + + public static void error(String message, Throwable e) { + log(Level.ERROR, message + " - " + e.getMessage()); + if (currentLevel == Level.DEBUG) { + e.printStackTrace(); + } + } +} diff --git a/project/src/main/java/view/CrawlerView.java b/project/src/main/java/view/CrawlerView.java new file mode 100644 index 0000000..986880f --- /dev/null +++ b/project/src/main/java/view/CrawlerView.java @@ -0,0 +1,109 @@ +package view; + +import exception.CrawlerResult; +import java.util.List; + +public class CrawlerView { + + public void showWelcome() { + System.out.println(); + System.out.println("╔════════════════════════════════════════════════╗"); + System.out.println("║ Java 爬虫管理系统 v3.0 (电影+图书) ║"); + System.out.println("╚════════════════════════════════════════════════╝"); + System.out.println(); + } + + public void showHelp() { + System.out.println(); + System.out.println("═══════════════ 使用帮助 ═══════════════"); + System.out.println(" java -jar crawler.jar <命令> [参数]"); + System.out.println(); + System.out.println("可用命令:"); + System.out.println(" list - 列出所有爬虫"); + System.out.println(" run <爬虫名> - 运行指定爬虫"); + System.out.println(" run-all - 运行所有爬虫"); + System.out.println(" stats - 显示统计信息"); + System.out.println(" clear - 清空所有数据"); + System.out.println(" help - 显示帮助信息"); + System.out.println(); + System.out.println("电影爬虫:"); + System.out.println(" - 豆瓣电影Top250"); + System.out.println(" - 猫眼电影Top100"); + System.out.println(" - RottenTomatoes"); + System.out.println(); + System.out.println("图书爬虫:"); + System.out.println(" - 豆瓣读书Top250"); + System.out.println(" - BooksToScrape"); + System.out.println(); + System.out.println("示例:"); + System.out.println(" java -jar crawler.jar list"); + System.out.println(" java -jar crawler.jar run 豆瓣电影Top250"); + System.out.println(" java -jar crawler.jar run 豆瓣读书Top250"); + System.out.println(" java -jar crawler.jar run BooksToScrape"); + System.out.println(" java -jar crawler.jar run-all"); + System.out.println("═══════════════════════════════════════════"); + System.out.println(); + } + + public void showCrawlerList(List crawlers) { + System.out.println(); + System.out.println("═══════════════ 爬虫列表 ═══════════════"); + for (int i = 0; i < crawlers.size(); i++) { + System.out.println(" " + (i + 1) + ". " + crawlers.get(i)); + } + System.out.println("═══════════════════════════════════════════"); + System.out.println(); + } + + public void showResult(CrawlerResult result) { + System.out.println(); + if (result.isSuccess()) { + System.out.println("╔════════════════════════════════════════╗"); + System.out.printf("║ SUCCESS: %-30s ║%n", result.getSource()); + System.out.printf("║ 数据条数: %-28d ║%n", result.getDataCount()); + System.out.printf("║ 耗时: %-30dms ║%n", result.getElapsedTime()); + System.out.println("╚════════════════════════════════════════╝"); + } else { + System.out.println("╔════════════════════════════════════════╗"); + System.out.printf("║ FAILURE: [%s] %-20s ║%n", result.getErrorCode(), result.getSource()); + System.out.printf("║ 错误信息: %-28s ║%n", result.getMessage()); + System.out.println("╚════════════════════════════════════════╝"); + } + System.out.println(); + } + + public void showResults(List results) { + System.out.println(); + System.out.println("═══════════════ 执行结果 ═══════════════"); + + int successCount = 0; + int totalData = 0; + + for (CrawlerResult result : results) { + System.out.println(result.toString()); + if (result.isSuccess()) { + successCount++; + totalData += result.getDataCount(); + } + } + + System.out.println("─────────────────────────────────────────"); + System.out.printf(" 成功: %d/%d | 总数据: %d 条%n", + successCount, results.size(), totalData); + System.out.println("═══════════════════════════════════════════"); + System.out.println(); + } + + public void showError(String message) { + System.out.println(); + System.out.println("╔════════════════════════════════════════╗"); + System.out.println("║ 错误信息 ║"); + System.out.printf("║ %-36s ║%n", message); + System.out.println("╚════════════════════════════════════════╝"); + System.out.println(); + } + + public void showMessage(String message) { + System.out.println(message); + } +} diff --git a/project/src/test/TestMain.java/TestMain.java b/project/src/test/TestMain.java/TestMain.java new file mode 100644 index 0000000..bcb1b8f --- /dev/null +++ b/project/src/test/TestMain.java/TestMain.java @@ -0,0 +1,88 @@ +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import java.io.FileWriter; +import java.io.IOException; + +// 抽象父类:封装通用爬虫逻辑 +abstract class BaseCrawler { + // 封装属性 + private String baseUrl; + + public BaseCrawler(String baseUrl) { + this.baseUrl = baseUrl; + } + + // 封装:获取网页文档 + protected Document getDoc(String url) throws IOException { + return Jsoup.connect(url) + .userAgent("Mozilla/5.0") + .timeout(8000) + .get(); + } + + // 抽象方法:交给子类实现(多态基础) + public abstract void parse(Document doc, FileWriter writer) throws IOException; + + // 封装:统一执行入口 + public void start(FileWriter writer) { + try { + for (int i = 0; i < 10; i++) { + int start = i * 25; + String url = baseUrl + "?start=" + start; + System.out.println("正在爬取第 " + (i + 1) + " 页"); + + Document doc = getDoc(url); + parse(doc, writer); // 多态:调用子类的parse + Thread.sleep(1000); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} + +// 子类:继承父类,实现豆瓣电影解析 +class DoubanCrawler extends BaseCrawler { + + public DoubanCrawler() { + super("https://movie.douban.com/top250"); + } + + // 重写方法 → 多态 + @Override + public void parse(Document doc, FileWriter writer) throws IOException { + Elements items = doc.select("div.item"); + + for (Element item : items) { + String rank = item.select("em").text(); + String name = item.select("span.title").first().text(); + String score = item.select("span.rating_num").text(); + + String line = "排名:" + rank + " 电影:" + name + " 评分:" + score; + System.out.println(line); + writer.write(line + "\r\n"); // 写入文件 + } + } +} + +// 主类 +public class TestMain { + public static void main(String[] args) { + try { + // 直接写入桌面,好找! + FileWriter writer = new FileWriter("douban_top250.txt"); + + // 多态:父类引用 指向 子类对象 + BaseCrawler crawler = new DoubanCrawler(); + + crawler.start(writer); + + writer.close(); + System.out.println("===== 全部爬完,文件已保存到桌面 ====="); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/project/项目报告v1(1).docx b/project/项目报告v1(1).docx new file mode 100644 index 0000000..55bd41d Binary files /dev/null and b/project/项目报告v1(1).docx differ diff --git a/w1/BMICalculator.java b/w1/BMICalculator.java new file mode 100644 index 0000000..1bee517 --- /dev/null +++ b/w1/BMICalculator.java @@ -0,0 +1,27 @@ +import java.util.Scanner; +public class BMICalculator { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.print("请输入身高(米):"); + double height = scanner.nextDouble(); + + System.out.print("请输入体重(千克):"); + double weight = scanner.nextDouble(); + + double bmi = weight / (height * height); + System.out.printf("你的 BMI 值为:%.2f%n", bmi); + + // BMI 范围判断 + if (bmi < 18.5) { + System.out.println("体重过轻"); + } else if (bmi < 24) { + System.out.println("正常范围"); + } else if (bmi < 28) { + System.out.println("超重"); + } else { + System.out.println("肥胖"); + } + scanner.close(); + } +} \ No newline at end of file diff --git a/w1/Student.java b/w1/Student.java deleted file mode 100644 index e69de29..0000000 diff --git a/w5/ShapeTest.java b/w5/ShapeTest.java new file mode 100644 index 0000000..287ef36 --- /dev/null +++ b/w5/ShapeTest.java @@ -0,0 +1,4 @@ +package PACKAGE_NAME; + +public class ShapeTest { +} diff --git a/w6/AnimalTest.java b/w6/AnimalTest.java new file mode 100644 index 0000000..d0428eb --- /dev/null +++ b/w6/AnimalTest.java @@ -0,0 +1,4 @@ +package PACKAGE_NAME; + +public class AnimalTest { +} diff --git a/爬虫/DoubanMovieCrawler.java b/爬虫/DoubanMovieCrawler.java new file mode 100644 index 0000000..d39dcf8 --- /dev/null +++ b/爬虫/DoubanMovieCrawler.java @@ -0,0 +1,4 @@ +package PACKAGE_NAME; + +public class DoubanMovieCrawler { +}