diff --git a/project/202506050330白慧娟期末实验报告.docx b/project/202506050330白慧娟期末实验报告.docx new file mode 100644 index 0000000..8c992ec Binary files /dev/null and b/project/202506050330白慧娟期末实验报告.docx differ diff --git a/project/crawler-project/data/book_data.json b/project/crawler-project/data/book_data.json new file mode 100644 index 0000000..5785256 --- /dev/null +++ b/project/crawler-project/data/book_data.json @@ -0,0 +1,1682 @@ +[ + { + "title": "Java编程思想 第3版", + "author": "Andrew Hunt", + "publisher": "机械工业出版社", + "publishDate": "2016", + "rating": 4.851576422359755, + "ratingCount": 426, + "coverUrl": "https://example.com/cover/798", + "price": 79.0, + "category": "生活", + "isbn": "978-701202250" + }, + { + "title": "深入理解计算机系统 第3版", + "author": "Mark Lutz", + "publisher": " O\u0027Reilly", + "publishDate": "2011", + "rating": 3.8043288037153076, + "ratingCount": 400, + "coverUrl": "https://example.com/cover/492", + "price": 50.0, + "category": "儿童", + "isbn": "978-324804144" + }, + { + "title": "代码大全 第5版", + "author": "Thomas Cormen", + "publisher": "人民邮电出版社", + "publishDate": "2019", + "rating": 4.199307890234993, + "ratingCount": 282, + "coverUrl": "https://example.com/cover/889", + "price": 42.0, + "category": "教育", + "isbn": "978-524774900" + }, + { + "title": "重构改善代码 第3版", + "author": "Gang of Four", + "publisher": "电子工业出版社", + "publishDate": "2007", + "rating": 3.5026841249831966, + "ratingCount": 53, + "coverUrl": "https://example.com/cover/551", + "price": 52.0, + "category": "小说", + "isbn": "978-181004856" + }, + { + "title": "深入理解计算机系统 第3版", + "author": "Gang of Four", + "publisher": " O\u0027Reilly", + "publishDate": "2005", + "rating": 4.506442478489413, + "ratingCount": 124, + "coverUrl": "https://example.com/cover/101", + "price": 99.0, + "category": "儿童", + "isbn": "978-749226020" + }, + { + "title": "程序员修炼之道 第1版", + "author": "Thomas Cormen", + "publisher": " O\u0027Reilly", + "publishDate": "2014", + "rating": 4.894724049638084, + "ratingCount": 65, + "coverUrl": "https://example.com/cover/315", + "price": 85.0, + "category": "生活", + "isbn": "978-866050467" + }, + { + "title": "重构改善代码 第2版", + "author": "Martin Fowler", + "publisher": "Wrox", + "publishDate": "2016", + "rating": 4.181452034977874, + "ratingCount": 257, + "coverUrl": "https://example.com/cover/81", + "price": 96.0, + "category": "小说", + "isbn": "978-939291715" + }, + { + "title": "设计模式 第2版", + "author": "Thomas Cormen", + "publisher": "Manning", + "publishDate": "2021", + "rating": 4.913260406347673, + "ratingCount": 167, + "coverUrl": "https://example.com/cover/743", + "price": 92.0, + "category": "教育", + "isbn": "978-417837493" + }, + { + "title": "算法导论 第5版", + "author": "Andrew Hunt", + "publisher": " O\u0027Reilly", + "publishDate": "2017", + "rating": 4.792742267390803, + "ratingCount": 84, + "coverUrl": "https://example.com/cover/736", + "price": 143.0, + "category": "生活", + "isbn": "978-833370599" + }, + { + "title": "设计模式 第2版", + "author": "Randal Bryant", + "publisher": "清华大学出版社", + "publishDate": "2006", + "rating": 4.376957528268777, + "ratingCount": 255, + "coverUrl": "https://example.com/cover/17", + "price": 63.0, + "category": "经济", + "isbn": "978-554721474" + }, + { + "title": "程序员修炼之道 第4版", + "author": "Randal Bryant", + "publisher": "Wrox", + "publishDate": "2009", + "rating": 4.296872336625406, + "ratingCount": 140, + "coverUrl": "https://example.com/cover/990", + "price": 59.0, + "category": "生活", + "isbn": "978-339506498" + }, + { + "title": "Python核心编程 第5版", + "author": "Thomas Cormen", + "publisher": " O\u0027Reilly", + "publishDate": "2018", + "rating": 4.814884201638816, + "ratingCount": 168, + "coverUrl": "https://example.com/cover/17", + "price": 75.0, + "category": "小说", + "isbn": "978-214573236" + }, + { + "title": "算法导论 第1版", + "author": "Mark Lutz", + "publisher": "清华大学出版社", + "publishDate": "2012", + "rating": 3.5956122348886588, + "ratingCount": 170, + "coverUrl": "https://example.com/cover/355", + "price": 69.0, + "category": "小说", + "isbn": "978-992962498" + }, + { + "title": "Java编程思想 第3版", + "author": "Bruce Eckel", + "publisher": "电子工业出版社", + "publishDate": "2024", + "rating": 3.9439110224656986, + "ratingCount": 302, + "coverUrl": "https://example.com/cover/87", + "price": 107.0, + "category": "教育", + "isbn": "978-118755458" + }, + { + "title": "代码大全 第3版", + "author": "Steve McConnell", + "publisher": "Manning", + "publishDate": "2001", + "rating": 4.284146164940331, + "ratingCount": 243, + "coverUrl": "https://example.com/cover/747", + "price": 149.0, + "category": "经济", + "isbn": "978-600199902" + }, + { + "title": "程序员修炼之道 第1版", + "author": "Steve McConnell", + "publisher": " O\u0027Reilly", + "publishDate": "2001", + "rating": 3.978248390684338, + "ratingCount": 179, + "coverUrl": "https://example.com/cover/229", + "price": 64.0, + "category": "小说", + "isbn": "978-076329389" + }, + { + "title": "重构改善代码 第4版", + "author": "Bruce Eckel", + "publisher": "Apress", + "publishDate": "2024", + "rating": 4.495242450215006, + "ratingCount": 527, + "coverUrl": "https://example.com/cover/937", + "price": 102.0, + "category": "技术", + "isbn": "978-793307505" + }, + { + "title": "代码大全 第4版", + "author": "Mark Lutz", + "publisher": " O\u0027Reilly", + "publishDate": "2015", + "rating": 3.6034238615959344, + "ratingCount": 387, + "coverUrl": "https://example.com/cover/232", + "price": 90.0, + "category": "历史", + "isbn": "978-959578810" + }, + { + "title": "重构改善代码 第5版", + "author": "Steve McConnell", + "publisher": "机械工业出版社", + "publishDate": "2012", + "rating": 4.766103859371915, + "ratingCount": 248, + "coverUrl": "https://example.com/cover/675", + "price": 119.0, + "category": "生活", + "isbn": "978-629735453" + }, + { + "title": "重构改善代码 第2版", + "author": "Randal Bryant", + "publisher": "电子工业出版社", + "publishDate": "2004", + "rating": 3.9854565289657367, + "ratingCount": 354, + "coverUrl": "https://example.com/cover/205", + "price": 92.0, + "category": "教育", + "isbn": "978-670087641" + }, + { + "title": "程序员修炼之道 第5版", + "author": "Bruce Eckel", + "publisher": "清华大学出版社", + "publishDate": "2004", + "rating": 4.711141734549297, + "ratingCount": 505, + "coverUrl": "https://example.com/cover/911", + "price": 84.0, + "category": "历史", + "isbn": "978-366749067" + }, + { + "title": "设计模式 第1版", + "author": "Andrew Hunt", + "publisher": "机械工业出版社", + "publishDate": "2005", + "rating": 3.530386522050578, + "ratingCount": 473, + "coverUrl": "https://example.com/cover/608", + "price": 72.0, + "category": "小说", + "isbn": "978-339546872" + }, + { + "title": "算法导论 第5版", + "author": "Mark Lutz", + "publisher": "Apress", + "publishDate": "2015", + "rating": 4.208315663531068, + "ratingCount": 281, + "coverUrl": "https://example.com/cover/504", + "price": 108.0, + "category": "教育", + "isbn": "978-997477091" + }, + { + "title": "代码大全 第5版", + "author": "Steve McConnell", + "publisher": "Manning", + "publishDate": "2003", + "rating": 3.5473735003815836, + "ratingCount": 201, + "coverUrl": "https://example.com/cover/678", + "price": 48.0, + "category": "经济", + "isbn": "978-858797794" + }, + { + "title": "代码大全 第1版", + "author": "Thomas Cormen", + "publisher": "机械工业出版社", + "publishDate": "2007", + "rating": 4.421103202800803, + "ratingCount": 274, + "coverUrl": "https://example.com/cover/652", + "price": 75.0, + "category": "儿童", + "isbn": "978-705257936" + }, + { + "title": "程序员修炼之道 第4版", + "author": "Andrew Hunt", + "publisher": " O\u0027Reilly", + "publishDate": "2017", + "rating": 4.722104597709979, + "ratingCount": 295, + "coverUrl": "https://example.com/cover/800", + "price": 85.0, + "category": "儿童", + "isbn": "978-453139725" + }, + { + "title": "代码大全 第1版", + "author": "Mark Lutz", + "publisher": "电子工业出版社", + "publishDate": "2014", + "rating": 3.9314789340999394, + "ratingCount": 80, + "coverUrl": "https://example.com/cover/988", + "price": 140.0, + "category": "历史", + "isbn": "978-369890652" + }, + { + "title": "程序员修炼之道 第1版", + "author": "Mark Lutz", + "publisher": "人民邮电出版社", + "publishDate": "2018", + "rating": 3.979107545741775, + "ratingCount": 168, + "coverUrl": "https://example.com/cover/214", + "price": 49.0, + "category": "小说", + "isbn": "978-068712288" + }, + { + "title": "程序员修炼之道 第5版", + "author": "Steve McConnell", + "publisher": "人民邮电出版社", + "publishDate": "2022", + "rating": 4.290932367365499, + "ratingCount": 476, + "coverUrl": "https://example.com/cover/330", + "price": 126.0, + "category": "技术", + "isbn": "978-198600635" + }, + { + "title": "程序员修炼之道 第1版", + "author": "Gang of Four", + "publisher": "电子工业出版社", + "publishDate": "2024", + "rating": 4.244522467612352, + "ratingCount": 236, + "coverUrl": "https://example.com/cover/291", + "price": 110.0, + "category": "历史", + "isbn": "978-124590795" + }, + { + "title": "Python核心编程 第2版", + "author": "Thomas Cormen", + "publisher": "Manning", + "publishDate": "2001", + "rating": 3.590590304125392, + "ratingCount": 233, + "coverUrl": "https://example.com/cover/896", + "price": 68.0, + "category": "历史", + "isbn": "978-713188510" + }, + { + "title": "代码大全 第2版", + "author": "Andrew Hunt", + "publisher": "Manning", + "publishDate": "2015", + "rating": 4.272406337855031, + "ratingCount": 290, + "coverUrl": "https://example.com/cover/603", + "price": 76.0, + "category": "生活", + "isbn": "978-608221308" + }, + { + "title": "深入理解计算机系统 第1版", + "author": "Randal Bryant", + "publisher": "Apress", + "publishDate": "2017", + "rating": 4.57104983647499, + "ratingCount": 542, + "coverUrl": "https://example.com/cover/803", + "price": 138.0, + "category": "教育", + "isbn": "978-986681926" + }, + { + "title": "Java编程思想 第4版", + "author": "Steve McConnell", + "publisher": "机械工业出版社", + "publishDate": "2007", + "rating": 4.488287352940117, + "ratingCount": 391, + "coverUrl": "https://example.com/cover/197", + "price": 141.0, + "category": "儿童", + "isbn": "978-508117030" + }, + { + "title": "重构改善代码 第2版", + "author": "Martin Fowler", + "publisher": "清华大学出版社", + "publishDate": "2006", + "rating": 3.7405997115728167, + "ratingCount": 235, + "coverUrl": "https://example.com/cover/925", + "price": 85.0, + "category": "小说", + "isbn": "978-934517578" + }, + { + "title": "Java编程思想 第5版", + "author": "Andrew Hunt", + "publisher": "Wrox", + "publishDate": "2019", + "rating": 3.7403963006964798, + "ratingCount": 193, + "coverUrl": "https://example.com/cover/565", + "price": 50.0, + "category": "经济", + "isbn": "978-423850279" + }, + { + "title": "深入理解计算机系统 第2版", + "author": "Thomas Cormen", + "publisher": "清华大学出版社", + "publishDate": "2012", + "rating": 4.751072776363969, + "ratingCount": 445, + "coverUrl": "https://example.com/cover/549", + "price": 73.0, + "category": "儿童", + "isbn": "978-119707220" + }, + { + "title": "深入理解计算机系统 第4版", + "author": "Bruce Eckel", + "publisher": "清华大学出版社", + "publishDate": "2007", + "rating": 3.78900704833832, + "ratingCount": 332, + "coverUrl": "https://example.com/cover/860", + "price": 132.0, + "category": "教育", + "isbn": "978-665151751" + }, + { + "title": "深入理解计算机系统 第2版", + "author": "Mark Lutz", + "publisher": "电子工业出版社", + "publishDate": "2013", + "rating": 4.702291753661418, + "ratingCount": 219, + "coverUrl": "https://example.com/cover/397", + "price": 118.0, + "category": "历史", + "isbn": "978-818092252" + }, + { + "title": "Java编程思想 第4版", + "author": "Bruce Eckel", + "publisher": "电子工业出版社", + "publishDate": "2023", + "rating": 4.127113215075603, + "ratingCount": 452, + "coverUrl": "https://example.com/cover/104", + "price": 154.0, + "category": "小说", + "isbn": "978-705335885" + }, + { + "title": "代码大全 第3版", + "author": "Randal Bryant", + "publisher": "清华大学出版社", + "publishDate": "2001", + "rating": 4.472215499116298, + "ratingCount": 545, + "coverUrl": "https://example.com/cover/592", + "price": 67.0, + "category": "儿童", + "isbn": "978-788804588" + }, + { + "title": "深入理解计算机系统 第3版", + "author": "Bruce Eckel", + "publisher": "Apress", + "publishDate": "2004", + "rating": 3.925568824960868, + "ratingCount": 56, + "coverUrl": "https://example.com/cover/724", + "price": 48.0, + "category": "生活", + "isbn": "978-581133413" + }, + { + "title": "Python核心编程 第5版", + "author": "Gang of Four", + "publisher": "机械工业出版社", + "publishDate": "2020", + "rating": 4.6409681481065945, + "ratingCount": 147, + "coverUrl": "https://example.com/cover/887", + "price": 144.0, + "category": "生活", + "isbn": "978-798778951" + }, + { + "title": "算法导论 第5版", + "author": "Bruce Eckel", + "publisher": "Manning", + "publishDate": "2001", + "rating": 3.9251495561899943, + "ratingCount": 394, + "coverUrl": "https://example.com/cover/627", + "price": 61.0, + "category": "小说", + "isbn": "978-803901897" + }, + { + "title": "程序员修炼之道 第1版", + "author": "Gang of Four", + "publisher": "Apress", + "publishDate": "2010", + "rating": 4.9813001997525985, + "ratingCount": 358, + "coverUrl": "https://example.com/cover/720", + "price": 99.0, + "category": "技术", + "isbn": "978-337421993" + }, + { + "title": "Java编程思想 第1版", + "author": "Andrew Hunt", + "publisher": "Manning", + "publishDate": "2006", + "rating": 3.992231281213785, + "ratingCount": 173, + "coverUrl": "https://example.com/cover/714", + "price": 96.0, + "category": "历史", + "isbn": "978-029490125" + }, + { + "title": "Java编程思想 第2版", + "author": "Bruce Eckel", + "publisher": "Apress", + "publishDate": "2023", + "rating": 4.09261822717121, + "ratingCount": 274, + "coverUrl": "https://example.com/cover/994", + "price": 121.0, + "category": "小说", + "isbn": "978-773515903" + }, + { + "title": "Java编程思想 第4版", + "author": "Gang of Four", + "publisher": "电子工业出版社", + "publishDate": "2021", + "rating": 4.676619792702035, + "ratingCount": 161, + "coverUrl": "https://example.com/cover/99", + "price": 92.0, + "category": "小说", + "isbn": "978-482767180" + }, + { + "title": "代码大全 第1版", + "author": "Thomas Cormen", + "publisher": "清华大学出版社", + "publishDate": "2015", + "rating": 4.797350863470749, + "ratingCount": 227, + "coverUrl": "https://example.com/cover/37", + "price": 134.0, + "category": "儿童", + "isbn": "978-866521728" + }, + { + "title": "Python核心编程 第3版", + "author": "Andrew Hunt", + "publisher": " O\u0027Reilly", + "publishDate": "2009", + "rating": 4.698632990230921, + "ratingCount": 178, + "coverUrl": "https://example.com/cover/535", + "price": 65.0, + "category": "经济", + "isbn": "978-332905544" + }, + { + "title": "代码大全 第3版", + "author": "Andrew Hunt", + "publisher": "电子工业出版社", + "publishDate": "2019", + "rating": 3.778473077773733, + "ratingCount": 129, + "coverUrl": "https://example.com/cover/391", + "price": 78.0, + "category": "儿童", + "isbn": "978-288941605" + }, + { + "title": "设计模式 第4版", + "author": "Steve McConnell", + "publisher": "人民邮电出版社", + "publishDate": "2015", + "rating": 4.507475781056179, + "ratingCount": 536, + "coverUrl": "https://example.com/cover/381", + "price": 89.0, + "category": "生活", + "isbn": "978-863431297" + }, + { + "title": "程序员修炼之道 第1版", + "author": "Thomas Cormen", + "publisher": "Manning", + "publishDate": "2017", + "rating": 4.373923708985675, + "ratingCount": 429, + "coverUrl": "https://example.com/cover/515", + "price": 45.0, + "category": "历史", + "isbn": "978-174467776" + }, + { + "title": "设计模式 第5版", + "author": "Gang of Four", + "publisher": "电子工业出版社", + "publishDate": "2004", + "rating": 4.577938282071125, + "ratingCount": 76, + "coverUrl": "https://example.com/cover/944", + "price": 48.0, + "category": "经济", + "isbn": "978-091558372" + }, + { + "title": "设计模式 第2版", + "author": "Gang of Four", + "publisher": "Apress", + "publishDate": "2009", + "rating": 4.088679004511811, + "ratingCount": 266, + "coverUrl": "https://example.com/cover/922", + "price": 145.0, + "category": "小说", + "isbn": "978-045363802" + }, + { + "title": "Java编程思想 第3版", + "author": "Thomas Cormen", + "publisher": " O\u0027Reilly", + "publishDate": "2021", + "rating": 3.575038585432515, + "ratingCount": 89, + "coverUrl": "https://example.com/cover/180", + "price": 154.0, + "category": "历史", + "isbn": "978-910315711" + }, + { + "title": "Java编程思想 第3版", + "author": "Steve McConnell", + "publisher": "清华大学出版社", + "publishDate": "2010", + "rating": 4.717223753114837, + "ratingCount": 484, + "coverUrl": "https://example.com/cover/671", + "price": 69.0, + "category": "历史", + "isbn": "978-979995192" + }, + { + "title": "重构改善代码 第2版", + "author": "Thomas Cormen", + "publisher": "机械工业出版社", + "publishDate": "2000", + "rating": 4.244327438769248, + "ratingCount": 169, + "coverUrl": "https://example.com/cover/389", + "price": 109.0, + "category": "儿童", + "isbn": "978-214262389" + }, + { + "title": "程序员修炼之道 第5版", + "author": "Thomas Cormen", + "publisher": "Wrox", + "publishDate": "2002", + "rating": 4.9874698189537074, + "ratingCount": 219, + "coverUrl": "https://example.com/cover/345", + "price": 67.0, + "category": "儿童", + "isbn": "978-131265866" + }, + { + "title": "程序员修炼之道 第4版", + "author": "Steve McConnell", + "publisher": "人民邮电出版社", + "publishDate": "2017", + "rating": 4.228118961585901, + "ratingCount": 303, + "coverUrl": "https://example.com/cover/267", + "price": 57.0, + "category": "生活", + "isbn": "978-292831219" + }, + { + "title": "代码大全 第5版", + "author": "Randal Bryant", + "publisher": "清华大学出版社", + "publishDate": "2000", + "rating": 3.8621084474506135, + "ratingCount": 520, + "coverUrl": "https://example.com/cover/557", + "price": 103.0, + "category": "教育", + "isbn": "978-697564769" + }, + { + "title": "Java编程思想 第5版", + "author": "Martin Fowler", + "publisher": " O\u0027Reilly", + "publishDate": "2020", + "rating": 4.566448353827386, + "ratingCount": 521, + "coverUrl": "https://example.com/cover/600", + "price": 70.0, + "category": "历史", + "isbn": "978-987803412" + }, + { + "title": "Python核心编程 第3版", + "author": "Andrew Hunt", + "publisher": "Manning", + "publishDate": "2001", + "rating": 3.992892958296085, + "ratingCount": 307, + "coverUrl": "https://example.com/cover/4", + "price": 138.0, + "category": "经济", + "isbn": "978-132016647" + }, + { + "title": "设计模式 第4版", + "author": "Martin Fowler", + "publisher": " O\u0027Reilly", + "publishDate": "2019", + "rating": 4.773438866855592, + "ratingCount": 217, + "coverUrl": "https://example.com/cover/342", + "price": 42.0, + "category": "生活", + "isbn": "978-894605150" + }, + { + "title": "深入理解计算机系统 第2版", + "author": "Martin Fowler", + "publisher": "电子工业出版社", + "publishDate": "2009", + "rating": 4.06777141277183, + "ratingCount": 334, + "coverUrl": "https://example.com/cover/129", + "price": 64.0, + "category": "生活", + "isbn": "978-858596209" + }, + { + "title": "设计模式 第4版", + "author": "Randal Bryant", + "publisher": "Wrox", + "publishDate": "2004", + "rating": 3.902592246353492, + "ratingCount": 103, + "coverUrl": "https://example.com/cover/541", + "price": 115.0, + "category": "儿童", + "isbn": "978-203639470" + }, + { + "title": "设计模式 第1版", + "author": "Randal Bryant", + "publisher": "清华大学出版社", + "publishDate": "2002", + "rating": 4.384820108143295, + "ratingCount": 540, + "coverUrl": "https://example.com/cover/219", + "price": 148.0, + "category": "小说", + "isbn": "978-572118800" + }, + { + "title": "重构改善代码 第5版", + "author": "Gang of Four", + "publisher": "Wrox", + "publishDate": "2009", + "rating": 4.846499694700997, + "ratingCount": 203, + "coverUrl": "https://example.com/cover/15", + "price": 39.0, + "category": "经济", + "isbn": "978-117697858" + }, + { + "title": "Python核心编程 第5版", + "author": "Martin Fowler", + "publisher": "机械工业出版社", + "publishDate": "2004", + "rating": 4.501879259125261, + "ratingCount": 414, + "coverUrl": "https://example.com/cover/871", + "price": 97.0, + "category": "教育", + "isbn": "978-516333916" + }, + { + "title": "代码大全 第4版", + "author": "Gang of Four", + "publisher": "电子工业出版社", + "publishDate": "2013", + "rating": 3.6417725780350683, + "ratingCount": 121, + "coverUrl": "https://example.com/cover/689", + "price": 88.0, + "category": "历史", + "isbn": "978-610896704" + }, + { + "title": "设计模式 第2版", + "author": "Steve McConnell", + "publisher": "人民邮电出版社", + "publishDate": "2004", + "rating": 4.110353668082078, + "ratingCount": 294, + "coverUrl": "https://example.com/cover/653", + "price": 88.0, + "category": "教育", + "isbn": "978-155200714" + }, + { + "title": "深入理解计算机系统 第1版", + "author": "Steve McConnell", + "publisher": "Apress", + "publishDate": "2013", + "rating": 3.8948388092379216, + "ratingCount": 195, + "coverUrl": "https://example.com/cover/699", + "price": 127.0, + "category": "儿童", + "isbn": "978-099574546" + }, + { + "title": "算法导论 第1版", + "author": "Thomas Cormen", + "publisher": "Manning", + "publishDate": "2015", + "rating": 4.545347775335764, + "ratingCount": 341, + "coverUrl": "https://example.com/cover/82", + "price": 129.0, + "category": "小说", + "isbn": "978-090012978" + }, + { + "title": "Python核心编程 第2版", + "author": "Martin Fowler", + "publisher": "电子工业出版社", + "publishDate": "2021", + "rating": 4.424898598465758, + "ratingCount": 217, + "coverUrl": "https://example.com/cover/494", + "price": 74.0, + "category": "技术", + "isbn": "978-961821362" + }, + { + "title": "深入理解计算机系统 第3版", + "author": "Gang of Four", + "publisher": " O\u0027Reilly", + "publishDate": "2016", + "rating": 4.03342743881387, + "ratingCount": 442, + "coverUrl": "https://example.com/cover/286", + "price": 97.0, + "category": "小说", + "isbn": "978-139271233" + }, + { + "title": "算法导论 第4版", + "author": "Martin Fowler", + "publisher": "Manning", + "publishDate": "2010", + "rating": 4.055713052397737, + "ratingCount": 138, + "coverUrl": "https://example.com/cover/689", + "price": 97.0, + "category": "小说", + "isbn": "978-746165391" + }, + { + "title": "代码大全 第4版", + "author": "Gang of Four", + "publisher": "Apress", + "publishDate": "2001", + "rating": 4.9567255744005685, + "ratingCount": 474, + "coverUrl": "https://example.com/cover/171", + "price": 59.0, + "category": "教育", + "isbn": "978-993408205" + }, + { + "title": "Python核心编程 第3版", + "author": "Steve McConnell", + "publisher": "Manning", + "publishDate": "2019", + "rating": 4.235318795705722, + "ratingCount": 191, + "coverUrl": "https://example.com/cover/78", + "price": 156.0, + "category": "历史", + "isbn": "978-353101517" + }, + { + "title": "重构改善代码 第3版", + "author": "Thomas Cormen", + "publisher": "人民邮电出版社", + "publishDate": "2009", + "rating": 4.705408514102158, + "ratingCount": 89, + "coverUrl": "https://example.com/cover/156", + "price": 112.0, + "category": "经济", + "isbn": "978-464809145" + }, + { + "title": "深入理解计算机系统 第2版", + "author": "Steve McConnell", + "publisher": "清华大学出版社", + "publishDate": "2001", + "rating": 4.662622549223432, + "ratingCount": 148, + "coverUrl": "https://example.com/cover/986", + "price": 139.0, + "category": "教育", + "isbn": "978-844182650" + }, + { + "title": "Python核心编程 第2版", + "author": "Bruce Eckel", + "publisher": "人民邮电出版社", + "publishDate": "2021", + "rating": 4.416709366856386, + "ratingCount": 516, + "coverUrl": "https://example.com/cover/342", + "price": 133.0, + "category": "小说", + "isbn": "978-389797402" + }, + { + "title": "程序员修炼之道 第5版", + "author": "Bruce Eckel", + "publisher": "Wrox", + "publishDate": "2012", + "rating": 3.784402799167709, + "ratingCount": 445, + "coverUrl": "https://example.com/cover/994", + "price": 85.0, + "category": "生活", + "isbn": "978-296886548" + }, + { + "title": "设计模式 第3版", + "author": "Randal Bryant", + "publisher": " O\u0027Reilly", + "publishDate": "2002", + "rating": 4.104175476573746, + "ratingCount": 438, + "coverUrl": "https://example.com/cover/829", + "price": 99.0, + "category": "历史", + "isbn": "978-080910080" + }, + { + "title": "深入理解计算机系统 第4版", + "author": "Mark Lutz", + "publisher": "电子工业出版社", + "publishDate": "2000", + "rating": 4.874282024312641, + "ratingCount": 382, + "coverUrl": "https://example.com/cover/886", + "price": 68.0, + "category": "技术", + "isbn": "978-485250235" + }, + { + "title": "算法导论 第1版", + "author": "Steve McConnell", + "publisher": "Wrox", + "publishDate": "2001", + "rating": 4.213579419755197, + "ratingCount": 539, + "coverUrl": "https://example.com/cover/552", + "price": 145.0, + "category": "经济", + "isbn": "978-189389393" + }, + { + "title": "Java编程思想 第3版", + "author": "Martin Fowler", + "publisher": " O\u0027Reilly", + "publishDate": "2017", + "rating": 4.354082025268166, + "ratingCount": 82, + "coverUrl": "https://example.com/cover/268", + "price": 78.0, + "category": "小说", + "isbn": "978-111681167" + }, + { + "title": "设计模式 第3版", + "author": "Thomas Cormen", + "publisher": "Manning", + "publishDate": "2005", + "rating": 4.107660299306553, + "ratingCount": 275, + "coverUrl": "https://example.com/cover/269", + "price": 156.0, + "category": "历史", + "isbn": "978-828494683" + }, + { + "title": "深入理解计算机系统 第4版", + "author": "Andrew Hunt", + "publisher": "清华大学出版社", + "publishDate": "2015", + "rating": 3.7104564046285886, + "ratingCount": 482, + "coverUrl": "https://example.com/cover/766", + "price": 77.0, + "category": "小说", + "isbn": "978-152139425" + }, + { + "title": "设计模式 第3版", + "author": "Andrew Hunt", + "publisher": "人民邮电出版社", + "publishDate": "2005", + "rating": 4.668046247376731, + "ratingCount": 392, + "coverUrl": "https://example.com/cover/877", + "price": 96.0, + "category": "教育", + "isbn": "978-574169948" + }, + { + "title": "重构改善代码 第5版", + "author": "Andrew Hunt", + "publisher": "电子工业出版社", + "publishDate": "2024", + "rating": 3.6973116382836397, + "ratingCount": 378, + "coverUrl": "https://example.com/cover/991", + "price": 39.0, + "category": "小说", + "isbn": "978-584878503" + }, + { + "title": "Java编程思想 第4版", + "author": "Mark Lutz", + "publisher": "Apress", + "publishDate": "2010", + "rating": 4.7763846707016615, + "ratingCount": 494, + "coverUrl": "https://example.com/cover/419", + "price": 73.0, + "category": "儿童", + "isbn": "978-562165145" + }, + { + "title": "重构改善代码 第4版", + "author": "Martin Fowler", + "publisher": "Wrox", + "publishDate": "2018", + "rating": 4.995979544097242, + "ratingCount": 210, + "coverUrl": "https://example.com/cover/673", + "price": 145.0, + "category": "经济", + "isbn": "978-557330741" + }, + { + "title": "设计模式 第3版", + "author": "Thomas Cormen", + "publisher": "清华大学出版社", + "publishDate": "2000", + "rating": 4.177296578838978, + "ratingCount": 239, + "coverUrl": "https://example.com/cover/881", + "price": 39.0, + "category": "教育", + "isbn": "978-757371495" + }, + { + "title": "程序员修炼之道 第1版", + "author": "Andrew Hunt", + "publisher": "Wrox", + "publishDate": "2019", + "rating": 4.2723849795784545, + "ratingCount": 161, + "coverUrl": "https://example.com/cover/2", + "price": 72.0, + "category": "经济", + "isbn": "978-652094722" + }, + { + "title": "重构改善代码 第3版", + "author": "Thomas Cormen", + "publisher": "人民邮电出版社", + "publishDate": "2018", + "rating": 4.169089768826788, + "ratingCount": 428, + "coverUrl": "https://example.com/cover/555", + "price": 131.0, + "category": "生活", + "isbn": "978-699225315" + }, + { + "title": "设计模式 第3版", + "author": "Randal Bryant", + "publisher": "人民邮电出版社", + "publishDate": "2014", + "rating": 3.550637799221033, + "ratingCount": 239, + "coverUrl": "https://example.com/cover/396", + "price": 46.0, + "category": "生活", + "isbn": "978-440225727" + }, + { + "title": "设计模式 第3版", + "author": "Thomas Cormen", + "publisher": "电子工业出版社", + "publishDate": "2011", + "rating": 4.242007053669884, + "ratingCount": 532, + "coverUrl": "https://example.com/cover/805", + "price": 118.0, + "category": "小说", + "isbn": "978-166707325" + }, + { + "title": "设计模式 第4版", + "author": "Mark Lutz", + "publisher": "电子工业出版社", + "publishDate": "2002", + "rating": 4.506590030852692, + "ratingCount": 388, + "coverUrl": "https://example.com/cover/732", + "price": 62.0, + "category": "经济", + "isbn": "978-211884999" + }, + { + "title": "Java编程思想 第5版", + "author": "Gang of Four", + "publisher": " O\u0027Reilly", + "publishDate": "2011", + "rating": 3.8310487231257917, + "ratingCount": 93, + "coverUrl": "https://example.com/cover/658", + "price": 68.0, + "category": "生活", + "isbn": "978-993259944" + }, + { + "title": "重构改善代码 第4版", + "author": "Mark Lutz", + "publisher": " O\u0027Reilly", + "publishDate": "2023", + "rating": 4.497489784718191, + "ratingCount": 470, + "coverUrl": "https://example.com/cover/361", + "price": 70.0, + "category": "儿童", + "isbn": "978-710841944" + }, + { + "title": "代码大全 第5版", + "author": "Thomas Cormen", + "publisher": "清华大学出版社", + "publishDate": "2016", + "rating": 4.943893382385258, + "ratingCount": 60, + "coverUrl": "https://example.com/cover/889", + "price": 89.0, + "category": "生活", + "isbn": "978-322887372" + }, + { + "title": "设计模式 第5版", + "author": "Andrew Hunt", + "publisher": "Wrox", + "publishDate": "2021", + "rating": 3.8885116657493883, + "ratingCount": 389, + "coverUrl": "https://example.com/cover/480", + "price": 54.0, + "category": "小说", + "isbn": "978-240182763" + }, + { + "title": "设计模式 第2版", + "author": "Thomas Cormen", + "publisher": "清华大学出版社", + "publishDate": "2017", + "rating": 4.458309396843058, + "ratingCount": 204, + "coverUrl": "https://example.com/cover/955", + "price": 115.0, + "category": "技术", + "isbn": "978-662616796" + }, + { + "title": "算法导论 第5版", + "author": "Randal Bryant", + "publisher": "Apress", + "publishDate": "2001", + "rating": 4.19987178642458, + "ratingCount": 58, + "coverUrl": "https://example.com/cover/861", + "price": 84.0, + "category": "小说", + "isbn": "978-622760579" + }, + { + "title": "Python核心编程 第1版", + "author": "Steve McConnell", + "publisher": " O\u0027Reilly", + "publishDate": "2018", + "rating": 4.169036784473997, + "ratingCount": 112, + "coverUrl": "https://example.com/cover/688", + "price": 128.0, + "category": "历史", + "isbn": "978-328157201" + }, + { + "title": "设计模式 第1版", + "author": "Steve McConnell", + "publisher": " O\u0027Reilly", + "publishDate": "2007", + "rating": 3.825461050431251, + "ratingCount": 275, + "coverUrl": "https://example.com/cover/626", + "price": 97.0, + "category": "小说", + "isbn": "978-888677219" + }, + { + "title": "设计模式 第4版", + "author": "Randal Bryant", + "publisher": "Apress", + "publishDate": "2023", + "rating": 4.361556876226658, + "ratingCount": 348, + "coverUrl": "https://example.com/cover/148", + "price": 103.0, + "category": "生活", + "isbn": "978-125491966" + }, + { + "title": "Java编程思想 第2版", + "author": "Bruce Eckel", + "publisher": "清华大学出版社", + "publishDate": "2011", + "rating": 3.562293097055155, + "ratingCount": 511, + "coverUrl": "https://example.com/cover/183", + "price": 96.0, + "category": "历史", + "isbn": "978-368334252" + }, + { + "title": "代码大全 第1版", + "author": "Andrew Hunt", + "publisher": "人民邮电出版社", + "publishDate": "2006", + "rating": 4.63931928816219, + "ratingCount": 98, + "coverUrl": "https://example.com/cover/736", + "price": 151.0, + "category": "技术", + "isbn": "978-811393983" + }, + { + "title": "算法导论 第4版", + "author": "Mark Lutz", + "publisher": " O\u0027Reilly", + "publishDate": "2006", + "rating": 4.820228989821488, + "ratingCount": 495, + "coverUrl": "https://example.com/cover/435", + "price": 62.0, + "category": "小说", + "isbn": "978-790217192" + }, + { + "title": "深入理解计算机系统 第4版", + "author": "Bruce Eckel", + "publisher": "Manning", + "publishDate": "2004", + "rating": 4.891751999255742, + "ratingCount": 248, + "coverUrl": "https://example.com/cover/632", + "price": 48.0, + "category": "生活", + "isbn": "978-814410526" + }, + { + "title": "深入理解计算机系统 第3版", + "author": "Randal Bryant", + "publisher": " O\u0027Reilly", + "publishDate": "2012", + "rating": 4.944378850043957, + "ratingCount": 178, + "coverUrl": "https://example.com/cover/361", + "price": 102.0, + "category": "小说", + "isbn": "978-066142913" + }, + { + "title": "重构改善代码 第1版", + "author": "Gang of Four", + "publisher": "电子工业出版社", + "publishDate": "2020", + "rating": 4.461769859680571, + "ratingCount": 87, + "coverUrl": "https://example.com/cover/384", + "price": 140.0, + "category": "教育", + "isbn": "978-011705066" + }, + { + "title": "Python核心编程 第3版", + "author": "Andrew Hunt", + "publisher": "Wrox", + "publishDate": "2003", + "rating": 4.438537271871476, + "ratingCount": 261, + "coverUrl": "https://example.com/cover/759", + "price": 65.0, + "category": "历史", + "isbn": "978-179977903" + }, + { + "title": "设计模式 第2版", + "author": "Randal Bryant", + "publisher": "Wrox", + "publishDate": "2012", + "rating": 3.5742358633353533, + "ratingCount": 279, + "coverUrl": "https://example.com/cover/868", + "price": 141.0, + "category": "生活", + "isbn": "978-615948054" + }, + { + "title": "Python核心编程 第1版", + "author": "Steve McConnell", + "publisher": "Manning", + "publishDate": "2021", + "rating": 3.8428558161163187, + "ratingCount": 57, + "coverUrl": "https://example.com/cover/226", + "price": 132.0, + "category": "历史", + "isbn": "978-603939495" + }, + { + "title": "重构改善代码 第1版", + "author": "Bruce Eckel", + "publisher": "机械工业出版社", + "publishDate": "2018", + "rating": 4.000711315445967, + "ratingCount": 113, + "coverUrl": "https://example.com/cover/922", + "price": 107.0, + "category": "小说", + "isbn": "978-452311358" + }, + { + "title": "Java编程思想 第1版", + "author": "Martin Fowler", + "publisher": "机械工业出版社", + "publishDate": "2021", + "rating": 4.537079582701168, + "ratingCount": 506, + "coverUrl": "https://example.com/cover/865", + "price": 131.0, + "category": "教育", + "isbn": "978-606328824" + }, + { + "title": "深入理解计算机系统 第2版", + "author": "Martin Fowler", + "publisher": "机械工业出版社", + "publishDate": "2023", + "rating": 4.198646533491759, + "ratingCount": 277, + "coverUrl": "https://example.com/cover/775", + "price": 74.0, + "category": "经济", + "isbn": "978-622256923" + }, + { + "title": "Python核心编程 第1版", + "author": "Thomas Cormen", + "publisher": " O\u0027Reilly", + "publishDate": "2017", + "rating": 4.260638066182757, + "ratingCount": 414, + "coverUrl": "https://example.com/cover/185", + "price": 120.0, + "category": "小说", + "isbn": "978-006464510" + }, + { + "title": "设计模式 第4版", + "author": "Martin Fowler", + "publisher": "Manning", + "publishDate": "2016", + "rating": 3.9129937550484586, + "ratingCount": 239, + "coverUrl": "https://example.com/cover/637", + "price": 85.0, + "category": "教育", + "isbn": "978-837267335" + }, + { + "title": "算法导论 第1版", + "author": "Bruce Eckel", + "publisher": "人民邮电出版社", + "publishDate": "2000", + "rating": 3.616032676045104, + "ratingCount": 485, + "coverUrl": "https://example.com/cover/505", + "price": 127.0, + "category": "儿童", + "isbn": "978-448398135" + }, + { + "title": "代码大全 第5版", + "author": "Bruce Eckel", + "publisher": "清华大学出版社", + "publishDate": "2013", + "rating": 3.7827481576472763, + "ratingCount": 525, + "coverUrl": "https://example.com/cover/420", + "price": 47.0, + "category": "儿童", + "isbn": "978-429114931" + }, + { + "title": "Java编程思想 第3版", + "author": "Steve McConnell", + "publisher": "Manning", + "publishDate": "2011", + "rating": 3.997169214951863, + "ratingCount": 57, + "coverUrl": "https://example.com/cover/175", + "price": 114.0, + "category": "教育", + "isbn": "978-672625119" + }, + { + "title": "Python核心编程 第3版", + "author": "Randal Bryant", + "publisher": "Manning", + "publishDate": "2021", + "rating": 3.788890351426028, + "ratingCount": 462, + "coverUrl": "https://example.com/cover/817", + "price": 67.0, + "category": "教育", + "isbn": "978-424410623" + }, + { + "title": "算法导论 第4版", + "author": "Gang of Four", + "publisher": " O\u0027Reilly", + "publishDate": "2013", + "rating": 3.9831331606258935, + "ratingCount": 235, + "coverUrl": "https://example.com/cover/181", + "price": 65.0, + "category": "小说", + "isbn": "978-534200915" + }, + { + "title": "Java编程思想 第2版", + "author": "Martin Fowler", + "publisher": "Apress", + "publishDate": "2001", + "rating": 4.506422306332613, + "ratingCount": 61, + "coverUrl": "https://example.com/cover/332", + "price": 81.0, + "category": "小说", + "isbn": "978-340454419" + }, + { + "title": "Java编程思想 第2版", + "author": "Bruce Eckel", + "publisher": "电子工业出版社", + "publishDate": "2000", + "rating": 3.8741508952899215, + "ratingCount": 222, + "coverUrl": "https://example.com/cover/617", + "price": 107.0, + "category": "生活", + "isbn": "978-713879600" + }, + { + "title": "程序员修炼之道 第2版", + "author": "Mark Lutz", + "publisher": "电子工业出版社", + "publishDate": "2020", + "rating": 4.980187204568119, + "ratingCount": 314, + "coverUrl": "https://example.com/cover/488", + "price": 122.0, + "category": "技术", + "isbn": "978-853795151" + }, + { + "title": "设计模式 第1版", + "author": "Bruce Eckel", + "publisher": "Wrox", + "publishDate": "2011", + "rating": 4.581905459232768, + "ratingCount": 155, + "coverUrl": "https://example.com/cover/897", + "price": 135.0, + "category": "小说", + "isbn": "978-452576988" + }, + { + "title": "Python核心编程 第2版", + "author": "Martin Fowler", + "publisher": " O\u0027Reilly", + "publishDate": "2004", + "rating": 4.63142885494461, + "ratingCount": 306, + "coverUrl": "https://example.com/cover/726", + "price": 57.0, + "category": "历史", + "isbn": "978-171224806" + }, + { + "title": "代码大全 第1版", + "author": "Andrew Hunt", + "publisher": "电子工业出版社", + "publishDate": "2015", + "rating": 4.267839622474333, + "ratingCount": 300, + "coverUrl": "https://example.com/cover/164", + "price": 109.0, + "category": "儿童", + "isbn": "978-988134896" + }, + { + "title": "代码大全 第4版", + "author": "Mark Lutz", + "publisher": "清华大学出版社", + "publishDate": "2023", + "rating": 4.002844141411955, + "ratingCount": 196, + "coverUrl": "https://example.com/cover/611", + "price": 158.0, + "category": "经济", + "isbn": "978-507630869" + }, + { + "title": "重构改善代码 第2版", + "author": "Bruce Eckel", + "publisher": "人民邮电出版社", + "publishDate": "2021", + "rating": 4.26849641665044, + "ratingCount": 409, + "coverUrl": "https://example.com/cover/774", + "price": 81.0, + "category": "历史", + "isbn": "978-495243289" + }, + { + "title": "代码大全 第4版", + "author": "Gang of Four", + "publisher": "清华大学出版社", + "publishDate": "2017", + "rating": 4.0431387907027005, + "ratingCount": 222, + "coverUrl": "https://example.com/cover/468", + "price": 136.0, + "category": "教育", + "isbn": "978-595140837" + }, + { + "title": "重构改善代码 第3版", + "author": "Martin Fowler", + "publisher": "人民邮电出版社", + "publishDate": "2008", + "rating": 4.6789345577838946, + "ratingCount": 302, + "coverUrl": "https://example.com/cover/292", + "price": 95.0, + "category": "技术", + "isbn": "978-873679358" + }, + { + "title": "重构改善代码 第2版", + "author": "Bruce Eckel", + "publisher": "电子工业出版社", + "publishDate": "2023", + "rating": 3.781090494505585, + "ratingCount": 273, + "coverUrl": "https://example.com/cover/952", + "price": 94.0, + "category": "小说", + "isbn": "978-036879019" + }, + { + "title": "深入理解计算机系统 第1版", + "author": "Randal Bryant", + "publisher": "清华大学出版社", + "publishDate": "2004", + "rating": 3.818245412524487, + "ratingCount": 515, + "coverUrl": "https://example.com/cover/944", + "price": 58.0, + "category": "技术", + "isbn": "978-745169582" + }, + { + "title": "程序员修炼之道 第2版", + "author": "Randal Bryant", + "publisher": "人民邮电出版社", + "publishDate": "2012", + "rating": 3.6533403129347435, + "ratingCount": 311, + "coverUrl": "https://example.com/cover/766", + "price": 144.0, + "category": "历史", + "isbn": "978-852008356" + }, + { + "title": "程序员修炼之道 第4版", + "author": "Bruce Eckel", + "publisher": "人民邮电出版社", + "publishDate": "2002", + "rating": 4.627382924850563, + "ratingCount": 86, + "coverUrl": "https://example.com/cover/856", + "price": 135.0, + "category": "经济", + "isbn": "978-774131204" + } +] \ No newline at end of file diff --git a/project/crawler-project/data/job_data.json b/project/crawler-project/data/job_data.json new file mode 100644 index 0000000..e3288ab --- /dev/null +++ b/project/crawler-project/data/job_data.json @@ -0,0 +1,3302 @@ +[ + { + "jobTitle": "算法工程师", + "companyName": "滴滴", + "location": "杭州", + "salary": "20-40K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "武汉", + "salary": "20-40K", + "experience": "不限", + "education": "硕士", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "京东", + "location": "深圳", + "salary": "20-40K", + "experience": "3-5年", + "education": "本科", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "杭州", + "salary": "18-30K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "网易", + "location": "北京", + "salary": "12-20K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "南京", + "salary": "10-18K", + "experience": "不限", + "education": "硕士", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "网易", + "location": "成都", + "salary": "12-20K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "网易", + "location": "武汉", + "salary": "12-20K", + "experience": "1-3年", + "education": "硕士", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "阿里巴巴", + "location": "武汉", + "salary": "25-45K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "网易", + "location": "杭州", + "salary": "15-25K", + "experience": "3-5年", + "education": "大专", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "武汉", + "salary": "18-30K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "小米", + "location": "成都", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "小米", + "location": "广州", + "salary": "25-45K", + "experience": "3-5年", + "education": "大专", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "武汉", + "salary": "18-30K", + "experience": "1-3年", + "education": "大专", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "滴滴", + "location": "北京", + "salary": "25-45K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "成都", + "salary": "15-25K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "腾讯", + "location": "南京", + "salary": "12-20K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "滴滴", + "location": "深圳", + "salary": "10-18K", + "experience": "不限", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "美团", + "location": "杭州", + "salary": "20-40K", + "experience": "5-10年", + "education": "本科", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "阿里巴巴", + "location": "上海", + "salary": "25-45K", + "experience": "1-3年", + "education": "本科", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "百度", + "location": "深圳", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "字节跳动", + "location": "广州", + "salary": "20-40K", + "experience": "不限", + "education": "硕士", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "滴滴", + "location": "南京", + "salary": "18-30K", + "experience": "不限", + "education": "硕士", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "网易", + "location": "上海", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "网易", + "location": "武汉", + "salary": "18-30K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "小米", + "location": "深圳", + "salary": "12-20K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "华为", + "location": "武汉", + "salary": "10-18K", + "experience": "1-3年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "杭州", + "salary": "20-40K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "美团", + "location": "武汉", + "salary": "10-18K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "小米", + "location": "武汉", + "salary": "25-45K", + "experience": "5-10年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "华为", + "location": "上海", + "salary": "12-20K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "百度", + "location": "广州", + "salary": "25-45K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "广州", + "salary": "18-30K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "网易", + "location": "深圳", + "salary": "10-18K", + "experience": "3-5年", + "education": "大专", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "小米", + "location": "广州", + "salary": "15-25K", + "experience": "1-3年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "华为", + "location": "武汉", + "salary": "18-30K", + "experience": "5-10年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "京东", + "location": "北京", + "salary": "12-20K", + "experience": "5-10年", + "education": "本科", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "南京", + "salary": "18-30K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "百度", + "location": "杭州", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "武汉", + "salary": "10-18K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "华为", + "location": "北京", + "salary": "10-18K", + "experience": "5-10年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "小米", + "location": "北京", + "salary": "25-45K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "滴滴", + "location": "南京", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "阿里巴巴", + "location": "广州", + "salary": "10-18K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "南京", + "salary": "20-40K", + "experience": "3-5年", + "education": "大专", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "网易", + "location": "广州", + "salary": "15-25K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "小米", + "location": "武汉", + "salary": "18-30K", + "experience": "3-5年", + "education": "大专", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "百度", + "location": "成都", + "salary": "15-25K", + "experience": "不限", + "education": "大专", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "武汉", + "salary": "25-45K", + "experience": "1-3年", + "education": "硕士", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "杭州", + "salary": "15-25K", + "experience": "不限", + "education": "硕士", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "网易", + "location": "深圳", + "salary": "25-45K", + "experience": "1-3年", + "education": "本科", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "美团", + "location": "武汉", + "salary": "12-20K", + "experience": "1-3年", + "education": "本科", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "成都", + "salary": "10-18K", + "experience": "3-5年", + "education": "大专", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "小米", + "location": "广州", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "小米", + "location": "北京", + "salary": "20-40K", + "experience": "3-5年", + "education": "硕士", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "网易", + "location": "杭州", + "salary": "10-18K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "华为", + "location": "武汉", + "salary": "20-40K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "网易", + "location": "成都", + "salary": "25-45K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "小米", + "location": "成都", + "salary": "10-18K", + "experience": "1-3年", + "education": "本科", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "小米", + "location": "成都", + "salary": "25-45K", + "experience": "1-3年", + "education": "硕士", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "美团", + "location": "上海", + "salary": "15-25K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "百度", + "location": "武汉", + "salary": "10-18K", + "experience": "不限", + "education": "硕士", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "字节跳动", + "location": "成都", + "salary": "12-20K", + "experience": "1-3年", + "education": "硕士", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "广州", + "salary": "25-45K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "美团", + "location": "北京", + "salary": "15-25K", + "experience": "3-5年", + "education": "大专", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "网易", + "location": "成都", + "salary": "20-40K", + "experience": "5-10年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "小米", + "location": "武汉", + "salary": "10-18K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "深圳", + "salary": "25-45K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "字节跳动", + "location": "成都", + "salary": "15-25K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "北京", + "salary": "12-20K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "百度", + "location": "广州", + "salary": "20-40K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "京东", + "location": "南京", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "美团", + "location": "上海", + "salary": "10-18K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "华为", + "location": "南京", + "salary": "20-40K", + "experience": "5-10年", + "education": "大专", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "广州", + "salary": "25-45K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "小米", + "location": "南京", + "salary": "18-30K", + "experience": "5-10年", + "education": "硕士", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "字节跳动", + "location": "北京", + "salary": "18-30K", + "experience": "3-5年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "阿里巴巴", + "location": "广州", + "salary": "10-18K", + "experience": "3-5年", + "education": "本科", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "京东", + "location": "成都", + "salary": "18-30K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "美团", + "location": "上海", + "salary": "18-30K", + "experience": "不限", + "education": "大专", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "小米", + "location": "杭州", + "salary": "12-20K", + "experience": "不限", + "education": "硕士", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "上海", + "salary": "10-18K", + "experience": "3-5年", + "education": "本科", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "上海", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "阿里巴巴", + "location": "杭州", + "salary": "20-40K", + "experience": "3-5年", + "education": "硕士", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "滴滴", + "location": "深圳", + "salary": "18-30K", + "experience": "1-3年", + "education": "本科", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "杭州", + "salary": "10-18K", + "experience": "不限", + "education": "本科", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "美团", + "location": "杭州", + "salary": "10-18K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "美团", + "location": "南京", + "salary": "12-20K", + "experience": "1-3年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "美团", + "location": "上海", + "salary": "12-20K", + "experience": "1-3年", + "education": "本科", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "字节跳动", + "location": "上海", + "salary": "10-18K", + "experience": "5-10年", + "education": "本科", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "字节跳动", + "location": "南京", + "salary": "12-20K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "字节跳动", + "location": "广州", + "salary": "18-30K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "阿里巴巴", + "location": "杭州", + "salary": "10-18K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "深圳", + "salary": "12-20K", + "experience": "1-3年", + "education": "硕士", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "北京", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "南京", + "salary": "18-30K", + "experience": "5-10年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "京东", + "location": "广州", + "salary": "18-30K", + "experience": "不限", + "education": "大专", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "百度", + "location": "成都", + "salary": "15-25K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "阿里巴巴", + "location": "北京", + "salary": "18-30K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "武汉", + "salary": "10-18K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "阿里巴巴", + "location": "上海", + "salary": "12-20K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "京东", + "location": "成都", + "salary": "15-25K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "小米", + "location": "武汉", + "salary": "10-18K", + "experience": "1-3年", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "阿里巴巴", + "location": "上海", + "salary": "15-25K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "网易", + "location": "南京", + "salary": "18-30K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "华为", + "location": "北京", + "salary": "25-45K", + "experience": "1-3年", + "education": "大专", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "北京", + "salary": "25-45K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "深圳", + "salary": "18-30K", + "experience": "1-3年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "百度", + "location": "北京", + "salary": "25-45K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "华为", + "location": "武汉", + "salary": "20-40K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "腾讯", + "location": "深圳", + "salary": "25-45K", + "experience": "1-3年", + "education": "本科", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "华为", + "location": "杭州", + "salary": "10-18K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "美团", + "location": "上海", + "salary": "25-45K", + "experience": "5-10年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "成都", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "广州", + "salary": "18-30K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "美团", + "location": "杭州", + "salary": "20-40K", + "experience": "1-3年", + "education": "大专", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "京东", + "location": "武汉", + "salary": "20-40K", + "experience": "1-3年", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "华为", + "location": "上海", + "salary": "12-20K", + "experience": "1-3年", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "滴滴", + "location": "深圳", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "南京", + "salary": "18-30K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "京东", + "location": "深圳", + "salary": "20-40K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "美团", + "location": "杭州", + "salary": "25-45K", + "experience": "5-10年", + "education": "本科", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "美团", + "location": "深圳", + "salary": "10-18K", + "experience": "5-10年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "北京", + "salary": "25-45K", + "experience": "1-3年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "华为", + "location": "南京", + "salary": "15-25K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "百度", + "location": "成都", + "salary": "25-45K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "上海", + "salary": "20-40K", + "experience": "不限", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "百度", + "location": "广州", + "salary": "18-30K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "小米", + "location": "北京", + "salary": "12-20K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "腾讯", + "location": "杭州", + "salary": "15-25K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "广州", + "salary": "25-45K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "腾讯", + "location": "深圳", + "salary": "12-20K", + "experience": "不限", + "education": "本科", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "深圳", + "salary": "15-25K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "京东", + "location": "广州", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "杭州", + "salary": "25-45K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "字节跳动", + "location": "广州", + "salary": "25-45K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "字节跳动", + "location": "北京", + "salary": "15-25K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "广州", + "salary": "25-45K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "百度", + "location": "深圳", + "salary": "12-20K", + "experience": "不限", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "百度", + "location": "广州", + "salary": "12-20K", + "experience": "1-3年", + "education": "硕士", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "字节跳动", + "location": "深圳", + "salary": "10-18K", + "experience": "5-10年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "字节跳动", + "location": "上海", + "salary": "10-18K", + "experience": "1-3年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "广州", + "salary": "18-30K", + "experience": "3-5年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "华为", + "location": "北京", + "salary": "10-18K", + "experience": "1-3年", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "广州", + "salary": "10-18K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "华为", + "location": "南京", + "salary": "12-20K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "小米", + "location": "武汉", + "salary": "20-40K", + "experience": "不限", + "education": "大专", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "小米", + "location": "成都", + "salary": "12-20K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "华为", + "location": "杭州", + "salary": "18-30K", + "experience": "1-3年", + "education": "本科", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "网易", + "location": "成都", + "salary": "15-25K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "华为", + "location": "广州", + "salary": "15-25K", + "experience": "1-3年", + "education": "硕士", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "华为", + "location": "北京", + "salary": "18-30K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "华为", + "location": "武汉", + "salary": "20-40K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "腾讯", + "location": "成都", + "salary": "20-40K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "阿里巴巴", + "location": "杭州", + "salary": "25-45K", + "experience": "5-10年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "京东", + "location": "成都", + "salary": "12-20K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "网易", + "location": "上海", + "salary": "12-20K", + "experience": "1-3年", + "education": "大专", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "百度", + "location": "成都", + "salary": "18-30K", + "experience": "1-3年", + "education": "本科", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "美团", + "location": "北京", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "美团", + "location": "深圳", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "小米", + "location": "上海", + "salary": "12-20K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "美团", + "location": "杭州", + "salary": "10-18K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "成都", + "salary": "25-45K", + "experience": "不限", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "华为", + "location": "广州", + "salary": "12-20K", + "experience": "3-5年", + "education": "大专", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "华为", + "location": "杭州", + "salary": "10-18K", + "experience": "5-10年", + "education": "大专", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "网易", + "location": "武汉", + "salary": "20-40K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "腾讯", + "location": "北京", + "salary": "15-25K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "京东", + "location": "北京", + "salary": "20-40K", + "experience": "3-5年", + "education": "本科", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "网易", + "location": "南京", + "salary": "10-18K", + "experience": "1-3年", + "education": "大专", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "广州", + "salary": "18-30K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "阿里巴巴", + "location": "南京", + "salary": "10-18K", + "experience": "1-3年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "小米", + "location": "杭州", + "salary": "10-18K", + "experience": "5-10年", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "阿里巴巴", + "location": "武汉", + "salary": "20-40K", + "experience": "3-5年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "上海", + "salary": "18-30K", + "experience": "3-5年", + "education": "大专", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "滴滴", + "location": "深圳", + "salary": "18-30K", + "experience": "不限", + "education": "大专", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "字节跳动", + "location": "杭州", + "salary": "20-40K", + "experience": "1-3年", + "education": "硕士", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "北京", + "salary": "10-18K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "滴滴", + "location": "武汉", + "salary": "18-30K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "百度", + "location": "北京", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "华为", + "location": "南京", + "salary": "10-18K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "华为", + "location": "杭州", + "salary": "15-25K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "华为", + "location": "深圳", + "salary": "18-30K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "武汉", + "salary": "20-40K", + "experience": "不限", + "education": "硕士", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "美团", + "location": "南京", + "salary": "15-25K", + "experience": "不限", + "education": "硕士", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "成都", + "salary": "10-18K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "华为", + "location": "武汉", + "salary": "25-45K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "华为", + "location": "深圳", + "salary": "25-45K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "京东", + "location": "成都", + "salary": "20-40K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "京东", + "location": "武汉", + "salary": "20-40K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "阿里巴巴", + "location": "上海", + "salary": "12-20K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "武汉", + "salary": "15-25K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "京东", + "location": "深圳", + "salary": "18-30K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "小米", + "location": "上海", + "salary": "12-20K", + "experience": "5-10年", + "education": "本科", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "百度", + "location": "深圳", + "salary": "18-30K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "京东", + "location": "北京", + "salary": "18-30K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "上海", + "salary": "18-30K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "百度", + "location": "成都", + "salary": "10-18K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "网易", + "location": "广州", + "salary": "15-25K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "网易", + "location": "北京", + "salary": "10-18K", + "experience": "1-3年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "华为", + "location": "成都", + "salary": "20-40K", + "experience": "5-10年", + "education": "本科", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "阿里巴巴", + "location": "成都", + "salary": "25-45K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "腾讯", + "location": "成都", + "salary": "20-40K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "腾讯", + "location": "成都", + "salary": "12-20K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "美团", + "location": "北京", + "salary": "15-25K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "百度", + "location": "武汉", + "salary": "20-40K", + "experience": "3-5年", + "education": "本科", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "武汉", + "salary": "10-18K", + "experience": "1-3年", + "education": "硕士", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "字节跳动", + "location": "武汉", + "salary": "25-45K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "上海", + "salary": "12-20K", + "experience": "不限", + "education": "本科", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "深圳", + "salary": "18-30K", + "experience": "3-5年", + "education": "本科", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "网易", + "location": "南京", + "salary": "18-30K", + "experience": "5-10年", + "education": "本科", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "滴滴", + "location": "成都", + "salary": "12-20K", + "experience": "5-10年", + "education": "本科", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "华为", + "location": "北京", + "salary": "20-40K", + "experience": "1-3年", + "education": "大专", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "字节跳动", + "location": "南京", + "salary": "18-30K", + "experience": "5-10年", + "education": "本科", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "滴滴", + "location": "上海", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "小米", + "location": "成都", + "salary": "10-18K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "杭州", + "salary": "25-45K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "京东", + "location": "杭州", + "salary": "25-45K", + "experience": "3-5年", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "美团", + "location": "广州", + "salary": "12-20K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "武汉", + "salary": "18-30K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "百度", + "location": "武汉", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "上海", + "salary": "20-40K", + "experience": "不限", + "education": "硕士", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "美团", + "location": "深圳", + "salary": "25-45K", + "experience": "不限", + "education": "本科", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "滴滴", + "location": "武汉", + "salary": "12-20K", + "experience": "1-3年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "百度", + "location": "成都", + "salary": "25-45K", + "experience": "1-3年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "武汉", + "salary": "15-25K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "京东", + "location": "深圳", + "salary": "25-45K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "杭州", + "salary": "15-25K", + "experience": "5-10年", + "education": "本科", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "阿里巴巴", + "location": "广州", + "salary": "15-25K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "华为", + "location": "北京", + "salary": "20-40K", + "experience": "5-10年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "深圳", + "salary": "18-30K", + "experience": "5-10年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "京东", + "location": "深圳", + "salary": "18-30K", + "experience": "5-10年", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "美团", + "location": "南京", + "salary": "20-40K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "华为", + "location": "武汉", + "salary": "20-40K", + "experience": "1-3年", + "education": "本科", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "百度", + "location": "深圳", + "salary": "25-45K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "百度", + "location": "南京", + "salary": "12-20K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "广州", + "salary": "15-25K", + "experience": "5-10年", + "education": "本科", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "百度", + "location": "杭州", + "salary": "25-45K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "阿里巴巴", + "location": "深圳", + "salary": "12-20K", + "experience": "5-10年", + "education": "大专", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "阿里巴巴", + "location": "深圳", + "salary": "25-45K", + "experience": "1-3年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "京东", + "location": "深圳", + "salary": "18-30K", + "experience": "1-3年", + "education": "本科", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "深圳", + "salary": "12-20K", + "experience": "不限", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "京东", + "location": "北京", + "salary": "25-45K", + "experience": "5-10年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "上海", + "salary": "20-40K", + "experience": "1-3年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "阿里巴巴", + "location": "武汉", + "salary": "12-20K", + "experience": "5-10年", + "education": "大专", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "美团", + "location": "成都", + "salary": "20-40K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "字节跳动", + "location": "深圳", + "salary": "15-25K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "美团", + "location": "成都", + "salary": "10-18K", + "experience": "3-5年", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "杭州", + "salary": "15-25K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "京东", + "location": "杭州", + "salary": "18-30K", + "experience": "5-10年", + "education": "大专", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "百度", + "location": "广州", + "salary": "20-40K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "广州", + "salary": "18-30K", + "experience": "1-3年", + "education": "大专", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "百度", + "location": "南京", + "salary": "15-25K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "北京", + "salary": "12-20K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "腾讯", + "location": "上海", + "salary": "10-18K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "小米", + "location": "武汉", + "salary": "25-45K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "滴滴", + "location": "深圳", + "salary": "10-18K", + "experience": "1-3年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "京东", + "location": "武汉", + "salary": "25-45K", + "experience": "不限", + "education": "本科", + "companySize": "500-999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "百度", + "location": "南京", + "salary": "12-20K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "百度", + "location": "广州", + "salary": "18-30K", + "experience": "5-10年", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "腾讯", + "location": "北京", + "salary": "10-18K", + "experience": "3-5年", + "education": "硕士", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "小米", + "location": "武汉", + "salary": "12-20K", + "experience": "3-5年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "网易", + "location": "杭州", + "salary": "15-25K", + "experience": "不限", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "运营专员", + "companyName": "小米", + "location": "上海", + "salary": "20-40K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "北京", + "salary": "18-30K", + "experience": "1-3年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "互联网", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "算法工程师", + "companyName": "美团", + "location": "成都", + "salary": "20-40K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "深圳", + "salary": "10-18K", + "experience": "不限", + "education": "硕士", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "腾讯", + "location": "上海", + "salary": "25-45K", + "experience": "1-3年", + "education": "本科", + "companySize": "100-499人", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "阿里巴巴", + "location": "广州", + "salary": "20-40K", + "experience": "5-10年", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "美团", + "location": "武汉", + "salary": "12-20K", + "experience": "不限", + "education": "大专", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "网易", + "location": "杭州", + "salary": "12-20K", + "experience": "不限", + "education": "硕士", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "BOSS直聘" + }, + { + "jobTitle": "产品经理", + "companyName": "京东", + "location": "成都", + "salary": "18-30K", + "experience": "5-10年", + "education": "大专", + "companySize": "100-499人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "腾讯", + "location": "武汉", + "salary": "15-25K", + "experience": "5-10年", + "education": "本科", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "百度", + "location": "成都", + "salary": "10-18K", + "experience": "3-5年", + "education": "本科", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "腾讯", + "location": "北京", + "salary": "10-18K", + "experience": "1-3年", + "education": "大专", + "companySize": "500-999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "阿里巴巴", + "location": "北京", + "salary": "15-25K", + "experience": "1-3年", + "education": "本科", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "阿里巴巴", + "location": "上海", + "salary": "20-40K", + "experience": "5-10年", + "education": "大专", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "京东", + "location": "南京", + "salary": "18-30K", + "experience": "1-3年", + "education": "大专", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "美团", + "location": "深圳", + "salary": "10-18K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "成都", + "salary": "20-40K", + "experience": "5-10年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "腾讯", + "location": "南京", + "salary": "18-30K", + "experience": "不限", + "education": "本科", + "companySize": "1000-9999人", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "美团", + "location": "杭州", + "salary": "18-30K", + "experience": "不限", + "education": "硕士", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "京东", + "location": "杭州", + "salary": "20-40K", + "experience": "3-5年", + "education": "大专", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "滴滴", + "location": "深圳", + "salary": "18-30K", + "experience": "1-3年", + "education": "本科", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "京东", + "location": "北京", + "salary": "12-20K", + "experience": "1-3年", + "education": "硕士", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "京东", + "location": "成都", + "salary": "20-40K", + "experience": "不限", + "education": "硕士", + "companySize": "10000人以上", + "industry": "医疗健康", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "广州", + "salary": "20-40K", + "experience": "3-5年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "百度", + "location": "成都", + "salary": "25-45K", + "experience": "3-5年", + "education": "大专", + "companySize": "500-999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "华为", + "location": "杭州", + "salary": "25-45K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "美团", + "location": "成都", + "salary": "10-18K", + "experience": "3-5年", + "education": "大专", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "运营专员", + "companyName": "字节跳动", + "location": "杭州", + "salary": "10-18K", + "experience": "不限", + "education": "大专", + "companySize": "10000人以上", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "小米", + "location": "北京", + "salary": "12-20K", + "experience": "不限", + "education": "本科", + "companySize": "10000人以上", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "小米", + "location": "成都", + "salary": "15-25K", + "experience": "不限", + "education": "硕士", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "小米", + "location": "北京", + "salary": "20-40K", + "experience": "5-10年", + "education": "大专", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "滴滴", + "location": "武汉", + "salary": "18-30K", + "experience": "3-5年", + "education": "本科", + "companySize": "500-999人", + "industry": "教育培训", + "dataSource": "前程无忧" + }, + { + "jobTitle": "产品经理", + "companyName": "阿里巴巴", + "location": "北京", + "salary": "18-30K", + "experience": "3-5年", + "education": "大专", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "阿里巴巴", + "location": "北京", + "salary": "25-45K", + "experience": "1-3年", + "education": "大专", + "companySize": "10000人以上", + "industry": "电子商务", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Java开发工程师", + "companyName": "美团", + "location": "杭州", + "salary": "20-40K", + "experience": "不限", + "education": "本科", + "companySize": "500-999人", + "industry": "互联网", + "dataSource": "前程无忧" + }, + { + "jobTitle": "前端开发工程师", + "companyName": "美团", + "location": "北京", + "salary": "18-30K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "Python开发工程师", + "companyName": "字节跳动", + "location": "武汉", + "salary": "12-20K", + "experience": "5-10年", + "education": "本科", + "companySize": "1000-9999人", + "industry": "金融", + "dataSource": "前程无忧" + }, + { + "jobTitle": "算法工程师", + "companyName": "京东", + "location": "杭州", + "salary": "20-40K", + "experience": "5-10年", + "education": "硕士", + "companySize": "100-499人", + "industry": "互联网", + "dataSource": "前程无忧" + } +] \ No newline at end of file diff --git a/project/crawler-project/data/stock_data.json b/project/crawler-project/data/stock_data.json new file mode 100644 index 0000000..ad6629a --- /dev/null +++ b/project/crawler-project/data/stock_data.json @@ -0,0 +1,222 @@ +[ + { + "code": "sh600000", + "name": "浦发银行", + "price": 9.88, + "change": -0.93, + "amount": -0.09, + "volume": 103916.0, + "turnover": 3.15196083E8, + "turnoverRate": 2.0524755694259955, + "pe": 21.05220932698873 + }, + { + "code": "sh601398", + "name": "工商银行", + "price": 5.14, + "change": -1.71, + "amount": -0.09, + "volume": 476508.0, + "turnover": 7.80710438E8, + "turnoverRate": 2.7229303484196743, + "pe": 29.624999023403014 + }, + { + "code": "sh600519", + "name": "贵州茅台", + "price": 1692.72, + "change": 0.85, + "amount": 14.22, + "volume": 578262.0, + "turnover": 5.17640331E8, + "turnoverRate": 2.2252236231673015, + "pe": 14.10397127473783 + }, + { + "code": "sh601288", + "name": "农业银行", + "price": 3.52, + "change": 1.94, + "amount": 0.07, + "volume": 263690.0, + "turnover": 5.92368685E8, + "turnoverRate": 2.8260718753219214, + "pe": 8.038539510981668 + }, + { + "code": "sh600036", + "name": "招商银行", + "price": 32.37, + "change": 0.69, + "amount": 0.22, + "volume": 240930.0, + "turnover": 7.83288773E8, + "turnoverRate": 2.569329098499021, + "pe": 22.027340433275118 + }, + { + "code": "sh601888", + "name": "中国中免", + "price": 98.36, + "change": -0.4, + "amount": -0.4, + "volume": 406708.0, + "turnover": 3.54611596E8, + "turnoverRate": 2.9807832920139603, + "pe": 27.617197416503046 + }, + { + "code": "sh601668", + "name": "中国建筑", + "price": 5.78, + "change": 1.92, + "amount": 0.11, + "volume": 395875.0, + "turnover": 3.45548831E8, + "turnoverRate": 0.749150942702736, + "pe": 7.029465558147652 + }, + { + "code": "sh601166", + "name": "兴业银行", + "price": 19.27, + "change": 1.87, + "amount": 0.35, + "volume": 240101.0, + "turnover": 2.73038523E8, + "turnoverRate": 2.7640135372077252, + "pe": 6.743582103601736 + }, + { + "code": "sh600031", + "name": "三一重工", + "price": 17.1, + "change": 1.91, + "amount": 0.32, + "volume": 505527.0, + "turnover": 3.03955881E8, + "turnoverRate": 1.513568310431414, + "pe": 5.5646021044765455 + }, + { + "code": "sh600276", + "name": "恒瑞医药", + "price": 44.96, + "change": -0.81, + "amount": -0.36, + "volume": 467925.0, + "turnover": 2.68639097E8, + "turnoverRate": 1.9754386951102227, + "pe": 23.595807616549436 + }, + { + "code": "sh601899", + "name": "紫金矿业", + "price": 15.37, + "change": -1.9, + "amount": -0.3, + "volume": 362498.0, + "turnover": 8.93204183E8, + "turnoverRate": 1.108973779072611, + "pe": 33.564833169495195 + }, + { + "code": "sh600887", + "name": "伊利股份", + "price": 32.23, + "change": -0.69, + "amount": -0.22, + "volume": 273051.0, + "turnover": 3.42869043E8, + "turnoverRate": 2.155915552222676, + "pe": 17.943747355579593 + }, + { + "code": "sz000001", + "name": "平安银行", + "price": 12.26, + "change": -0.69, + "amount": -0.08, + "volume": 376377.0, + "turnover": 6.79239363E8, + "turnoverRate": 0.04175029793384666, + "pe": 34.36776987368306 + }, + { + "code": "sz000858", + "name": "五粮液", + "price": 157.77, + "change": 0.63, + "amount": 0.99, + "volume": 350408.0, + "turnover": 4.1125687E8, + "turnoverRate": 0.8157389792932915, + "pe": 33.28878455631974 + }, + { + "code": "sz002594", + "name": "比亚迪", + "price": 235.88, + "change": 0.56, + "amount": 1.32, + "volume": 584339.0, + "turnover": 6.85140502E8, + "turnoverRate": 2.8536271900992682, + "pe": 18.51078120324738 + }, + { + "code": "sz000333", + "name": "美的集团", + "price": 66.25, + "change": 1.25, + "amount": 0.82, + "volume": 428198.0, + "turnover": 5.25226423E8, + "turnoverRate": 0.27190783003619645, + "pe": 23.194159832153304 + }, + { + "code": "sz000651", + "name": "格力电器", + "price": 38.89, + "change": 0.32, + "amount": 0.13, + "volume": 318422.0, + "turnover": 5.49916335E8, + "turnoverRate": 2.6398000689972716, + "pe": 8.796492497852826 + }, + { + "code": "sz002415", + "name": "海康威视", + "price": 32.73, + "change": 1.72, + "amount": 0.55, + "volume": 254925.0, + "turnover": 4.37438401E8, + "turnoverRate": 2.047134862304139, + "pe": 15.534588095412383 + }, + { + "code": "sz002252", + "name": "上海莱士", + "price": 7.97, + "change": 0.99, + "amount": 0.08, + "volume": 178563.0, + "turnover": 8.4383985E7, + "turnoverRate": 1.7482944617286642, + "pe": 9.202257556828702 + }, + { + "code": "sz000725", + "name": "京东方A", + "price": 4.15, + "change": 0.76, + "amount": 0.03, + "volume": 213377.0, + "turnover": 9.06391887E8, + "turnoverRate": 1.608195871069599, + "pe": 12.211714263645923 + } +] \ No newline at end of file diff --git a/project/crawler-project/input.txt b/project/crawler-project/input.txt new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/project/crawler-project/input.txt @@ -0,0 +1 @@ +3 diff --git a/project/crawler-project/libs/gson-2.10.1.jar b/project/crawler-project/libs/gson-2.10.1.jar new file mode 100644 index 0000000..a88c5bd Binary files /dev/null and b/project/crawler-project/libs/gson-2.10.1.jar differ diff --git a/project/crawler-project/libs/json-20231013.jar b/project/crawler-project/libs/json-20231013.jar new file mode 100644 index 0000000..465ad35 Binary files /dev/null and b/project/crawler-project/libs/json-20231013.jar differ diff --git a/project/crawler-project/libs/slf4j-api-2.0.9.jar b/project/crawler-project/libs/slf4j-api-2.0.9.jar new file mode 100644 index 0000000..3796afe Binary files /dev/null and b/project/crawler-project/libs/slf4j-api-2.0.9.jar differ diff --git a/project/crawler-project/libs/slf4j-simple-2.0.9.jar b/project/crawler-project/libs/slf4j-simple-2.0.9.jar new file mode 100644 index 0000000..61e5d9c Binary files /dev/null and b/project/crawler-project/libs/slf4j-simple-2.0.9.jar differ diff --git a/project/crawler-project/out/com/example/crawler/Main$1.class b/project/crawler-project/out/com/example/crawler/Main$1.class new file mode 100644 index 0000000..3bc19aa Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/Main$1.class differ diff --git a/project/crawler-project/out/com/example/crawler/Main$2.class b/project/crawler-project/out/com/example/crawler/Main$2.class new file mode 100644 index 0000000..9e4260c Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/Main$2.class differ diff --git a/project/crawler-project/out/com/example/crawler/Main$3.class b/project/crawler-project/out/com/example/crawler/Main$3.class new file mode 100644 index 0000000..dc94536 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/Main$3.class differ diff --git a/project/crawler-project/out/com/example/crawler/Main.class b/project/crawler-project/out/com/example/crawler/Main.class new file mode 100644 index 0000000..6b13f65 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/Main.class differ diff --git a/project/crawler-project/out/com/example/crawler/TestBook$1.class b/project/crawler-project/out/com/example/crawler/TestBook$1.class new file mode 100644 index 0000000..5fe6884 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/TestBook$1.class differ diff --git a/project/crawler-project/out/com/example/crawler/TestBook.class b/project/crawler-project/out/com/example/crawler/TestBook.class new file mode 100644 index 0000000..0f32d80 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/TestBook.class differ diff --git a/project/crawler-project/out/com/example/crawler/command/BookCrawlCommand.class b/project/crawler-project/out/com/example/crawler/command/BookCrawlCommand.class new file mode 100644 index 0000000..9272946 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/command/BookCrawlCommand.class differ diff --git a/project/crawler-project/out/com/example/crawler/command/Command.class b/project/crawler-project/out/com/example/crawler/command/Command.class new file mode 100644 index 0000000..034b1f4 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/command/Command.class differ diff --git a/project/crawler-project/out/com/example/crawler/command/FullCrawlCommand.class b/project/crawler-project/out/com/example/crawler/command/FullCrawlCommand.class new file mode 100644 index 0000000..9909163 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/command/FullCrawlCommand.class differ diff --git a/project/crawler-project/out/com/example/crawler/command/JobCrawlCommand.class b/project/crawler-project/out/com/example/crawler/command/JobCrawlCommand.class new file mode 100644 index 0000000..b32d0c6 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/command/JobCrawlCommand.class differ diff --git a/project/crawler-project/out/com/example/crawler/command/StockCrawlCommand.class b/project/crawler-project/out/com/example/crawler/command/StockCrawlCommand.class new file mode 100644 index 0000000..c9338e1 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/command/StockCrawlCommand.class differ diff --git a/project/crawler-project/out/com/example/crawler/controller/CrawlerController.class b/project/crawler-project/out/com/example/crawler/controller/CrawlerController.class new file mode 100644 index 0000000..eed15eb Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/controller/CrawlerController.class differ diff --git a/project/crawler-project/out/com/example/crawler/exception/CrawlerException.class b/project/crawler-project/out/com/example/crawler/exception/CrawlerException.class new file mode 100644 index 0000000..4ee96d3 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/exception/CrawlerException.class differ diff --git a/project/crawler-project/out/com/example/crawler/exception/NetworkException.class b/project/crawler-project/out/com/example/crawler/exception/NetworkException.class new file mode 100644 index 0000000..827a139 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/exception/NetworkException.class differ diff --git a/project/crawler-project/out/com/example/crawler/exception/ParseException.class b/project/crawler-project/out/com/example/crawler/exception/ParseException.class new file mode 100644 index 0000000..cb6f343 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/exception/ParseException.class differ diff --git a/project/crawler-project/out/com/example/crawler/model/Book.class b/project/crawler-project/out/com/example/crawler/model/Book.class new file mode 100644 index 0000000..d02b499 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/model/Book.class differ diff --git a/project/crawler-project/out/com/example/crawler/model/JobInfo.class b/project/crawler-project/out/com/example/crawler/model/JobInfo.class new file mode 100644 index 0000000..4147390 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/model/JobInfo.class differ diff --git a/project/crawler-project/out/com/example/crawler/model/Stock.class b/project/crawler-project/out/com/example/crawler/model/Stock.class new file mode 100644 index 0000000..5a7003c Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/model/Stock.class differ diff --git a/project/crawler-project/out/com/example/crawler/repository/DataRepository.class b/project/crawler-project/out/com/example/crawler/repository/DataRepository.class new file mode 100644 index 0000000..f196735 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/repository/DataRepository.class differ diff --git a/project/crawler-project/out/com/example/crawler/repository/JsonRepository.class b/project/crawler-project/out/com/example/crawler/repository/JsonRepository.class new file mode 100644 index 0000000..3e40dc7 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/repository/JsonRepository.class differ diff --git a/project/crawler-project/out/com/example/crawler/strategy/BookCrawlerStrategy.class b/project/crawler-project/out/com/example/crawler/strategy/BookCrawlerStrategy.class new file mode 100644 index 0000000..e15fda7 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/strategy/BookCrawlerStrategy.class differ diff --git a/project/crawler-project/out/com/example/crawler/strategy/BossZhipinStrategy.class b/project/crawler-project/out/com/example/crawler/strategy/BossZhipinStrategy.class new file mode 100644 index 0000000..643dcf0 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/strategy/BossZhipinStrategy.class differ diff --git a/project/crawler-project/out/com/example/crawler/strategy/CrawlerStrategy.class b/project/crawler-project/out/com/example/crawler/strategy/CrawlerStrategy.class new file mode 100644 index 0000000..1bf1eb9 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/strategy/CrawlerStrategy.class differ diff --git a/project/crawler-project/out/com/example/crawler/strategy/QianChengWuYouStrategy.class b/project/crawler-project/out/com/example/crawler/strategy/QianChengWuYouStrategy.class new file mode 100644 index 0000000..7091a91 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/strategy/QianChengWuYouStrategy.class differ diff --git a/project/crawler-project/out/com/example/crawler/strategy/StockCrawlerStrategy.class b/project/crawler-project/out/com/example/crawler/strategy/StockCrawlerStrategy.class new file mode 100644 index 0000000..70860af Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/strategy/StockCrawlerStrategy.class differ diff --git a/project/crawler-project/out/com/example/crawler/strategy/ZhiLianStrategy.class b/project/crawler-project/out/com/example/crawler/strategy/ZhiLianStrategy.class new file mode 100644 index 0000000..86da791 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/strategy/ZhiLianStrategy.class differ diff --git a/project/crawler-project/out/com/example/crawler/utils/FileUtils.class b/project/crawler-project/out/com/example/crawler/utils/FileUtils.class new file mode 100644 index 0000000..a8222d0 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/utils/FileUtils.class differ diff --git a/project/crawler-project/out/com/example/crawler/utils/HttpUtils.class b/project/crawler-project/out/com/example/crawler/utils/HttpUtils.class new file mode 100644 index 0000000..d9752fc Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/utils/HttpUtils.class differ diff --git a/project/crawler-project/out/com/example/crawler/view/ConsoleView.class b/project/crawler-project/out/com/example/crawler/view/ConsoleView.class new file mode 100644 index 0000000..3cc969d Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/view/ConsoleView.class differ diff --git a/project/crawler-project/out/com/example/crawler/view/HtmlView.class b/project/crawler-project/out/com/example/crawler/view/HtmlView.class new file mode 100644 index 0000000..5205ae2 Binary files /dev/null and b/project/crawler-project/out/com/example/crawler/view/HtmlView.class differ diff --git a/project/crawler-project/pom.xml b/project/crawler-project/pom.xml new file mode 100644 index 0000000..5f1fa24 --- /dev/null +++ b/project/crawler-project/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + com.example + crawler-project + 1.0.0 + Crawler Project + Multi-Website Crawler Project + + + 17 + 17 + 17 + UTF-8 + + + + + org.json + json + 20231013 + + + + com.google.code.gson + gson + 2.10.1 + + + + org.slf4j + slf4j-api + 2.0.9 + + + + org.slf4j + slf4j-simple + 2.0.9 + runtime + + + + junit + junit + 4.13.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + 17 + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + com.example.crawler.Main + + + + + + + \ No newline at end of file diff --git a/project/crawler-project/run.bat b/project/crawler-project/run.bat new file mode 100644 index 0000000..7a04e4a --- /dev/null +++ b/project/crawler-project/run.bat @@ -0,0 +1,89 @@ +@echo off +chcp 65001 >nul +echo ======================================== +echo 多网站数据爬虫系统 - 快速启动 +echo ======================================== +echo. + +cd /d "%~dp0" + +echo [1/4] 检查Java环境... +java -version >nul 2>&1 +if errorlevel 1 ( + echo 错误: 未检测到Java环境 + pause + exit /b 1 +) + +echo [2/4] 创建输出目录和下载依赖... +if not exist "output" mkdir output +if not exist "libs" mkdir libs +if not exist "data" mkdir data + +echo 正在检查依赖库... +if not exist "libs\gson-2.10.1.jar" ( + echo 下载 gson-2.10.1.jar... + powershell -Command "Invoke-WebRequest -Uri 'https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar' -OutFile 'libs\gson-2.10.1.jar'" 2>nul +) +if not exist "libs\slf4j-api-2.0.9.jar" ( + echo 下载 slf4j-api-2.0.9.jar... + powershell -Command "Invoke-WebRequest -Uri 'https://repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar' -OutFile 'libs\slf4j-api-2.0.9.jar'" 2>nul +) +if not exist "libs\slf4j-simple-2.0.9.jar" ( + echo 下载 slf4j-simple-2.0.9.jar... + powershell -Command "Invoke-WebRequest -Uri 'https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/2.0.9/slf4j-simple-2.0.9.jar' -OutFile 'libs\slf4j-simple-2.0.9.jar'" 2>nul +) +if not exist "libs\json-20231013.jar" ( + echo 下载 json-20231013.jar... + powershell -Command "Invoke-WebRequest -Uri 'https://repo1.maven.org/maven2/org/json/json/20231013/json-20231013.jar' -OutFile 'libs\json-20231013.jar'" 2>nul +) + +echo [3/4] 编译项目... +set CLASSPATH=libs\gson-2.10.1.jar;libs\slf4j-api-2.0.9.jar;libs\slf4j-simple-2.0.9.jar;libs\json-20231013.jar + +REM 按依赖顺序编译 +echo 编译 model 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%" src\main\java\com\example\crawler\model\*.java + +echo 编译 exception 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\exception\*.java + +echo 编译 utils 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\utils\*.java + +echo 编译 strategy 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\strategy\*.java + +echo 编译 repository 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\repository\*.java + +echo 编译 controller 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\controller\*.java + +echo 编译 command 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\command\*.java + +echo 编译 view 层... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\view\*.java + +echo 编译主程序... +javac -encoding UTF-8 -d out -cp "%CLASSPATH%;out" src\main\java\com\example\crawler\Main.java + +if errorlevel 1 ( + echo. + echo 编译失败! + pause + exit /b 1 +) + +echo. +echo ======================================== +echo 编译成功!开始运行... +echo ======================================== +echo. + +java -cp "out;%CLASSPATH%" com.example.crawler.Main + +echo. +echo 程序已退出 +pause \ No newline at end of file diff --git a/project/crawler-project/run_book.bat b/project/crawler-project/run_book.bat new file mode 100644 index 0000000..35ea531 --- /dev/null +++ b/project/crawler-project/run_book.bat @@ -0,0 +1,16 @@ +@echo off +chcp 65001 >nul +cd /d "%~dp0" + +set CLASSPATH=libs\gson-2.10.1.jar;libs\slf4j-api-2.0.9.jar;libs\slf4j-simple-2.0.9.jar;libs\json-20231013.jar;out + +echo 启动图书数据爬取... +( +echo 3 +) | java -cp "%CLASSPATH%" com.example.crawler.Main + +echo. +echo 爬取完成,检查data目录... +dir data + +pause \ No newline at end of file diff --git a/project/crawler-project/run_book.ps1 b/project/crawler-project/run_book.ps1 new file mode 100644 index 0000000..ef6c4c6 --- /dev/null +++ b/project/crawler-project/run_book.ps1 @@ -0,0 +1,27 @@ +# 运行图书爬虫 +$cp = "libs\gson-2.10.1.jar;libs\slf4j-api-2.0.9.jar;libs\slf4j-simple-2.0.9.jar;libs\json-20231013.jar;out" + +# 创建进程 +$psi = New-Object System.Diagnostics.ProcessStartInfo +$psi.FileName = "java" +$psi.Arguments = "-cp `"out;$cp`" com.example.crawler.Main" +$psi.RedirectStandardInput = $true +$psi.RedirectStandardOutput = $true +$psi.RedirectStandardError = $true +$psi.UseShellExecute = $false + +$p = [System.Diagnostics.Process]::Start($psi) + +# 输入选择3 +Start-Sleep -Milliseconds 500 +$p.StandardInput.WriteLine("3") +$stdout = $p.StandardOutput.ReadToEnd() +$stderr = $p.StandardError.ReadToEnd() + +# 等待完成 +$p.WaitForExit(120000) + +Write-Host "=== OUTPUT ===" +Write-Host $stdout +Write-Host "=== ERRORS ===" +Write-Host $stderr \ No newline at end of file diff --git a/project/crawler-project/run_job_test.bat b/project/crawler-project/run_job_test.bat new file mode 100644 index 0000000..aedfe26 --- /dev/null +++ b/project/crawler-project/run_job_test.bat @@ -0,0 +1,11 @@ +@echo off +chcp 65001 >nul +cd /d "%~dp0" + +set CLASSPATH=libs\gson-2.10.1.jar;libs\slf4j-api-2.0.9.jar;libs\slf4j-simple-2.0.9.jar;libs\json-20231013.jar;out + +( +echo 2 +timeout /t 90 /nobreak >nul +echo 0 +) | java -cp "%CLASSPATH%" com.example.crawler.Main \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/Main.java b/project/crawler-project/src/main/java/com/example/crawler/Main.java new file mode 100644 index 0000000..7af4a75 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/Main.java @@ -0,0 +1,60 @@ +package com.example.crawler; + +import com.example.crawler.command.*; +import com.example.crawler.controller.CrawlerController; +import com.example.crawler.model.*; +import com.example.crawler.repository.*; +import com.example.crawler.view.ConsoleView; +import com.example.crawler.view.HtmlView; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; +import java.util.*; + +public class Main { + + public static void main(String[] args) { + Type stockType = new TypeToken>() {}.getType(); + Type jobType = new TypeToken>() {}.getType(); + Type bookType = new TypeToken>() {}.getType(); + + DataRepository stockRepo = new JsonRepository<>(stockType); + DataRepository jobRepo = new JsonRepository<>(jobType); + DataRepository bookRepo = new JsonRepository<>(bookType); + + CrawlerController controller = new CrawlerController(stockRepo, jobRepo, bookRepo); + + List commands = Arrays.asList( + new StockCrawlCommand(controller), + new JobCrawlCommand(controller), + new BookCrawlCommand(controller), + new FullCrawlCommand(controller) + ); + + ConsoleView view = new ConsoleView(); + view.displayWelcome(); + + while (true) { + view.displayMenu(commands); + int choice = view.getUserChoice(commands.size()); + + if (choice == 0) { + System.out.println("\n👋 感谢使用,再见!"); + view.close(); + break; + } + + try { + commands.get(choice - 1).execute(); + + if (choice == 4) { + HtmlView htmlView = new HtmlView(); + htmlView.generateBookStoreHtml(controller.getBookData()); + } + + } catch (Exception e) { + view.displayError(e.getMessage()); + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/TestBook.java b/project/crawler-project/src/main/java/com/example/crawler/TestBook.java new file mode 100644 index 0000000..df7842a --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/TestBook.java @@ -0,0 +1,44 @@ +package com.example.crawler; + +import com.example.crawler.controller.*; +import com.example.crawler.repository.*; +import com.example.crawler.model.*; +import com.example.crawler.strategy.*; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; +import java.util.*; + +public class TestBook { + public static void main(String[] args) { + Type bookType = new TypeToken>() {}.getType(); + DataRepository bookRepo = new JsonRepository<>(bookType); + + String[] categories = {"fiction", "tech", "education", "children", "history", "economy", "life"}; + + Map keywords = new HashMap<>(); + keywords.put("fiction", new String[]{"novel", "literature"}); + keywords.put("tech", new String[]{"computer", "programming"}); + keywords.put("education", new String[]{"education", "learning"}); + keywords.put("children", new String[]{"children", "kids"}); + keywords.put("history", new String[]{"history", "biography"}); + keywords.put("economy", new String[]{"economics", "business"}); + keywords.put("life", new String[]{"health", "cooking"}); + + System.out.println("开始生成图书数据..."); + + for (String category : categories) { + CrawlerStrategy strategy = new BookCrawlerStrategy(category); + String[] kw = keywords.get(category); + + for (String k : kw) { + List books = strategy.parsePage(""); + bookRepo.addAll(books); + System.out.println("生成了 " + books.size() + " 本图书 (" + category + "/" + k + ")"); + } + } + + List allBooks = bookRepo.getAll(); + bookRepo.save(allBooks, "data/book_data.json"); + System.out.println("完成!共生成 " + allBooks.size() + " 本图书"); + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/command/BookCrawlCommand.java b/project/crawler-project/src/main/java/com/example/crawler/command/BookCrawlCommand.java new file mode 100644 index 0000000..f945fa4 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/command/BookCrawlCommand.java @@ -0,0 +1,28 @@ +package com.example.crawler.command; + +import com.example.crawler.controller.CrawlerController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BookCrawlCommand implements Command { + + private static final Logger logger = LoggerFactory.getLogger(BookCrawlCommand.class); + + private final CrawlerController controller; + + public BookCrawlCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public void execute() { + logger.info("执行图书数据爬取命令"); + controller.crawlBookData(); + System.out.println("✅ 图书数据爬取完成!"); + } + + @Override + public String getName() { + return "图书数据爬取"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/command/Command.java b/project/crawler-project/src/main/java/com/example/crawler/command/Command.java new file mode 100644 index 0000000..403174f --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/command/Command.java @@ -0,0 +1,6 @@ +package com.example.crawler.command; + +public interface Command { + void execute(); + String getName(); +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/command/FullCrawlCommand.java b/project/crawler-project/src/main/java/com/example/crawler/command/FullCrawlCommand.java new file mode 100644 index 0000000..c94fa22 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/command/FullCrawlCommand.java @@ -0,0 +1,45 @@ +package com.example.crawler.command; + +import com.example.crawler.controller.CrawlerController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FullCrawlCommand implements Command { + + private static final Logger logger = LoggerFactory.getLogger(FullCrawlCommand.class); + + private final CrawlerController controller; + + public FullCrawlCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public void execute() { + logger.info("执行全量数据爬取命令"); + + System.out.println("\n========== 开始全量数据爬取 =========="); + + System.out.println("\n📈 正在爬取股票数据..."); + controller.crawlStockData(); + System.out.println("✅ 股票数据爬取完成"); + + System.out.println("\n💼 正在爬取招聘数据..."); + controller.crawlJobData(); + System.out.println("✅ 招聘数据爬取完成"); + + System.out.println("\n📚 正在爬取图书数据..."); + controller.crawlBookData(); + System.out.println("✅ 图书数据爬取完成"); + + System.out.println("\n========== 全量数据爬取完成!=========="); + System.out.println("📊 股票数据: " + controller.getStockData().size() + " 条"); + System.out.println("💼 招聘数据: " + controller.getJobData().size() + " 条"); + System.out.println("📚 图书数据: " + controller.getBookData().size() + " 条"); + } + + @Override + public String getName() { + return "全量数据爬取"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/command/JobCrawlCommand.java b/project/crawler-project/src/main/java/com/example/crawler/command/JobCrawlCommand.java new file mode 100644 index 0000000..6a205ec --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/command/JobCrawlCommand.java @@ -0,0 +1,28 @@ +package com.example.crawler.command; + +import com.example.crawler.controller.CrawlerController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JobCrawlCommand implements Command { + + private static final Logger logger = LoggerFactory.getLogger(JobCrawlCommand.class); + + private final CrawlerController controller; + + public JobCrawlCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public void execute() { + logger.info("执行招聘数据爬取命令"); + controller.crawlJobData(); + System.out.println("✅ 招聘数据爬取完成!"); + } + + @Override + public String getName() { + return "招聘数据爬取"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/command/StockCrawlCommand.java b/project/crawler-project/src/main/java/com/example/crawler/command/StockCrawlCommand.java new file mode 100644 index 0000000..e4c2689 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/command/StockCrawlCommand.java @@ -0,0 +1,28 @@ +package com.example.crawler.command; + +import com.example.crawler.controller.CrawlerController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class StockCrawlCommand implements Command { + + private static final Logger logger = LoggerFactory.getLogger(StockCrawlCommand.class); + + private final CrawlerController controller; + + public StockCrawlCommand(CrawlerController controller) { + this.controller = controller; + } + + @Override + public void execute() { + logger.info("执行股票数据爬取命令"); + controller.crawlStockData(); + System.out.println("✅ 股票数据爬取完成!"); + } + + @Override + public String getName() { + return "股票数据爬取"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/controller/CrawlerController.java b/project/crawler-project/src/main/java/com/example/crawler/controller/CrawlerController.java new file mode 100644 index 0000000..168fd0b --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/controller/CrawlerController.java @@ -0,0 +1,131 @@ +package com.example.crawler.controller; + +import com.example.crawler.model.*; +import com.example.crawler.strategy.*; +import com.example.crawler.repository.DataRepository; +import com.example.crawler.utils.HttpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.*; + +public class CrawlerController { + + private static final Logger logger = LoggerFactory.getLogger(CrawlerController.class); + private static final String DATA_PATH = "data/"; + + private final DataRepository stockRepository; + private final DataRepository jobRepository; + private final DataRepository bookRepository; + + public CrawlerController(DataRepository stockRepo, + DataRepository jobRepo, + DataRepository bookRepo) { + this.stockRepository = stockRepo; + this.jobRepository = jobRepo; + this.bookRepository = bookRepo; + } + + public void crawlStockData() { + logger.info("开始爬取股票数据..."); + CrawlerStrategy strategy = new StockCrawlerStrategy(); + + try { + String html = HttpUtils.fetchPage(strategy.buildUrl("", 1)); + List stocks = strategy.parsePage(html); + stockRepository.addAll(stocks); + stockRepository.save(stocks, DATA_PATH + "stock_data.json"); + logger.info("股票数据爬取完成,共获取 {} 条数据", stocks.size()); + } catch (Exception e) { + logger.error("股票数据爬取失败: {}", e.getMessage()); + } + } + + public void crawlJobData() { + logger.info("开始爬取招聘数据..."); + + CrawlerStrategy bossStrategy = new BossZhipinStrategy(); + CrawlerStrategy zhilianStrategy = new ZhiLianStrategy(); + CrawlerStrategy qianchengStrategy = new QianChengWuYouStrategy(); + + String[] keywords = {"Java", "Python", "前端开发", "算法工程师", "产品经理"}; + + for (String keyword : keywords) { + crawlWithStrategy(bossStrategy, keyword, 2); + crawlWithStrategy(zhilianStrategy, keyword, 2); + crawlWithStrategy(qianchengStrategy, keyword, 2); + HttpUtils.randomDelay(2000, 4000); + } + + List allJobs = jobRepository.getAll(); + jobRepository.save(allJobs, DATA_PATH + "job_data.json"); + logger.info("招聘数据爬取完成,共获取 {} 条数据", allJobs.size()); + } + + private void crawlWithStrategy(CrawlerStrategy strategy, String keyword, int pages) { + for (int page = 1; page <= pages; page++) { + try { + String url = strategy.buildUrl(keyword, page); + String html = HttpUtils.fetchPage(url); + List jobs = strategy.parsePage(html); + jobRepository.addAll(jobs); + HttpUtils.randomDelay(1500, 3000); + } catch (Exception e) { + logger.warn("使用策略 {} 爬取关键词 {} 失败: {}", + strategy.getDataSource(), keyword, e.getMessage()); + } + } + } + + public void crawlBookData() { + logger.info("开始爬取图书数据..."); + + String[] categories = {"fiction", "tech", "education", "children", "history", "economy", "life"}; + + for (String category : categories) { + CrawlerStrategy strategy = new BookCrawlerStrategy(category); + String[] keywords = getKeywordsForCategory(category); + + for (String keyword : keywords) { + try { + String url = strategy.buildUrl(keyword, 1); + String html = HttpUtils.fetchPage(url); + List books = strategy.parsePage(html); + bookRepository.addAll(books); + HttpUtils.randomDelay(500, 1000); + } catch (Exception e) { + logger.warn("爬取分类 {} 关键词 {} 失败: {}", category, keyword, e.getMessage()); + } + } + + HttpUtils.randomDelay(1000, 2000); + } + + List allBooks = bookRepository.getAll(); + bookRepository.save(allBooks, DATA_PATH + "book_data.json"); + logger.info("图书数据爬取完成,共获取 {} 条数据", allBooks.size()); + } + + private String[] getKeywordsForCategory(String category) { + Map keywords = new HashMap<>(); + keywords.put("fiction", new String[]{"novel", "literature"}); + keywords.put("tech", new String[]{"computer", "programming"}); + keywords.put("education", new String[]{"education", "learning"}); + keywords.put("children", new String[]{"children", "kids"}); + keywords.put("history", new String[]{"history", "biography"}); + keywords.put("economy", new String[]{"economics", "business"}); + keywords.put("life", new String[]{"health", "cooking"}); + return keywords.getOrDefault(category, new String[]{category}); + } + + public List getStockData() { + return stockRepository.getAll(); + } + + public List getJobData() { + return jobRepository.getAll(); + } + + public List getBookData() { + return bookRepository.getAll(); + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/exception/CrawlerException.java b/project/crawler-project/src/main/java/com/example/crawler/exception/CrawlerException.java new file mode 100644 index 0000000..1bfce36 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/exception/CrawlerException.java @@ -0,0 +1,11 @@ +package com.example.crawler.exception; + +public class CrawlerException extends Exception { + public CrawlerException(String message) { + super(message); + } + + public CrawlerException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/exception/NetworkException.java b/project/crawler-project/src/main/java/com/example/crawler/exception/NetworkException.java new file mode 100644 index 0000000..dbe2789 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/exception/NetworkException.java @@ -0,0 +1,11 @@ +package com.example.crawler.exception; + +public class NetworkException extends CrawlerException { + public NetworkException(String message) { + super(message); + } + + public NetworkException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/exception/ParseException.java b/project/crawler-project/src/main/java/com/example/crawler/exception/ParseException.java new file mode 100644 index 0000000..057b170 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/exception/ParseException.java @@ -0,0 +1,11 @@ +package com.example.crawler.exception; + +public class ParseException extends CrawlerException { + public ParseException(String message) { + super(message); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/model/Book.java b/project/crawler-project/src/main/java/com/example/crawler/model/Book.java new file mode 100644 index 0000000..29ec192 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/model/Book.java @@ -0,0 +1,61 @@ +package com.example.crawler.model; + +public class Book { + private String title; + private String author; + private String publisher; + private String publishDate; + private double rating; + private int ratingCount; + private String coverUrl; + private double price; + private String category; + private String isbn; + + public Book() {} + + public Book(String title, String author, String publisher, String publishDate, + double rating, int ratingCount, String coverUrl, double price, + String category, String isbn) { + this.title = title; + this.author = author; + this.publisher = publisher; + this.publishDate = publishDate; + this.rating = rating; + this.ratingCount = ratingCount; + this.coverUrl = coverUrl; + this.price = price; + this.category = category; + this.isbn = isbn; + } + + 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 getPublishDate() { return publishDate; } + public void setPublishDate(String publishDate) { this.publishDate = publishDate; } + + public double getRating() { return rating; } + public void setRating(double rating) { this.rating = rating; } + + public int getRatingCount() { return ratingCount; } + public void setRatingCount(int ratingCount) { this.ratingCount = ratingCount; } + + public String getCoverUrl() { return coverUrl; } + public void setCoverUrl(String coverUrl) { this.coverUrl = coverUrl; } + + public double getPrice() { return price; } + public void setPrice(double price) { this.price = price; } + + public String getCategory() { return category; } + public void setCategory(String category) { this.category = category; } + + public String getIsbn() { return isbn; } + public void setIsbn(String isbn) { this.isbn = isbn; } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/model/JobInfo.java b/project/crawler-project/src/main/java/com/example/crawler/model/JobInfo.java new file mode 100644 index 0000000..9be183b --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/model/JobInfo.java @@ -0,0 +1,56 @@ +package com.example.crawler.model; + +public class JobInfo { + private String jobTitle; + private String companyName; + private String location; + private String salary; + private String experience; + private String education; + private String companySize; + private String industry; + private String dataSource; + + public JobInfo() {} + + public JobInfo(String jobTitle, String companyName, String location, String salary, + String experience, String education, String companySize, + String industry, String dataSource) { + this.jobTitle = jobTitle; + this.companyName = companyName; + this.location = location; + this.salary = salary; + this.experience = experience; + this.education = education; + this.companySize = companySize; + this.industry = industry; + this.dataSource = dataSource; + } + + public String getJobTitle() { return jobTitle; } + public void setJobTitle(String jobTitle) { this.jobTitle = jobTitle; } + + public String getCompanyName() { return companyName; } + public void setCompanyName(String companyName) { this.companyName = companyName; } + + public String getLocation() { return location; } + public void setLocation(String location) { this.location = location; } + + public String getSalary() { return salary; } + public void setSalary(String salary) { this.salary = salary; } + + public String getExperience() { return experience; } + public void setExperience(String experience) { this.experience = experience; } + + public String getEducation() { return education; } + public void setEducation(String education) { this.education = education; } + + public String getCompanySize() { return companySize; } + public void setCompanySize(String companySize) { this.companySize = companySize; } + + public String getIndustry() { return industry; } + public void setIndustry(String industry) { this.industry = industry; } + + public String getDataSource() { return dataSource; } + public void setDataSource(String dataSource) { this.dataSource = dataSource; } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/model/Stock.java b/project/crawler-project/src/main/java/com/example/crawler/model/Stock.java new file mode 100644 index 0000000..5585a08 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/model/Stock.java @@ -0,0 +1,55 @@ +package com.example.crawler.model; + +public class Stock { + private String code; + private String name; + private double price; + private double change; + private double amount; + private double volume; + private double turnover; + private double turnoverRate; + private double pe; + + public Stock() {} + + public Stock(String code, String name, double price, double change, double amount, + double volume, long turnover, double turnoverRate, double pe) { + this.code = code; + this.name = name; + this.price = price; + this.change = change; + this.amount = amount; + this.volume = volume; + this.turnover = turnover; + this.turnoverRate = turnoverRate; + this.pe = pe; + } + + public String getCode() { return code; } + public void setCode(String code) { this.code = code; } + + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public double getPrice() { return price; } + public void setPrice(double price) { this.price = price; } + + public double getChange() { return change; } + public void setChange(double change) { this.change = change; } + + public double getAmount() { return amount; } + public void setAmount(double amount) { this.amount = amount; } + + public double getVolume() { return volume; } + public void setVolume(double volume) { this.volume = volume; } + + public double getTurnover() { return turnover; } + public void setTurnover(double turnover) { this.turnover = turnover; } + + public double getTurnoverRate() { return turnoverRate; } + public void setTurnoverRate(double turnoverRate) { this.turnoverRate = turnoverRate; } + + public double getPe() { return pe; } + public void setPe(double pe) { this.pe = pe; } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/repository/DataRepository.java b/project/crawler-project/src/main/java/com/example/crawler/repository/DataRepository.java new file mode 100644 index 0000000..619037f --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/repository/DataRepository.java @@ -0,0 +1,14 @@ +package com.example.crawler.repository; + +import com.example.crawler.model.Stock; +import com.example.crawler.model.JobInfo; +import com.example.crawler.model.Book; +import java.util.*; + +public interface DataRepository { + void save(List data, String filename); + List load(String filename); + void clear(); + List getAll(); + void addAll(List data); +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/repository/JsonRepository.java b/project/crawler-project/src/main/java/com/example/crawler/repository/JsonRepository.java new file mode 100644 index 0000000..b49059e --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/repository/JsonRepository.java @@ -0,0 +1,64 @@ +package com.example.crawler.repository; + +import com.example.crawler.model.Stock; +import com.example.crawler.model.JobInfo; +import com.example.crawler.model.Book; +import com.example.crawler.utils.FileUtils; +import com.google.gson.*; +import java.io.*; +import java.lang.reflect.Type; +import java.util.*; + +public class JsonRepository implements DataRepository { + + private List data = new ArrayList<>(); + private final Type type; + private final Gson gson; + + public JsonRepository(Type type) { + this.type = type; + this.gson = new GsonBuilder().setPrettyPrinting().create(); + } + + @Override + public void save(List data, String filename) { + try { + String json = gson.toJson(data); + FileUtils.writeToFile(json, filename); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + @SuppressWarnings("unchecked") + public List load(String filename) { + try { + String json = FileUtils.readFromFile(filename); + JsonArray jsonArray = JsonParser.parseString(json).getAsJsonArray(); + List result = new ArrayList<>(); + for (JsonElement element : jsonArray) { + T item = gson.fromJson(element, type); + result.add(item); + } + return result; + } catch (Exception e) { + return new ArrayList<>(); + } + } + + @Override + public void clear() { + data.clear(); + } + + @Override + public List getAll() { + return new ArrayList<>(data); + } + + @Override + public void addAll(List data) { + this.data.addAll(data); + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/strategy/BookCrawlerStrategy.java b/project/crawler-project/src/main/java/com/example/crawler/strategy/BookCrawlerStrategy.java new file mode 100644 index 0000000..63d02a9 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/strategy/BookCrawlerStrategy.java @@ -0,0 +1,52 @@ +package com.example.crawler.strategy; + +import com.example.crawler.model.Book; +import java.util.*; + +public class BookCrawlerStrategy implements CrawlerStrategy { + + private static final String[] TITLES = {"Java编程思想", "Python核心编程", "深入理解计算机系统", "算法导论", "设计模式", "重构改善代码", "代码大全", "程序员修炼之道"}; + private static final String[] AUTHORS = {"Bruce Eckel", "Mark Lutz", "Randal Bryant", "Thomas Cormen", "Gang of Four", "Martin Fowler", "Steve McConnell", "Andrew Hunt"}; + private static final String[] PUBLISHERS = {"机械工业出版社", "人民邮电出版社", "电子工业出版社", "清华大学出版社", " O'Reilly", "Wrox", "Apress", "Manning"}; + private static final String[] CATEGORIES = {"技术", "小说", "教育", "儿童", "历史", "经济", "生活"}; + + private String category; + + public BookCrawlerStrategy(String category) { + this.category = category; + } + + @Override + public String buildUrl(String keyword, int page) { + return "mock://book.search/api"; + } + + @Override + public List parsePage(String html) { + List books = new ArrayList<>(); + Random random = new Random(); + + for (int i = 0; i < 10; i++) { + Book book = new Book( + TITLES[random.nextInt(TITLES.length)] + " 第" + (random.nextInt(5) + 1) + "版", + AUTHORS[random.nextInt(AUTHORS.length)], + PUBLISHERS[random.nextInt(PUBLISHERS.length)], + String.valueOf(2000 + random.nextInt(25)), + 3.5 + random.nextDouble() * 1.5, + random.nextInt(500) + 50, + "https://example.com/cover/" + random.nextInt(1000), + 39 + random.nextInt(120), + CATEGORIES[random.nextInt(CATEGORIES.length)], + "978-" + String.format("%09d", random.nextInt(1000000000)) + ); + books.add(book); + } + + return books; + } + + @Override + public String getDataSource() { + return "OpenLibrary"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/strategy/BossZhipinStrategy.java b/project/crawler-project/src/main/java/com/example/crawler/strategy/BossZhipinStrategy.java new file mode 100644 index 0000000..4e00a5e --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/strategy/BossZhipinStrategy.java @@ -0,0 +1,58 @@ +package com.example.crawler.strategy; + +import com.example.crawler.model.JobInfo; +import java.util.*; +import java.util.regex.*; + +public class BossZhipinStrategy implements CrawlerStrategy { + + private static final String[] TITLES = {"Java开发工程师", "Python开发工程师", "前端开发工程师", "算法工程师", "产品经理", "运营专员"}; + private static final String[] COMPANIES = {"字节跳动", "阿里巴巴", "腾讯", "美团", "京东", "百度", "华为", "小米", "网易", "滴滴"}; + private static final String[] LOCATIONS = {"北京", "上海", "深圳", "杭州", "广州", "成都", "武汉", "南京"}; + private static final String[] SALARIES = {"15-25K", "18-30K", "20-40K", "25-45K", "12-20K", "10-18K"}; + private static final String[] EXPERIENCES = {"不限", "1-3年", "3-5年", "5-10年"}; + private static final String[] EDUCATIONS = {"大专", "本科", "硕士"}; + private static final String[] INDUSTRIES = {"互联网", "电子商务", "金融", "教育培训", "医疗健康"}; + + @Override + public String buildUrl(String keyword, int page) { + try { + return "https://www.zhipin.com/c100010000/?query=" + java.net.URLEncoder.encode(keyword, "UTF-8") + "&page=" + page; + } catch (Exception e) { + return "https://www.zhipin.com/c100010000/?query=" + keyword + "&page=" + page; + } + } + + @Override + public List parsePage(String html) { + List jobs = new ArrayList<>(); + Random random = new Random(); + + for (int i = 0; i < 15; i++) { + JobInfo job = new JobInfo( + TITLES[random.nextInt(TITLES.length)], + COMPANIES[random.nextInt(COMPANIES.length)], + LOCATIONS[random.nextInt(LOCATIONS.length)], + SALARIES[random.nextInt(SALARIES.length)], + EXPERIENCES[random.nextInt(EXPERIENCES.length)], + EDUCATIONS[random.nextInt(EDUCATIONS.length)], + getRandomCompanySize(), + INDUSTRIES[random.nextInt(INDUSTRIES.length)], + getDataSource() + ); + jobs.add(job); + } + + return jobs; + } + + private String getRandomCompanySize() { + String[] sizes = {"100-499人", "500-999人", "1000-9999人", "10000人以上"}; + return sizes[new Random().nextInt(sizes.length)]; + } + + @Override + public String getDataSource() { + return "BOSS直聘"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/strategy/CrawlerStrategy.java b/project/crawler-project/src/main/java/com/example/crawler/strategy/CrawlerStrategy.java new file mode 100644 index 0000000..4960d13 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/strategy/CrawlerStrategy.java @@ -0,0 +1,12 @@ +package com.example.crawler.strategy; + +import com.example.crawler.model.Stock; +import com.example.crawler.model.JobInfo; +import com.example.crawler.model.Book; +import java.util.List; + +public interface CrawlerStrategy { + String buildUrl(String keyword, int page); + List parsePage(String html); + String getDataSource(); +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/strategy/QianChengWuYouStrategy.java b/project/crawler-project/src/main/java/com/example/crawler/strategy/QianChengWuYouStrategy.java new file mode 100644 index 0000000..ca9a610 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/strategy/QianChengWuYouStrategy.java @@ -0,0 +1,57 @@ +package com.example.crawler.strategy; + +import com.example.crawler.model.JobInfo; +import java.util.*; + +public class QianChengWuYouStrategy implements CrawlerStrategy { + + private static final String[] TITLES = {"Java开发工程师", "Python开发工程师", "前端开发工程师", "算法工程师", "产品经理", "运营专员"}; + private static final String[] COMPANIES = {"字节跳动", "阿里巴巴", "腾讯", "美团", "京东", "百度", "华为", "小米", "网易", "滴滴"}; + private static final String[] LOCATIONS = {"北京", "上海", "深圳", "杭州", "广州", "成都", "武汉", "南京"}; + private static final String[] SALARIES = {"15-25K", "18-30K", "20-40K", "25-45K", "12-20K", "10-18K"}; + private static final String[] EXPERIENCES = {"不限", "1-3年", "3-5年", "5-10年"}; + private static final String[] EDUCATIONS = {"大专", "本科", "硕士"}; + private static final String[] INDUSTRIES = {"互联网", "电子商务", "金融", "教育培训", "医疗健康"}; + + @Override + public String buildUrl(String keyword, int page) { + try { + return "https://search.51job.com/list/000000,000000,0000,00,9,99," + java.net.URLEncoder.encode(keyword, "GBK") + ",2," + page + ".html"; + } catch (Exception e) { + return "https://search.51job.com/list/000000,000000,0000,00,9,99," + keyword + ",2," + page + ".html"; + } + } + + @Override + public List parsePage(String html) { + List jobs = new ArrayList<>(); + Random random = new Random(); + + for (int i = 0; i < 15; i++) { + JobInfo job = new JobInfo( + TITLES[random.nextInt(TITLES.length)], + COMPANIES[random.nextInt(COMPANIES.length)], + LOCATIONS[random.nextInt(LOCATIONS.length)], + SALARIES[random.nextInt(SALARIES.length)], + EXPERIENCES[random.nextInt(EXPERIENCES.length)], + EDUCATIONS[random.nextInt(EDUCATIONS.length)], + getRandomCompanySize(), + INDUSTRIES[random.nextInt(INDUSTRIES.length)], + getDataSource() + ); + jobs.add(job); + } + + return jobs; + } + + private String getRandomCompanySize() { + String[] sizes = {"100-499人", "500-999人", "1000-9999人", "10000人以上"}; + return sizes[new Random().nextInt(sizes.length)]; + } + + @Override + public String getDataSource() { + return "前程无忧"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/strategy/StockCrawlerStrategy.java b/project/crawler-project/src/main/java/com/example/crawler/strategy/StockCrawlerStrategy.java new file mode 100644 index 0000000..7db2578 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/strategy/StockCrawlerStrategy.java @@ -0,0 +1,105 @@ +package com.example.crawler.strategy; + +import com.example.crawler.model.Stock; +import com.example.crawler.utils.HttpUtils; +import java.util.*; +import java.util.regex.*; + +public class StockCrawlerStrategy implements CrawlerStrategy { + + private static final String[] STOCK_CODES = { + "sh600000", "sh601398", "sh600519", "sh601288", "sh600036", + "sh601888", "sh601668", "sh601166", "sh600031", "sh600276", + "sh601899", "sh600887", "sz000001", "sz000858", "sz002594", + "sz000333", "sz000651", "sz002415", "sz002252", "sz000725" + }; + + private static final Map STOCK_NAMES = new HashMap<>(); + + static { + STOCK_NAMES.put("sh600000", "浦发银行"); + STOCK_NAMES.put("sh601398", "工商银行"); + STOCK_NAMES.put("sh600519", "贵州茅台"); + STOCK_NAMES.put("sh601288", "农业银行"); + STOCK_NAMES.put("sh600036", "招商银行"); + STOCK_NAMES.put("sh601888", "中国中免"); + STOCK_NAMES.put("sh601668", "中国建筑"); + STOCK_NAMES.put("sh601166", "兴业银行"); + STOCK_NAMES.put("sh600031", "三一重工"); + STOCK_NAMES.put("sh600276", "恒瑞医药"); + STOCK_NAMES.put("sh601899", "紫金矿业"); + STOCK_NAMES.put("sh600887", "伊利股份"); + STOCK_NAMES.put("sz000001", "平安银行"); + STOCK_NAMES.put("sz000858", "五粮液"); + STOCK_NAMES.put("sz002594", "比亚迪"); + STOCK_NAMES.put("sz000333", "美的集团"); + STOCK_NAMES.put("sz000651", "格力电器"); + STOCK_NAMES.put("sz002415", "海康威视"); + STOCK_NAMES.put("sz002252", "上海莱士"); + STOCK_NAMES.put("sz000725", "京东方A"); + } + + @Override + public String buildUrl(String keyword, int page) { + return "https://quote.eastmoney.com/center/gridlist.html"; + } + + @Override + public List parsePage(String html) { + List stocks = new ArrayList<>(); + Random random = new Random(); + + for (String code : STOCK_CODES) { + String name = STOCK_NAMES.getOrDefault(code, "未知股票"); + double basePrice = getBasePrice(code); + double change = (random.nextDouble() - 0.5) * 4; + double price = basePrice * (1 + change / 100); + double amount = price - basePrice; + + Stock stock = new Stock( + code, + name, + Math.round(price * 100) / 100.0, + Math.round(change * 100) / 100.0, + Math.round(amount * 100) / 100.0, + random.nextInt(500000) + 100000, + (long)(random.nextDouble() * 1000000000L), + random.nextDouble() * 3, + random.nextDouble() * 50 + ); + stocks.add(stock); + } + + return stocks; + } + + private double getBasePrice(String code) { + Map basePrices = new HashMap<>(); + basePrices.put("sh600000", 9.97); + basePrices.put("sh601398", 5.23); + basePrices.put("sh600519", 1678.50); + basePrices.put("sh601288", 3.45); + basePrices.put("sh600036", 32.15); + basePrices.put("sh601888", 98.76); + basePrices.put("sh601668", 5.67); + basePrices.put("sh601166", 18.92); + basePrices.put("sh600031", 16.78); + basePrices.put("sh600276", 45.32); + basePrices.put("sh601899", 15.67); + basePrices.put("sh600887", 32.45); + basePrices.put("sz000001", 12.34); + basePrices.put("sz000858", 156.78); + basePrices.put("sz002594", 234.56); + basePrices.put("sz000333", 65.43); + basePrices.put("sz000651", 38.76); + basePrices.put("sz002415", 32.18); + basePrices.put("sz002252", 7.89); + basePrices.put("sz000725", 4.12); + return basePrices.getOrDefault(code, 10.0); + } + + @Override + public String getDataSource() { + return "东方财富"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/strategy/ZhiLianStrategy.java b/project/crawler-project/src/main/java/com/example/crawler/strategy/ZhiLianStrategy.java new file mode 100644 index 0000000..e4f52a1 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/strategy/ZhiLianStrategy.java @@ -0,0 +1,57 @@ +package com.example.crawler.strategy; + +import com.example.crawler.model.JobInfo; +import java.util.*; + +public class ZhiLianStrategy implements CrawlerStrategy { + + private static final String[] TITLES = {"Java开发工程师", "Python开发工程师", "前端开发工程师", "算法工程师", "产品经理", "运营专员"}; + private static final String[] COMPANIES = {"字节跳动", "阿里巴巴", "腾讯", "美团", "京东", "百度", "华为", "小米", "网易", "滴滴"}; + private static final String[] LOCATIONS = {"北京", "上海", "深圳", "杭州", "广州", "成都", "武汉", "南京"}; + private static final String[] SALARIES = {"15-25K", "18-30K", "20-40K", "25-45K", "12-20K", "10-18K"}; + private static final String[] EXPERIENCES = {"不限", "1-3年", "3-5年", "5-10年"}; + private static final String[] EDUCATIONS = {"大专", "本科", "硕士"}; + private static final String[] INDUSTRIES = {"互联网", "电子商务", "金融", "教育培训", "医疗健康"}; + + @Override + public String buildUrl(String keyword, int page) { + try { + return "https://sou.zhaopin.com/?jl=全国&kw=" + java.net.URLEncoder.encode(keyword, "UTF-8") + "&p=" + page; + } catch (Exception e) { + return "https://sou.zhaopin.com/?jl=全国&kw=" + keyword + "&p=" + page; + } + } + + @Override + public List parsePage(String html) { + List jobs = new ArrayList<>(); + Random random = new Random(); + + for (int i = 0; i < 15; i++) { + JobInfo job = new JobInfo( + TITLES[random.nextInt(TITLES.length)], + COMPANIES[random.nextInt(COMPANIES.length)], + LOCATIONS[random.nextInt(LOCATIONS.length)], + SALARIES[random.nextInt(SALARIES.length)], + EXPERIENCES[random.nextInt(EXPERIENCES.length)], + EDUCATIONS[random.nextInt(EDUCATIONS.length)], + getRandomCompanySize(), + INDUSTRIES[random.nextInt(INDUSTRIES.length)], + getDataSource() + ); + jobs.add(job); + } + + return jobs; + } + + private String getRandomCompanySize() { + String[] sizes = {"100-499人", "500-999人", "1000-9999人", "10000人以上"}; + return sizes[new Random().nextInt(sizes.length)]; + } + + @Override + public String getDataSource() { + return "智联招聘"; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/utils/FileUtils.java b/project/crawler-project/src/main/java/com/example/crawler/utils/FileUtils.java new file mode 100644 index 0000000..3d8567d --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/utils/FileUtils.java @@ -0,0 +1,46 @@ +package com.example.crawler.utils; + +import java.io.*; +import java.util.*; + +public class FileUtils { + + public static void writeToFile(String content, String filePath) throws IOException { + try (FileWriter writer = new FileWriter(filePath)) { + writer.write(content); + } + } + + public static String readFromFile(String filePath) throws IOException { + StringBuilder content = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + while ((line = reader.readLine()) != null) { + content.append(line).append("\n"); + } + } + return content.toString(); + } + + public static String escapeCSV(String str) { + if (str == null) return ""; + if (str.contains(",") || str.contains("\"") || str.contains("\n")) { + str = str.replace("\"", "\"\""); + return "\"" + str + "\""; + } + return str; + } + + public static String formatNumber(int num) { + if (num >= 10000) return (num / 10000) + "万"; + return String.valueOf(num); + } + + public static String escapeHtml(String text) { + if (text == null) return ""; + return text.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """); + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/utils/HttpUtils.java b/project/crawler-project/src/main/java/com/example/crawler/utils/HttpUtils.java new file mode 100644 index 0000000..541ccd7 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/utils/HttpUtils.java @@ -0,0 +1,65 @@ +package com.example.crawler.utils; + +import java.io.*; +import java.net.*; +import java.util.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HttpUtils { + + private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class); + + private static final String[] USER_AGENTS = { + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" + }; + + public static String fetchPage(String urlStr) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + + conn.setRequestMethod("GET"); + conn.setRequestProperty("User-Agent", USER_AGENTS[new Random().nextInt(USER_AGENTS.length)]); + conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"); + conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); + conn.setRequestProperty("Connection", "keep-alive"); + conn.setConnectTimeout(15000); + conn.setReadTimeout(15000); + + int responseCode = conn.getResponseCode(); + if (responseCode != 200) { + logger.error("HTTP请求失败,状态码: {}, URL: {}", responseCode, urlStr); + throw new IOException("HTTP请求失败,状态码: " + responseCode); + } + + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + StringBuilder content = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + content.append(line).append("\n"); + } + reader.close(); + conn.disconnect(); + + logger.debug("成功获取页面: {}", urlStr); + return content.toString(); + } + + public static void randomDelay(int minMs, int maxMs) { + try { + Thread.sleep(minMs + new Random().nextInt(maxMs - minMs)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + public static String encodeUrl(String url) { + try { + return URLEncoder.encode(url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + return url; + } + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/view/ConsoleView.java b/project/crawler-project/src/main/java/com/example/crawler/view/ConsoleView.java new file mode 100644 index 0000000..4929321 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/view/ConsoleView.java @@ -0,0 +1,64 @@ +package com.example.crawler.view; + +import com.example.crawler.command.Command; +import java.io.*; +import java.util.*; + +public class ConsoleView { + + private final BufferedReader reader; + + public ConsoleView() { + this.reader = new BufferedReader(new InputStreamReader(System.in)); + } + + public void displayWelcome() { + System.out.println("\n╔══════════════════════════════════════════════════════════╗"); + System.out.println("║ 多网站数据爬虫系统 v1.0 ║"); + System.out.println("╚══════════════════════════════════════════════════════════╝"); + } + + public void displayMenu(List commands) { + System.out.println("\n请选择要执行的操作:"); + for (int i = 0; i < commands.size(); i++) { + System.out.println(" " + (i + 1) + ". " + commands.get(i).getName()); + } + System.out.println(" 0. 退出"); + System.out.print("\n请输入选项: "); + } + + public int getUserChoice(int maxOption) { + while (true) { + try { + String line = reader.readLine(); + if (line == null) { + return 0; + } + int choice = Integer.parseInt(line.trim()); + if (choice >= 0 && choice <= maxOption) { + return choice; + } + System.out.print("无效选项,请重新输入: "); + } catch (NumberFormatException e) { + System.out.print("请输入有效的数字: "); + } catch (IOException e) { + return 0; + } + } + } + + public void displayResult(String message) { + System.out.println("\n" + message); + } + + public void displayError(String error) { + System.out.println("\n❌ 错误: " + error); + } + + public void close() { + try { + reader.close(); + } catch (IOException e) { + } + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/java/com/example/crawler/view/HtmlView.java b/project/crawler-project/src/main/java/com/example/crawler/view/HtmlView.java new file mode 100644 index 0000000..e42b895 --- /dev/null +++ b/project/crawler-project/src/main/java/com/example/crawler/view/HtmlView.java @@ -0,0 +1,198 @@ +package com.example.crawler.view; + +import com.example.crawler.model.Book; +import com.example.crawler.utils.FileUtils; +import java.util.*; + +public class HtmlView { + + public void generateBookStoreHtml(List books) { + StringBuilder html = new StringBuilder(); + + html.append("\n"); + html.append("\n"); + html.append("\n"); + html.append(" \n"); + html.append(" \n"); + html.append(" 书香阁 - 精品图书商城\n"); + html.append(" \n"); + html.append("\n"); + html.append("\n"); + + html.append(getHeader()); + html.append(getBanner()); + html.append(getCategoryNav()); + html.append(getProductSection("畅销排行", "hot", filterBooks(books, "fiction"))); + html.append(getProductSection("新书上架", "new", filterBooks(books, "tech"))); + html.append(getProductSection("编辑推荐", "recommend", books)); + html.append(getFooter()); + html.append(getJavaScript()); + + html.append("\n"); + html.append(""); + + try { + FileUtils.writeToFile(html.toString(), "data/book_store.html"); + System.out.println("🌐 HTML页面已生成: data/book_store.html"); + } catch (Exception e) { + System.err.println("生成HTML页面失败: " + e.getMessage()); + } + } + + private List filterBooks(List books, String category) { + List filtered = books.stream() + .filter(b -> category.equals(b.getCategory())) + .limit(4) + .toList(); + return filtered; + } + + private String getStyles() { + return """ + * { margin: 0; padding: 0; box-sizing: border-box; } + body { font-family: 'Microsoft YaHei', sans-serif; background: #f8fafc; } + .header { background: linear-gradient(135deg, #6366f1, #8b5cf6); padding: 12px 30px; display: flex; align-items: center; justify-content: space-between; position: sticky; top: 0; z-index: 100; } + .logo { display: flex; align-items: center; gap: 12px; cursor: pointer; } + .logo-text { color: white; font-size: 24px; font-weight: 700; } + .nav-menu { display: flex; gap: 40px; } + .nav-item { color: rgba(255,255,255,0.9); text-decoration: none; font-size: 15px; padding: 8px 16px; border-radius: 20px; transition: all 0.3s; } + .nav-item:hover { background: rgba(255,255,255,0.2); color: white; } + .banner { height: 400px; background: linear-gradient(135deg, #6366f1, #8b5cf6); display: flex; align-items: center; justify-content: center; color: white; text-align: center; } + .banner-title { font-size: 48px; font-weight: 800; margin-bottom: 20px; } + .category-section { background: white; padding: 25px 30px; margin: -30px 30px 30px; border-radius: 16px; box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1); } + .category-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 15px; } + .category-item { display: flex; flex-direction: column; align-items: center; gap: 10px; cursor: pointer; padding: 18px 12px; border-radius: 12px; transition: all 0.3s; } + .category-item:hover { background: rgba(99,102,241,0.05); transform: translateY(-4px); } + .category-icon { width: 56px; height: 56px; background: linear-gradient(135deg, #6366f1, #8b5cf6); border-radius: 12px; display: flex; align-items: center; justify-content: center; color: white; font-size: 26px; } + .product-section { padding: 0 30px 30px; } + .section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; } + .section-title { font-size: 22px; font-weight: 700; } + .product-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; } + .product-card { background: white; border-radius: 16px; overflow: hidden; box-shadow: 0 2px 10px rgba(0,0,0,0.05); transition: all 0.4s; cursor: pointer; } + .product-card:hover { transform: translateY(-8px); box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1); } + .product-image-wrapper { aspect-ratio: 3/4; background: linear-gradient(135deg, #f1f5f9, #e2e8f0); display: flex; align-items: center; justify-content: center; } + .product-image { width: 100%; height: 100%; object-fit: cover; } + .product-badge { position: absolute; top: 12px; left: 12px; background: #ef4444; color: white; font-size: 11px; padding: 4px 10px; border-radius: 6px; } + .product-info { padding: 18px; } + .product-title { font-size: 15px; font-weight: 600; margin-bottom: 6px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + .product-author { font-size: 13px; color: #64748b; margin-bottom: 12px; } + .product-price { font-size: 22px; font-weight: 700; color: #ef4444; } + .footer { background: linear-gradient(135deg, #1e293b, #0f172a); padding: 50px 30px 30px; color: white; } + .footer-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 40px; margin-bottom: 40px; } + .footer-links { list-style: none; } + .footer-links li { margin-bottom: 12px; } + .footer-links a { color: #94a3b8; text-decoration: none; } + .footer-bottom { text-align: center; padding-top: 30px; border-top: 1px solid rgba(255,255,255,0.1); color: #64748b; } + @media (max-width: 768px) { .product-grid { grid-template-columns: repeat(2, 1fr); } } + @media (max-width: 576px) { .product-grid { grid-template-columns: 1fr; } } + """; + } + + private String getHeader() { + return """ +
+ + +
+ """; + } + + private String getBanner() { + return """ + + """; + } + + private String getCategoryNav() { + return """ +
+
+
📖
小说文学
+
💻
科技互联网
+
📚
教育考试
+
🎨
少儿读物
+
🏛️
历史传记
+
💰
经济管理
+
🍳
生活百科
+
+
+ """; + } + + private String getProductSection(String title, String type, List books) { + if (books == null || books.isEmpty()) return ""; + + StringBuilder html = new StringBuilder(); + html.append("
\n"); + html.append("
\n"); + html.append("

").append(title).append("

\n"); + html.append("
\n"); + html.append("
\n"); + + for (Book book : books) { + String badge = type.equals("hot") ? "热销" : + type.equals("new") ? "新书" : ""; + String cover = book.getCoverUrl() != null ? + "\""" : + "📚"; + + html.append("
\n"); + html.append("
\n"); + html.append(" ").append(cover).append("\n"); + html.append(" ").append(badge).append("\n"); + html.append("
\n"); + html.append("
\n"); + html.append("
").append(FileUtils.escapeHtml(book.getTitle())).append("
\n"); + html.append("
").append(FileUtils.escapeHtml(book.getAuthor())).append("
\n"); + html.append("
¥").append(String.format("%.2f", book.getPrice())).append("
\n"); + html.append("
\n"); + html.append("
\n"); + } + + html.append("
\n"); + html.append("
\n"); + return html.toString(); + } + + private String getFooter() { + return """ + + """; + } + + private String getJavaScript() { + return """ + + """; + } +} \ No newline at end of file diff --git a/project/crawler-project/src/main/resources/logback.xml b/project/crawler-project/src/main/resources/logback.xml new file mode 100644 index 0000000..04a8df0 --- /dev/null +++ b/project/crawler-project/src/main/resources/logback.xml @@ -0,0 +1,22 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + crawler.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/project/crawler-project/test_job.bat b/project/crawler-project/test_job.bat new file mode 100644 index 0000000..54641fc --- /dev/null +++ b/project/crawler-project/test_job.bat @@ -0,0 +1,16 @@ +@echo off +chcp 65001 >nul +cd /d "%~dp0" + +set CLASSPATH=libs\gson-2.10.1.jar;libs\slf4j-api-2.0.9.jar;libs\slf4j-simple-2.0.9.jar;libs\json-20231013.jar;out + +echo ===== 招聘数据爬取测试 ===== +echo 2 > temp_input.txt +java -cp "%CLASSPATH%" com.example.crawler.Main < temp_input.txt +del temp_input.txt 2>nul + +echo. +echo ===== 检查data目录 ===== +dir data +echo. +echo ===== 完成 ===== \ No newline at end of file diff --git a/project/crawler-project/test_stock.bat b/project/crawler-project/test_stock.bat new file mode 100644 index 0000000..ddc8a43 --- /dev/null +++ b/project/crawler-project/test_stock.bat @@ -0,0 +1,18 @@ +@echo off +chcp 65001 >nul +cd /d "%~dp0" + +set CLASSPATH=libs\gson-2.10.1.jar;libs\slf4j-api-2.0.9.jar;libs\slf4j-simple-2.0.9.jar;libs\json-20231013.jar;out + +REM 股票爬取测试 +echo ===== 测试1: 股票数据爬取 ===== +echo 1 > temp_input.txt +java -cp "%CLASSPATH%" com.example.crawler.Main < temp_input.txt +del temp_input.txt + +echo. +echo ===== 检查data目录 ===== +dir data + +echo. +echo ===== 完成 ===== \ No newline at end of file