[
  {
    "path": ".gitignore",
    "content": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**\n!**/src/test/**\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n.sts4-cache\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\n/nbproject/private/\n/nbbuild/\n/dist/\n/nbdist/\n/.nb-gradle/\nbuild/\n\n### VS Code ###\n.vscode/\n"
  },
  {
    "path": "README-JAV.md",
    "content": "- IPX=265 5T2\n- SSNI=256 停更 5T2\n- SSIS=162 5T4\n- MIAA=135 5T5\n- STARS=132 5T3\n- MIDE=128 5T3\n- FSDSS=128 5T4\n- JUL=103 5T4\n- JUFE=85 5T5\n- HND=85 5T1\n- /\n- ABP=84 5T1\n- CAWD=71 5T4\n- FCH=66 停更 5T5\n- DASD=58 5T3\n- ABW=54 5T4\n- CJOD=53 5T5\n- PPPD=52 5T3\n- RKI=46 5T5\n- PRED=45 5T1\n- MGMQ=45 5T5\n- /\n- DPMI=45 5T3\n- DNJR=44 5T5\n- MSFH=42 5T5 停更\n- MKMP=41 5T3\n- MOPG=39 停更 5T5\n- DMOW=37 停更 5T5\n- GVH=37 5T3\n- OTIM=34 停更 5T3\n- GENM=33 5T5\n- MEYD=32 5T1\n- /\n- OKP=32 5T2\n- MVSD=31 5T3\n- WANZ=30 停更 5T1\n- MGMJ=30 停更 5T5\n- BLK=30 5T3\n- APNS=29 5T3\n- MGMP=27 5T5\n- EKDV=27 5T1\n- EBOD=26 5T2\n- OFJE=26 5T2\n- /\n- ARM=25 5T5\n- MDTM=23 5T1\n- AARM=22 5T5\n- IPVR=21 5T4\n- CLOT=18 5T5\n- TPPN=18 5T3\n- ECB=18 5T1\n- MMUS=16\n- DVAJ=16\n- SHKD=16\n\n\n---\n\nOVG-149\nPFES-003\nPFES-012\nRCTD-108\nSNIS-792\nSW-690\nXMOM-016\n\n---\n\nIPX-992\nIPX-838\nIPX-819\n\nIPX-916\nIPX-851\nIPX-832\nIPX-812\n\nJUFE-400\nJUFE-385\nJUFE-375\n\nCJOD-340\n\nRKI-623\n\nMGMQ\n\nMOPT-019\nMOPT-021\n\nAARM-109\nAARM-110\n\n松本いちか\n\nVRKM-497\nEBVR-035"
  },
  {
    "path": "README.md",
    "content": "# OpenYspider 4.x\n\n千万级图片、视频爬虫 [开源版本]\n\n![](swagger3.png)\n\n## 简介\n\nOpenYspider 是一个使用 Java 编写的简单爬虫。主要用到的技术栈有：\n\n1. spring-boot-starter-web\n2. spring-boot-starter-test\n3. mybatis-plus-boot-starter\n4. springfox-boot-starter\n5. lombok\n6. jsoup\n7. mockito + jacoco\n\n当前 LTS 的网站有：\n\n1. `tujidao.com`\n\nDeprecated 的网站（请于历史提交中查看）：\n\n1. `tangyun365.com`\n2. `yalayi.com`\n3. `rosmm88.com`\n4. `mzsock.com`\n5. `meinvla.net`\n6. `leetcode-cn.com`\n\n## 开发环境\n\n`Windows 11` + `JDK 17` + `Mysql 8.x`\n\n```sh\n$ java --version\nopenjdk 17.0.1 2021-10-19\nOpenJDK Runtime Environment (build 17.0.1+12-39)\nOpenJDK 64-Bit Server VM (build 17.0.1+12-39, mixed mode, sharing)\n```\n\n运行启动类 `OpenYspiderApplication` 后，浏览器访问 [http://localhost:23333/swagger-ui/index.html#/](http://localhost:23333/swagger-ui/index.html#/)\n\n数据库脚本: [sql_scripts](./sql_scripts/oys3_all_scripts_mysql.sql)\n\n## 爬取网站\n\n数据统计截止 2022-02-12\n\n### 1 图集岛（原美图日） [ 2,647,717P / 905G ]\n\n- 目标网站：[https://www.tujidao.com/](https://www.tujidao.com/)\n- 特点：图片路径可遍历\n\n```sql\nselect count(*) from oys_tujidao_album_t where album_id > 0 and album_id <= 10000; -- 9995 ok\nselect count(*) from oys_tujidao_album_t where album_id > 10000 and album_id <= 20000; -- 10000\nselect count(*) from oys_tujidao_album_t where album_id > 20000 and album_id <= 30000; -- 9999 [23001]\nselect count(*) from oys_tujidao_album_t where album_id > 30000 and album_id <= 40000; -- 10000\nselect count(*) from oys_tujidao_album_t where album_id > 40000 and album_id <= 50000; -- 8925 [46018]\n```\n\n## 部分成果展示\n\n![](result1.png)\n\n![](result2.png)\n"
  },
  {
    "path": "oys-boot-starter/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>openyspider</artifactId>\n        <groupId>com.devyy</groupId>\n        <version>${revision}</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>oys-boot-starter</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.devyy</groupId>\n            <artifactId>oys-tujidao</artifactId>\n            <version>${revision}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.devyy</groupId>\n            <artifactId>oys-codeforces</artifactId>\n            <version>${revision}</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <version>${org.springframework.boot.spring-boot-dependencies.version}</version>\n            </plugin>\n            <!-- https://www.baeldung.com/jacoco -->\n            <plugin>\n                <groupId>org.jacoco</groupId>\n                <artifactId>jacoco-maven-plugin</artifactId>\n                <version>${jacoco-maven-plugin.version}</version>\n                <executions>\n                    <execution>\n                        <id>report</id>\n                        <phase>verify</phase>\n                        <goals>\n                            <goal>report-aggregate</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "oys-boot-starter/src/main/java/com/devyy/oys/srarter/OpenYspiderApplication.java",
    "content": "package com.devyy.oys.srarter;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.ComponentScan;\n\n/**\n * 启动类\n *\n * @since 2019-12-01\n */\n@SpringBootApplication\n@ComponentScan(\"com.devyy.oys\")\npublic class OpenYspiderApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(OpenYspiderApplication.class, args);\n    }\n}\n\n"
  },
  {
    "path": "oys-boot-starter/src/main/java/com/devyy/oys/srarter/config/MybatisPlusConfig.java",
    "content": "package com.devyy.oys.srarter.config;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * Mybatis-Plus 配置类\n *\n * @since 2020-03-22\n */\n@Configuration\n@MapperScan(\"com.devyy.oys.**.dao\")\npublic class MybatisPlusConfig {\n}\n"
  },
  {
    "path": "oys-boot-starter/src/main/java/com/devyy/oys/srarter/config/Swagger3Config.java",
    "content": "package com.devyy.oys.srarter.config;\n\nimport io.swagger.annotations.ApiOperation;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.oas.annotations.EnableOpenApi;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\n\n/**\n * Swagger3 配置类\n *\n * http://localhost:23333/swagger-ui/index.html\n */\n@EnableOpenApi\n@Configuration\npublic class Swagger3Config {\n    @Bean\n    public Docket createRestApi() {\n        return new Docket(DocumentationType.OAS_30)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .title(\"OpenYspider 千万级图片爬虫、视频爬虫 [开源版本]\")\n                .description(\"Github: https://github.com/RxGirlz/OpenYspider\")\n                .version(\"v4.x\")\n                .build();\n    }\n\n}\n"
  },
  {
    "path": "oys-boot-starter/src/main/java/com/devyy/oys/srarter/main/JavMain.java",
    "content": "package com.devyy.oys.srarter.main;\n\nimport com.kennycason.kumo.CollisionMode;\nimport com.kennycason.kumo.WordCloud;\nimport com.kennycason.kumo.WordFrequency;\nimport com.kennycason.kumo.bg.CircleBackground;\nimport com.kennycason.kumo.font.scale.LinearFontScalar;\nimport com.kennycason.kumo.nlp.FrequencyAnalyzer;\nimport com.kennycason.kumo.nlp.normalize.UpperCaseNormalizer;\nimport com.kennycason.kumo.palette.ColorPalette;\nimport org.apache.commons.io.FileUtils;\n\nimport java.awt.*;\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\n/**\n * @since 2021-05-01\n */\npublic class JavMain {\n    /**\n     * Jav 文件夹目录\n     */\n    private static final String JAV_BASE_DIR = \"D:\\\\GITHUB\\\\Jav\";\n    /**\n     * CMD 输出命令\n     * dir /b /s > D:\\GITHUB\\Jav\\jav20220824.txt\n     */\n    private static final String JAV_FILE_NAME = \"jav20220824\";\n    private static final String JAV_INPUT_FILE = String.format(Locale.ENGLISH, \"%s/%s.txt\", JAV_BASE_DIR, JAV_FILE_NAME);\n    private static final String JAV_OUTPUT_FILE = String.format(Locale.ENGLISH, \"%s/%s.sh\", JAV_BASE_DIR, JAV_FILE_NAME);\n\n    public static void main(String[] args) {\n        // 打印命令行\n        doPrintCommand();\n        // 分析\n//        doAnalyse();\n        // 查重\n//        doFindRepeat();\n        // 词云\n//        doWordCloud();\n    }\n\n    /**\n     * 打印 echo 番号 shell 脚本\n     */\n    private static void doPrintCommand() {\n        try {\n            File inputFile = new File(JAV_INPUT_FILE);\n            List<String> fanHao = FileUtils.readLines(inputFile, StandardCharsets.UTF_8.name());\n            List<String> cmdList = fanHao.stream()\n                    // 过滤掉 jav202xxxxx.txt\n                    .filter(name -> !name.endsWith(\".txt\") && name.contains(\".\"))\n                    .map(name -> name.substring(name.lastIndexOf(\"\\\\\") + 1))\n                    .map(name -> String.format(Locale.ENGLISH, \"echo > %s.txt\", name))\n                    .collect(Collectors.toList());\n            File outputFile = new File(JAV_OUTPUT_FILE);\n            FileUtils.writeLines(outputFile, cmdList);\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n\n    private static Stream<String> getJavStream() {\n        File directory = new File(JAV_BASE_DIR);\n        // 递归遍历 Jav txt 文件\n        Collection<File> avFiles = FileUtils.listFiles(directory, new String[]{\"txt\"}, true);\n        return avFiles.stream().map(File::getName);\n    }\n\n    /**\n     * 统计分析 Jav 目录索引\n     */\n    private static void doAnalyse() {\n        long totals = getJavStream().map(name -> name.split(\"-\")[0]).count();\n        System.out.printf(Locale.ENGLISH, \"Jav totals: %s, Ranks:%n\", totals);\n        getJavStream()\n                .map(name -> name.split(\"-\")[0])\n                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))\n                .entrySet().stream()\n//                .filter(entry -> entry.getValue() >= 5)\n                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))\n                .entrySet().stream()\n                .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))\n                .forEach(System.out::println);\n    }\n\n    /**\n     * 查重\n     */\n    private static void doFindRepeat() {\n        getJavStream()\n                .map(name -> name.split(\"\\\\.\")[0])\n                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))\n                .entrySet().stream()\n                .filter(entry -> entry.getValue() > 1)\n                .forEach(System.out::println);\n    }\n\n    /**\n     * 输出词云\n     */\n    private static void doWordCloud() {\n        List<String> avPrefix = getJavStream()\n                .map(name -> name.split(\"-\")[0])\n//                .filter(str -> !str.equals(\"SSNI\") && !str.equals(\"IPX\"))\n                .collect(Collectors.toList());\n\n        final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();\n        frequencyAnalyzer.setNormalizer(new UpperCaseNormalizer());\n        final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(avPrefix);\n        final Dimension dimension = new Dimension(600, 600);\n        final WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);\n        wordCloud.setPadding(0);\n        wordCloud.setBackground(new CircleBackground(300));\n        wordCloud.setColorPalette(new ColorPalette(new Color(0x4055F1), new Color(0x408DF1), new Color(0x40AAF1), new Color(0x40C5F1), new Color(0x40D3F1), new Color(0xFFFFFF)));\n        wordCloud.setFontScalar(new LinearFontScalar(20, 160));\n        wordCloud.build(wordFrequencies);\n        wordCloud.writeToFile(JAV_BASE_DIR + \"/jav-wordCloud.png\");\n    }\n}\n"
  },
  {
    "path": "oys-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json",
    "content": "{\n  \"properties\": [\n    {\n      \"name\": \"oys.config.webdriver.chrome.driver.path\",\n      \"type\": \"java.lang.String\",\n      \"description\": \"webdriver.chrome.driver path（根据情况自定义）.\"\n    },\n    {\n      \"name\": \"oys.tujidao.url.prefix\",\n      \"type\": \"java.lang.String\",\n      \"description\": \"图集岛-相册信息目录路径前缀.\"\n    },\n    {\n      \"name\": \"oys.tujidao.img.url.prefix\",\n      \"type\": \"java.lang.String\",\n      \"description\": \"图集岛-图片资源目录路径前缀.\"\n    },\n    {\n      \"name\": \"oys.tujidao.local.folder.prefix\",\n      \"type\": \"java.lang.String\",\n      \"description\": \"图集岛-本地存储路径前缀（根据情况自定义）.\"\n    },\n    {\n      \"name\": \"oys.tujidao.local.preview.prefix\",\n      \"type\": \"java.lang.String\",\n      \"description\": \"图集岛-本地预览存储路径前缀（根据情况自定义）.\"\n    },\n    {\n      \"name\": \"oys.tujidao.local.cover.prefix\",\n      \"type\": \"java.lang.String\",\n      \"description\": \"图集岛-本地封面存储路径前缀（根据情况自定义）.\"\n    },\n    {\n      \"name\": \"oys.tujidao.local.cover.num.start\",\n      \"type\": \"java.lang.Integer\",\n      \"description\": \"图集岛-本地封面开始下标（根据情况自定义）.\"\n    },\n    {\n      \"name\": \"oys.tujidao.local.cover.num.end\",\n      \"type\": \"java.lang.Integer\",\n      \"description\": \"图集岛-本地封面结束下标（根据情况自定义）.\"\n    },\n    {\n      \"name\": \"oys.tujidao.local.preview.num.start\",\n      \"type\": \"java.lang.Integer\",\n      \"description\": \"图集岛-预下载开始下标（根据情况自定义）.\"\n    },\n    {\n      \"name\": \"oys.tujidao.local.preview.num.end\",\n      \"type\": \"java.lang.Integer\",\n      \"description\": \"图集岛-预下载结束下标（根据情况自定义）.\"\n    }\n  ]\n}"
  },
  {
    "path": "oys-boot-starter/src/main/resources/application-mysql.properties",
    "content": "datasource.url.1=jdbc:mysql://127.0.0.1:3306/dev?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC\ndatasource.user.1=root\ndatasource.password.1=123456\ndatasource.jdbcDriverClass.1=com.mysql.cj.jdbc.Driver"
  },
  {
    "path": "oys-boot-starter/src/main/resources/application.properties",
    "content": "spring.profiles.active=mysql\n# springboot 2.6.x\nspring.mvc.pathmatch.matching-strategy=ant_path_matcher\n# port\nserver.port=23333\n# spring datasource\nspring.datasource.url=${datasource.url.1}\nspring.datasource.username=${datasource.user.1}\nspring.datasource.password=${datasource.password.1}\nspring.datasource.driver-class-name=${datasource.jdbcDriverClass.1}\nspring.datasource.type=com.zaxxer.hikari.HikariDataSource\n# mybatis-plus\nmybatis-plus.type-aliases-package=com.devyy.*\n# self config\nserver.servlet.encoding.charset=utf-8\nserver.servlet.encoding.force=true\nserver.servlet.encoding.enabled=true\n# tujidao\noys.tujidao.url.prefix=https://www.tujidao03.com/u/?action=gengxin&page=\noys.tujidao.img.url.prefix=https://tjg.gzhuibei.com/a/1/\noys.tujidao.local.folder.prefix=D:/\\u56FE\\u96C6\\u5C9B\\u722C\\u866B\\uFF0850001-60000\\uFF09/\noys.tujidao.local.preview.prefix=D:/\\u56FE\\u96C6\\u5C9B\\u722C\\u866BPreview/\noys.tujidao.local.cover.prefix=D:/\\u56FE\\u96C6\\u5C9B\\u722C\\u866B\\u5C01\\u9762/\noys.tujidao.local.cover.num.start=58540\noys.tujidao.local.cover.num.end=59448\noys.tujidao.local.preview.num.start=58540\noys.tujidao.local.preview.num.end=59448\n# 56425-57050 625\n# 57051-57791 740\n# 57792-58539 747\n# 58540-59448 908\n# kafka\nspring.kafka.bootstrap-servers=localhost.ubuntu0.com:9092,localhost.ubuntu1.com:9092,localhost.ubuntu2.com:9092\nspring.kafka.consumer.auto-offset-reset=none\nspring.kafka.consumer.enable-auto-commit=false\n# redis\nspring.redis.cluster.nodes=localhost.ubuntu0.com:6379,localhost.ubuntu0.com:6380,localhost.ubuntu1.com:6379,localhost.ubuntu1.com:6380,localhost.ubuntu2.com:6379,localhost.ubuntu2.com:6380\nspring.redis.password=\n#spring.redis.host=local.ubuntu.com\n# mongodb\nspring.data.mongodb.uri="
  },
  {
    "path": "oys-codeforces/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>openyspider</artifactId>\n        <groupId>com.devyy</groupId>\n        <version>${revision}</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>oys-codeforces</artifactId>\n\n    <properties>\n        <maven.compiler.source>17</maven.compiler.source>\n        <maven.compiler.target>17</maven.compiler.target>\n    </properties>\n\n</project>"
  },
  {
    "path": "oys-codeforces/src/main/java/com/devyy/oys/codeforces/CfController.java",
    "content": "package com.devyy.oys.codeforces;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\n\nimport com.devyy.oys.codeforces.dao.CfMapper;\n\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.openqa.selenium.By;\nimport org.openqa.selenium.WebDriver;\nimport org.openqa.selenium.WebElement;\nimport org.openqa.selenium.chrome.ChromeDriver;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.kafka.core.KafkaTemplate;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.time.Duration;\nimport java.util.List;\n\n/**\n * Controller + ServiceImpl\n *\n * @since 2021-01-24\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/codeforces\")\n@Api(tags = \"Codeforces 爬虫\")\npublic class CfController {\n    @Value(\"${oys.codeforces.handleOrEmail:123}\")\n    private String handleOrEmail;\n\n    @Value(\"${oys.codeforces.password:123}\")\n    private String password;\n\n    @Autowired\n    private CfMapper cfMapper;\n\n    @ApiOperation(value = \"获取片段\")\n    @PostMapping(\"/step1\")\n    public String doGetFragment() throws InterruptedException {\n        System.setProperty(\"webdriver.chrome.driver\", \"D:\\\\GITHUB\\\\LTS\\\\codeforces-spider\\\\chromedriver.exe\");\n        WebDriver webDriver = new ChromeDriver();\n        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));\n\n        // login\n        webDriver.get(\"https://codeforces.com/enter?back=%2F\");\n        webDriver.findElement(By.id(\"handleOrEmail\")).sendKeys(handleOrEmail);\n        webDriver.findElement(By.id(\"password\")).sendKeys(password);\n        webDriver.findElement(By.id(\"remember\")).click();\n        webDriver.findElement(By.className(\"submit\")).click();\n        Thread.sleep(5000);\n\n        List<CfDO> cfDOList = cfMapper.selectList(new QueryWrapper<CfDO>().select().isNull(\"FRAGMENT\"));\n        log.info(\"==>cfDOList size={}\", cfDOList.size());\n        for (CfDO cfDO : cfDOList) {\n            String submissionId = cfDO.getSubmissionId();\n\n            String url = \"https://codeforces.com/contest/1593/submission/\" + submissionId;\n            log.info(\"==>url={}\", url);\n            try {\n                webDriver.get(url);\n                webDriver.findElement(By.className(\"click-to-view-tests\")).click();\n                Thread.sleep(3000);\n\n                List<WebElement> outputs = webDriver.findElements(By.className(\"output\"));\n                int size = outputs.size();\n                if (outputs.size() < 7) {\n                    Thread.sleep(3000);\n                    outputs = webDriver.findElements(By.className(\"output\"));\n                    size = outputs.size();\n                }\n\n                WebElement outputs8 = outputs.get(size - 1);\n                String fragment = outputs8.getText().substring(0, 500);\n                cfDO.setFragment(fragment);\n                log.info(fragment);\n\n                cfMapper.updateById(cfDO);\n                log.info(\"<==success submissionId={}\", submissionId);\n            } catch (Exception e) {\n                log.warn(\"<==failed submissionId={}\", submissionId);\n            }\n        }\n        webDriver.close();\n\n        return \"success\";\n    }\n\n    @ApiOperation(value = \"合并片段\")\n    @PostMapping(\"/step2\")\n    public String doMergeFragment() {\n        List<CfDO> cfDOList = cfMapper.selectList(new QueryWrapper<CfDO>().select().orderByAsc(\"NO\"));\n        log.info(\"==>cfDOList size={}\", cfDOList.size());\n        StringBuilder stringBuilder = new StringBuilder();\n        for (CfDO cfDO : cfDOList) {\n            String fragment = cfDO.getFragment();\n            stringBuilder.append(fragment);\n        }\n        log.info(\"==>doMergeFragment={}\", stringBuilder);\n\n        return \"success\";\n    }\n\n    @Autowired\n    private KafkaTemplate<String, String> kafkaTemplate;\n\n\n    @ApiOperation(value = \"Kafka\")\n    @PostMapping(\"/step3\")\n    public String testKafka() {\n        kafkaTemplate.send(\"T_ubuntu\", \"test\");\n        log.info(\"==>kafkaTemplate.send success\");\n        return \"success\";\n    }\n\n    @Autowired\n    private StringRedisTemplate stringRedisTemplate;\n\n    @ApiOperation(value = \"redis\")\n    @PostMapping(\"/step4\")\n    public String testRedis() {\n        stringRedisTemplate.boundValueOps(\"ubuntu:redis:test\").set(\"hello\");\n        log.info(\"==>redis set success\");\n\n        String value = stringRedisTemplate.boundValueOps(\"ubuntu:redis:test\").get();\n        log.info(\"==>redis get value={}\", value);\n        return \"success\";\n    }\n}\n"
  },
  {
    "path": "oys-codeforces/src/main/java/com/devyy/oys/codeforces/CfDO.java",
    "content": "package com.devyy.oys.codeforces;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\n\nimport lombok.Data;\n\n/**\n * Entity 实体类\n *\n * @since 2021-01-24\n */\n@Data\n@TableName(\"oys_codeforces\")\npublic class CfDO {\n    @TableId(\"SUBMISSION_ID\")\n    private String submissionId;\n\n    @TableField(\"NO\")\n    private Long no;\n\n    @TableField(\"FRAGMENT\")\n    private String fragment;\n}\n"
  },
  {
    "path": "oys-codeforces/src/main/java/com/devyy/oys/codeforces/dao/CfMapper.java",
    "content": "package com.devyy.oys.codeforces.dao;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\nimport com.devyy.oys.codeforces.CfDO;\n\nimport org.springframework.stereotype.Repository;\n\n/**\n * Mybatis-Plus Mapper\n *\n * @since 2021-01-24\n */\n@Repository\npublic interface CfMapper extends BaseMapper<CfDO> {\n}\n"
  },
  {
    "path": "oys-core/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>openyspider</artifactId>\n        <groupId>com.devyy</groupId>\n        <version>${revision}</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>oys-core</artifactId>\n\n\n</project>"
  },
  {
    "path": "oys-core/src/main/java/com/devyy/oys/srarter/core/enums/StateTypeEnum.java",
    "content": "package com.devyy.oys.srarter.core.enums;\n\nimport lombok.Getter;\n\n/**\n * 资源状态\n *\n * @since 2019-12-01\n */\n@Getter\npublic enum StateTypeEnum {\n    /**\n     * 黑名单\n     */\n    BLACKLIST(-1, \"黑名单\"),\n    /**\n     * 白名单\n     */\n    WHITELIST(0, \"白名单\"),\n\n    //\n\n    /**\n     * 下载完成\n     */\n    DONE(102, \"下载完成\"),\n    /**\n     * 下载中\n     */\n    DOWNLOADING(101, \"下载中\"),\n    /**\n     * 未开始/待重试\n     */\n    STARTED(100, \"未开始/待重试\"),\n\n    //\n\n    /**\n     * 已解析--album专用\n     */\n    ANALYSIS(200, \"已解析\"),\n    /**\n     * 未达预期\n     */\n    EXCEPTION(500, \"未达预期\"),\n    /**\n     * 找不到资源\n     */\n    NOTFOUND(404, \"找不到资源\"),\n\n    ;\n\n    private final int seq;\n    private final String desc;\n\n    StateTypeEnum(int seq, String desc) {\n        this.seq = seq;\n        this.desc = desc;\n    }\n}\n"
  },
  {
    "path": "oys-core/src/main/java/com/devyy/oys/srarter/core/util/SpiderUtil.java",
    "content": "package com.devyy.oys.srarter.core.util;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.apache.commons.io.FileUtils;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.net.URLConnection;\n\n/**\n * 爬虫工具类\n *\n * @since 2019-12-01\n */\n@Slf4j\npublic class SpiderUtil {\n    private static boolean ioDownload2(String onlineUrl, String localUrl, int timeout) {\n        try {\n            URL source = new URL(onlineUrl);\n            File destination = new File(localUrl);\n//            FileUtils.copyURLToFile(new URL(onlineUrl), new File(localUrl), timeout, timeout);\n\n            final URLConnection connection = source.openConnection();\n            connection.setRequestProperty(\"Referer\", \"https://www.tujidao.com/\");\n            connection.setConnectTimeout(timeout);\n            connection.setReadTimeout(timeout);\n            try (final InputStream stream = connection.getInputStream()) {\n                FileUtils.copyInputStreamToFile(stream, destination);\n            }\n\n            log.info(\"==>io下载成功 localUrl={}\", localUrl);\n            return true;\n        } catch (Exception e) {\n            if (!(e instanceof FileNotFoundException)) {\n                log.warn(\"FileUtils.copyURLToFile failed={} e.message={}\", onlineUrl, e.getMessage());\n            }\n            return false;\n        }\n    }\n\n    /**\n     * 带重试次数\n     *\n     * @param onlineUrl onlineUrl\n     * @param localUrl  localUrl\n     * @param times     重试次数\n     * @return success\n     */\n    public static boolean ioDownload2Times(String onlineUrl, String localUrl, int times) {\n        if (times < 0) {\n            return false;\n        } else {\n            // timeout 递增\n            int timeout = 10000;\n            if (times < 1) {\n                timeout = 30000;\n            } else if (times < 2) {\n                timeout = 20000;\n            }\n            boolean success = ioDownload2(onlineUrl, localUrl, timeout);\n            if (!success) {\n                return ioDownload2Times(onlineUrl, localUrl, times - 1);\n            }\n        }\n        return true;\n    }\n\n\n    /**\n     * 图片移动\n     *\n     * @param oldPath 原始路径\n     * @param newPath 目标路径\n     */\n    public static void fileMove(String oldPath, String newPath) {\n        File oldName = new File(oldPath);\n        File newName = new File(newPath);\n        oldName.renameTo(newName);\n    }\n\n    /**\n     * 图片移动\n     *\n     * @param oldPath 原始路径\n     * @param newPath 目标路径\n     */\n    public static void fileCopy(String oldPath, String newPath) {\n        File oldName = new File(oldPath);\n        File newName = new File(newPath);\n        try {\n            FileUtils.copyFile(oldName, newName);\n            log.info(\"==>fileCopy success oldPath={} newPath={}\", oldPath, newPath);\n        } catch (IOException e) {\n            log.warn(\"==>fileCopy failed oldPath={} newPath={}\", oldPath, newPath);\n        }\n    }\n}"
  },
  {
    "path": "oys-tujidao/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>openyspider</artifactId>\n        <groupId>com.devyy</groupId>\n        <version>${revision}</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>oys-tujidao</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>com.devyy</groupId>\n            <artifactId>oys-core</artifactId>\n            <version>${revision}</version>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "oys-tujidao/src/main/java/com/devyy/oys/tujidao/TuJiDaoAlbumDO.java",
    "content": "package com.devyy.oys.tujidao;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\n\nimport lombok.Data;\n\n/**\n * 实体类\n *\n * @since 2019-12-01\n */\n@Data\n@TableName(\"oys_tujidao_album_t\")\npublic class TuJiDaoAlbumDO {\n    /**\n     * 自增 ID\n     */\n    @TableId(type = IdType.AUTO)\n    private Long id;\n\n    /**\n     * 状态\n     *\n     * @see com.devyy.oys.srarter.core.enums.StateTypeEnum\n     */\n    private Integer state;\n\n    /**\n     * 总数\n     */\n    private Integer total;\n\n    /**\n     * 相册名\n     */\n    @TableField(\"album_name\")\n    private String albumName;\n\n    /**\n     * 相册 ID\n     */\n    @TableField(\"album_id\")\n    private Integer albumId;\n}\n"
  },
  {
    "path": "oys-tujidao/src/main/java/com/devyy/oys/tujidao/TuJiDaoController.java",
    "content": "package com.devyy.oys.tujidao;\n\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * REST 接口层\n *\n * @since 2019-12-01\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/tujidao\")\n@Api(tags = \"图集岛爬虫\")\npublic class TuJiDaoController {\n    @Autowired\n    private TuJiDaoService tujidaoService;\n\n    /**\n     * 预下载\n     *\n     * @return \"success\"\n     */\n    @ApiOperation(value = \"预下载\")\n    @PostMapping(\"/step1\")\n    public String step1() {\n        return tujidaoService.doPreDownload();\n    }\n\n    /**\n     * 生成封面\n     *\n     * @return \"success\"\n     */\n    @ApiOperation(value = \"生成封面\")\n    @PostMapping(\"/step2\")\n    public String step2() {\n        return tujidaoService.doGenerateCover();\n    }\n\n    /**\n     * 同步更新记录\n     *\n     * @return \"success\"\n     */\n    @ApiOperation(value = \"同步更新记录\")\n    @PostMapping(\"/step3\")\n    public String step3() {\n        return tujidaoService.doSyncRecords();\n    }\n\n    /**\n     * 本地迁移\n     *\n     * @return \"success\"\n     */\n    @ApiOperation(value = \"本地迁移\")\n    @PostMapping(\"/step4\")\n    public String step4() {\n        return tujidaoService.doLocalMigration();\n    }\n}\n"
  },
  {
    "path": "oys-tujidao/src/main/java/com/devyy/oys/tujidao/TuJiDaoService.java",
    "content": "package com.devyy.oys.tujidao;\n\n/**\n * Service 层\n *\n * @since 2019-12-01\n */\npublic interface TuJiDaoService {\n    /**\n     * 预下载\n     *\n     * @return success\n     * @since 2019-12-08\n     */\n    String doPreDownload();\n\n    /**\n     * 生成封面\n     *\n     * @return success\n     * @since 2019-12-08\n     */\n    String doGenerateCover();\n\n    /**\n     * 同步更新记录\n     *\n     * @return success\n     */\n    String doSyncRecords();\n\n    /**\n     * 本地迁移\n     *\n     * @return success\n     * @since 2019-12-08\n     */\n    String doLocalMigration();\n}\n"
  },
  {
    "path": "oys-tujidao/src/main/java/com/devyy/oys/tujidao/TuJiDaoServiceImpl.java",
    "content": "package com.devyy.oys.tujidao;\n\nimport com.devyy.oys.srarter.core.enums.StateTypeEnum;\nimport com.devyy.oys.srarter.core.util.SpiderUtil;\nimport com.devyy.oys.tujidao.dao.TuJiDaoAlbumMapper;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.apache.commons.io.FileUtils;\nimport org.apache.commons.io.filefilter.DirectoryFileFilter;\n\nimport org.jsoup.Jsoup;\nimport org.jsoup.nodes.Document;\n\nimport org.jsoup.nodes.Element;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport javax.net.ssl.HostnameVerifier;\nimport javax.net.ssl.HttpsURLConnection;\n\nimport java.io.File;\nimport java.io.FilenameFilter;\nimport java.io.IOException;\nimport java.text.MessageFormat;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.regex.Pattern;\n\n/**\n * Service 层实现\n *\n * @since 2019-12-01\n */\n@Slf4j\n@Service\npublic class TuJiDaoServiceImpl implements TuJiDaoService {\n    /**\n     * 源站网页 url\n     */\n    @Value(\"${oys.tujidao.url.prefix}\")\n    private String tjdWebUrlPrefix;\n\n    /**\n     * 源站图片 cdn\n     */\n    @Value(\"${oys.tujidao.img.url.prefix}\")\n    private String tjdImgUrlPrefix;\n\n    /**\n     * 本地归档目录\n     */\n    @Value(\"${oys.tujidao.local.folder.prefix}\")\n    private String tjdLocalFolderPrefix;\n\n    /**\n     * 本地 Preview 目录\n     */\n    @Value(\"${oys.tujidao.local.preview.prefix}\")\n    private String tjdLocalPreviewPrefix;\n\n    /**\n     * 本地封面目录\n     */\n    @Value(\"${oys.tujidao.local.cover.prefix}\")\n    private String tjdLocalCoverPrefix;\n\n    /**\n     * 封面范围 [start, end]\n     */\n    @Value(\"${oys.tujidao.local.cover.num.start}\")\n    private Integer tjdCoverStart;\n    @Value(\"${oys.tujidao.local.cover.num.end}\")\n    private Integer tjdLocalCoverEnd;\n\n    /**\n     * Preview 范围 [start, end]\n     */\n    @Value(\"${oys.tujidao.local.preview.num.start}\")\n    private Integer tjdPreviewStart;\n    @Value(\"${oys.tujidao.local.preview.num.end}\")\n    private Integer tjdPreviewEnd;\n\n    @Autowired\n    private TuJiDaoAlbumMapper tuJiDaoAlbumMapper;\n\n    @Override\n    public String doPreDownload() {\n        ExecutorService executors = Executors.newFixedThreadPool(8);\n        for (int i = tjdPreviewStart; i <= tjdPreviewEnd; i++) {\n            final int finalI = i;\n            executors.submit(() -> downloadByAlbumId(String.valueOf(finalI)));\n        }\n        return \"success\";\n    }\n\n    static Map<Integer, Integer> map = new HashMap<>();\n\n    static {\n        map.put(119, 50);\n        map.put(1562, 86);\n        map.put(293, 129);\n        map.put(313, 100);\n        map.put(331, 116);\n        map.put(338, 80);\n        map.put(37, 80);\n        map.put(3849, 100);\n        map.put(543, 16);\n        map.put(714, 61);\n        map.put(716, 68);\n        map.put(727, 69);\n\n        map.put(16471, 24);\n        map.put(16681, 46);\n        map.put(16968, 75);\n        map.put(17058, 100);\n\n        map.put(32793, 158);\n        map.put(34456, 44);\n        map.put(35381, 33);\n        map.put(35527, 150);\n        map.put(35534, 58);\n        map.put(35576, 21);\n        map.put(35697, 39);\n        map.put(35854, 25);\n        map.put(36655, 60);\n        map.put(36656, 52);\n        map.put(36658, 68);\n        map.put(36659, 73);\n        map.put(36697, 76);\n        map.put(36698, 52);\n        map.put(36700, 80);\n        map.put(36701, 92);\n        map.put(37180, 45);\n        map.put(38013, 41);\n        map.put(38313, 42);\n        map.put(38432, 35);\n        map.put(39740, 48);\n\n        map.put(44264, 17);\n        map.put(45681, 42);\n        map.put(45697, 19);\n        map.put(46207, 16);\n        map.put(48080, 62);\n    }\n\n    private void downloadByAlbumId(String albumId) {\n        String localFolder = tjdLocalPreviewPrefix + albumId + \"/\";\n        // 若文件夹路径不存在，则新建\n        File file = new File(localFolder);\n        if (!file.exists()) {\n            if (!file.mkdirs()) {\n                log.error(\"==>localFolder={} 创建文件路径失败\", localFolder);\n                return;\n            }\n        }\n        // 顺序扫描直到 404\n        for (int i = 0; ; i++) {\n            String onlinePath = String.format(Locale.CHINESE, \"%s%s/%d.jpg\", tjdImgUrlPrefix, albumId, i);\n            String localPath = String.format(Locale.CHINESE, \"%s%d.jpg\", localFolder, i);\n\n            // 幂等，若当前文件未下载，则进行下载\n            File file2 = new File(localPath);\n            if (!file2.exists()) {\n                if (!SpiderUtil.ioDownload2Times(onlinePath, localPath, 3)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    @Override\n    public String doGenerateCover() {\n        // 若文件夹路径不存在，则新建\n        File file = new File(tjdLocalCoverPrefix);\n        if (!file.exists()) {\n            if (!file.mkdirs()) {\n                log.error(\"==>localFolder={} 创建文件路径失败\", tjdLocalCoverPrefix);\n                return \"error\";\n            }\n        }\n\n        // 选取 1.jpg 作为封面\n        for (int i = tjdCoverStart; i <= tjdLocalCoverEnd; i++) {\n            String onlinePath = String.format(Locale.CHINESE, \"%s%d/1.jpg\", tjdLocalPreviewPrefix, i);\n            String localPath = String.format(Locale.CHINESE, \"%s%d-1.jpg\", tjdLocalCoverPrefix, i);\n\n            // 幂等，若当前文件未下载，则进行下载\n            File file2 = new File(localPath);\n            if (!file2.exists()) {\n                SpiderUtil.fileCopy(onlinePath, localPath);\n            }\n        }\n        return \"success\";\n    }\n\n    @Override\n    public String doSyncRecords() {\n        // 解决 cookie 和 https 问题\n        Map<String, String> cookiesMap = buildCookies();\n        try {\n            trustAllHttpsCertificates();\n        } catch (Exception e) {\n            log.error(\"==>TujidaoService#doScanAlbums failed e=\", e);\n        }\n        HttpsURLConnection.setDefaultHostnameVerifier(hv);\n\n        Document document = null;\n        // 55625-56283 659\n        // 56284-56939 656\n        // 56940-57639 700\n        // 57640-58330 690\n        for (int i = 1; i <= 50; i++) {\n            try {\n                document = Jsoup.connect(tjdWebUrlPrefix + i).cookies(cookiesMap).get();\n            } catch (IOException e) {\n                log.error(\"==>url={} e={}\", tjdWebUrlPrefix + i, e.getMessage());\n            }\n            if (Objects.isNull(document)) {\n                continue;\n            }\n            Element heziElement = document.getElementsByClass(\"hezi\").first();\n            if (Objects.isNull(heziElement)) {\n                continue;\n            }\n\n            heziElement.getElementsByTag(\"li\").forEach(liElement -> {\n                Element biaotiElement = liElement.getElementsByClass(\"biaoti\").first();\n                Element shuliangElement = liElement.getElementsByClass(\"shuliang\").first();\n\n                if (biaotiElement == null || shuliangElement == null) {\n                    return;\n                }\n\n                int albumId = Integer.parseInt(liElement.attr(\"id\"));\n                int total = Integer.parseInt(shuliangElement.text().replace(\"P\", \"\"));\n                String albumName = MessageFormat.format(\"{0}-[{1}P] {2}\",\n                        String.valueOf(albumId), total, rmIllegalName(biaotiElement.text()));\n\n                TuJiDaoAlbumDO tjdDO = new TuJiDaoAlbumDO();\n                tjdDO.setAlbumId(albumId);\n                tjdDO.setAlbumName(albumName);\n                tjdDO.setTotal(total);\n                tjdDO.setState(StateTypeEnum.STARTED.getSeq());\n\n                // 幂等，保证记录数唯一\n                Map<String, Object> queryMap = new HashMap<>(1);\n                queryMap.put(\"album_id\", tjdDO.getAlbumId());\n                if (CollectionUtils.isEmpty(tuJiDaoAlbumMapper.selectByMap(queryMap))) {\n                    tuJiDaoAlbumMapper.insert(tjdDO);\n                    log.info(\"album_id={} 同步成功,total={},title={}\",\n                            tjdDO.getAlbumId(), tjdDO.getTotal(), tjdDO.getAlbumName());\n                } else {\n                    log.warn(\"album_id={} 已存在\", tjdDO.getAlbumId());\n                }\n            });\n        }\n        return \"success\";\n    }\n\n    @Override\n    public String doLocalMigration() {\n        Map<String, Object> queryMap = new HashMap<>(1);\n        queryMap.put(\"state\", StateTypeEnum.STARTED.getSeq());\n        tuJiDaoAlbumMapper.selectByMap(queryMap).forEach(albumDO -> {\n            int total = albumDO.getTotal();\n            int albumId = albumDO.getAlbumId();\n            String albumName = albumDO.getAlbumName();\n            String localFolder = tjdLocalFolderPrefix + albumName;\n\n            // 若文件夹路径不存在，则新建\n            File file = new File(localFolder);\n            if (!file.exists()) {\n                if (!file.mkdirs()) {\n                    log.error(\"==>localFolder={} 创建文件路径失败\", localFolder);\n                    return;\n                }\n            }\n\n            // 2022-01-16 针对源站已经隐去 图片数 信息 fix\n            if (total == -1) {\n                String previewDir = tjdLocalPreviewPrefix + albumId;\n                total = FileUtils.listFiles(new File(previewDir), new String[]{\"jpg\"}, false).size() - 1;\n            }\n\n            for (int i = 0; i <= total; i++) {\n                String onlinePath = String.format(Locale.CHINESE, \"%s%s/%d.jpg\", tjdLocalPreviewPrefix, albumId, i);\n                String localPath = String.format(Locale.CHINESE, \"%s/%d.jpg\", localFolder, i);\n\n                // 幂等，若当前文件未下载，则进行下载\n                File file2 = new File(localPath);\n                if (!file2.exists()) {\n                    SpiderUtil.fileMove(onlinePath, localPath);\n                }\n            }\n            albumDO.setState(StateTypeEnum.ANALYSIS.getSeq());\n            tuJiDaoAlbumMapper.updateById(albumDO);\n            log.info(\"==>albumId={} 相册已本地迁移完成\", albumId);\n        });\n        return \"success\";\n    }\n\n    private Map<String, String> buildCookies() {\n        Map<String, String> cookiesMap = new HashMap<>();\n        cookiesMap.put(\"TujidaoService%5Fid\", \"411999177-1588406642-%7C1600614708\");\n        cookiesMap.put(\"PHPSESSID\", \"uulfluqmbunauqqjnj4mf8i8dr\");\n        cookiesMap.put(\"UM_distinctid\", \"171d493d83c1c-074736cab8c8d9-670103b-1fa400-171d493d83d151\");\n        cookiesMap.put(\"atpsida\", \"7a72b6965366155670da7487_1600614730_4\");\n        cookiesMap.put(\"cna\", \"MkUPF0HprU0CAXWIT4ixum+C\");\n        cookiesMap.put(\"leixing\", \"0\");\n        cookiesMap.put(\"name\", \"rxgirlz\");\n        cookiesMap.put(\"sca\", \"5cafd77a\");\n        cookiesMap.put(\"uid\", \"157108\");\n        return cookiesMap;\n    }\n\n    private final HostnameVerifier hv = (s, sslSession) -> true;\n\n    private void trustAllHttpsCertificates() throws Exception {\n        javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];\n        javax.net.ssl.TrustManager tm = new miTM();\n        trustAllCerts[0] = tm;\n        javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance(\"SSL\");\n        sc.init(null, trustAllCerts, null);\n        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());\n    }\n\n    private static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {\n        public java.security.cert.X509Certificate[] getAcceptedIssuers() {\n            return null;\n        }\n\n        public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {\n            return true;\n        }\n\n        public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {\n            return true;\n        }\n\n        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)\n                throws java.security.cert.CertificateException {\n            return;\n        }\n\n        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)\n                throws java.security.cert.CertificateException {\n            return;\n        }\n\n    }\n\n    /**\n     * 文件不合法名正则\n     */\n    private static final Pattern FILE_PATTERN = Pattern.compile(\"[\\\\\\\\/:*?\\\"<>|]\");\n\n    /**\n     * 去除不合法文件名\n     */\n    private String rmIllegalName(String s) {\n        return FILE_PATTERN.matcher(s).replaceAll(\"\");\n    }\n\n    static String[] jpgs = {\n            \"D:/图集岛爬虫Preview/49322/20.jpg\",\n            \"D:/图集岛爬虫Preview/49323/13.jpg\",\n            \"D:/图集岛爬虫Preview/49324/34.jpg\",\n            \"D:/图集岛爬虫Preview/49331/49.jpg\",\n            \"D:/图集岛爬虫Preview/49332/22.jpg\",\n            \"D:/图集岛爬虫Preview/49340/19.jpg\",\n            \"D:/图集岛爬虫Preview/49340/83.jpg\",\n            \"D:/图集岛爬虫Preview/49349/38.jpg\",\n            \"D:/图集岛爬虫Preview/49355/56.jpg\",\n            \"D:/图集岛爬虫Preview/49357/83.jpg\",\n            \"D:/图集岛爬虫Preview/49360/42.jpg\",\n            \"D:/图集岛爬虫Preview/49366/1.jpg\",\n            \"D:/图集岛爬虫Preview/49367/13.jpg\",\n            \"D:/图集岛爬虫Preview/49369/20.jpg\",\n            \"D:/图集岛爬虫Preview/49372/1.jpg\",\n            \"D:/图集岛爬虫Preview/49374/61.jpg\",\n            \"D:/图集岛爬虫Preview/49380/27.jpg\",\n            \"D:/图集岛爬虫Preview/49382/23.jpg\",\n            \"D:/图集岛爬虫Preview/49386/28.jpg\",\n            \"D:/图集岛爬虫Preview/49387/20.jpg\",\n            \"D:/图集岛爬虫Preview/49387/21.jpg\",\n            \"D:/图集岛爬虫Preview/49388/88.jpg\",\n            \"D:/图集岛爬虫Preview/49390/8.jpg\",\n            \"D:/图集岛爬虫Preview/49392/23.jpg\",\n            \"D:/图集岛爬虫Preview/49393/26.jpg\",\n            \"D:/图集岛爬虫Preview/49397/82.jpg\",\n            \"D:/图集岛爬虫Preview/49408/8.jpg\",\n            \"D:/图集岛爬虫Preview/49410/91.jpg\",\n            \"D:/图集岛爬虫Preview/49412/30.jpg\",\n            \"D:/图集岛爬虫Preview/49414/21.jpg\",\n            \"D:/图集岛爬虫Preview/49418/5.jpg\",\n            \"D:/图集岛爬虫Preview/49420/8.jpg\",\n            \"D:/图集岛爬虫Preview/49421/22.jpg\",\n            \"D:/图集岛爬虫Preview/49421/42.jpg\",\n            \"D:/图集岛爬虫Preview/49424/9.jpg\",\n            \"D:/图集岛爬虫Preview/49425/19.jpg\",\n            \"D:/图集岛爬虫Preview/49426/68.jpg\",\n            \"D:/图集岛爬虫Preview/49426/82.jpg\",\n            \"D:/图集岛爬虫Preview/49432/28.jpg\",\n            \"D:/图集岛爬虫Preview/49501/34.jpg\",\n            \"D:/图集岛爬虫Preview/49501/52.jpg\",\n            \"D:/图集岛爬虫Preview/49503/19.jpg\",\n            \"D:/图集岛爬虫Preview/49503/40.jpg\",\n            \"D:/图集岛爬虫Preview/49508/14.jpg\",\n            \"D:/图集岛爬虫Preview/49512/33.jpg\",\n            \"D:/图集岛爬虫Preview/49513/1.jpg\",\n            \"D:/图集岛爬虫Preview/49521/34.jpg\",\n            \"D:/图集岛爬虫Preview/49522/31.jpg\",\n            \"D:/图集岛爬虫Preview/49537/26.jpg\",\n            \"D:/图集岛爬虫Preview/49544/1.jpg\",\n            \"D:/图集岛爬虫Preview/49544/11.jpg\",\n            \"D:/图集岛爬虫Preview/49544/4.jpg\",\n            \"D:/图集岛爬虫Preview/49547/43.jpg\",\n            \"D:/图集岛爬虫Preview/49550/5.jpg\",\n            \"D:/图集岛爬虫Preview/49551/16.jpg\",\n            \"D:/图集岛爬虫Preview/49551/65.jpg\",\n            \"D:/图集岛爬虫Preview/49559/6.jpg\",\n            \"D:/图集岛爬虫Preview/49562/75.jpg\",\n            \"D:/图集岛爬虫Preview/49563/42.jpg\",\n            \"D:/图集岛爬虫Preview/49563/55.jpg\",\n            \"D:/图集岛爬虫Preview/49563/9.jpg\",\n            \"D:/图集岛爬虫Preview/49565/17.jpg\",\n            \"D:/图集岛爬虫Preview/49574/1.jpg\",\n            \"D:/图集岛爬虫Preview/49574/4.jpg\",\n            \"D:/图集岛爬虫Preview/49578/12.jpg\",\n            \"D:/图集岛爬虫Preview/49578/15.jpg\",\n            \"D:/图集岛爬虫Preview/49578/27.jpg\",\n            \"D:/图集岛爬虫Preview/49583/28.jpg\",\n            \"D:/图集岛爬虫Preview/49591/64.jpg\",\n            \"D:/图集岛爬虫Preview/49598/10.jpg\",\n            \"D:/图集岛爬虫Preview/49599/38.jpg\",\n            \"D:/图集岛爬虫Preview/49601/42.jpg\",\n            \"D:/图集岛爬虫Preview/49602/64.jpg\",\n            \"D:/图集岛爬虫Preview/49602/75.jpg\",\n            \"D:/图集岛爬虫Preview/49605/31.jpg\",\n            \"D:/图集岛爬虫Preview/49606/40.jpg\",\n            \"D:/图集岛爬虫Preview/49608/15.jpg\",\n            \"D:/图集岛爬虫Preview/49611/27.jpg\",\n            \"D:/图集岛爬虫Preview/49611/45.jpg\",\n            \"D:/图集岛爬虫Preview/49614/36.jpg\",\n            \"D:/图集岛爬虫Preview/49627/28.jpg\",\n            \"D:/图集岛爬虫Preview/49627/7.jpg\",\n            \"D:/图集岛爬虫Preview/49628/51.jpg\",\n            \"D:/图集岛爬虫Preview/49628/76.jpg\",\n            \"D:/图集岛爬虫Preview/49629/47.jpg\",\n            \"D:/图集岛爬虫Preview/49633/11.jpg\",\n            \"D:/图集岛爬虫Preview/49637/5.jpg\",\n            \"D:/图集岛爬虫Preview/49639/24.jpg\",\n            \"D:/图集岛爬虫Preview/49640/12.jpg\",\n            \"D:/图集岛爬虫Preview/49645/21.jpg\",\n            \"D:/图集岛爬虫Preview/49646/41.jpg\",\n            \"D:/图集岛爬虫Preview/49653/12.jpg\",\n            \"D:/图集岛爬虫Preview/49658/11.jpg\",\n            \"D:/图集岛爬虫Preview/49665/2.jpg\",\n            \"D:/图集岛爬虫Preview/49666/72.jpg\",\n            \"D:/图集岛爬虫Preview/49671/4.jpg\",\n            \"D:/图集岛爬虫Preview/49672/22.jpg\",\n            \"D:/图集岛爬虫Preview/49677/25.jpg\",\n            \"D:/图集岛爬虫Preview/49677/27.jpg\",\n            \"D:/图集岛爬虫Preview/49691/23.jpg\",\n            \"D:/图集岛爬虫Preview/49702/1.jpg\",\n            \"D:/图集岛爬虫Preview/49704/9.jpg\",\n            \"D:/图集岛爬虫Preview/49706/48.jpg\",\n            \"D:/图集岛爬虫Preview/49713/5.jpg\",\n            \"D:/图集岛爬虫Preview/49716/10.jpg\",\n            \"D:/图集岛爬虫Preview/49721/18.jpg\",\n            \"D:/图集岛爬虫Preview/49722/0.jpg\",\n            \"D:/图集岛爬虫Preview/49722/28.jpg\",\n            \"D:/图集岛爬虫Preview/49722/3.jpg\",\n            \"D:/图集岛爬虫Preview/49722/31.jpg\",\n            \"D:/图集岛爬虫Preview/49724/8.jpg\",\n            \"D:/图集岛爬虫Preview/49725/2.jpg\",\n            \"D:/图集岛爬虫Preview/49742/27.jpg\",\n            \"D:/图集岛爬虫Preview/49750/5.jpg\",\n            \"D:/图集岛爬虫Preview/49755/1.jpg\",\n            \"D:/图集岛爬虫Preview/49763/52.jpg\",\n            \"D:/图集岛爬虫Preview/49763/63.jpg\",\n            \"D:/图集岛爬虫Preview/49770/38.jpg\",\n            \"D:/图集岛爬虫Preview/49771/49.jpg\",\n            \"D:/图集岛爬虫Preview/49774/38.jpg\",\n            \"D:/图集岛爬虫Preview/49778/41.jpg\",\n            \"D:/图集岛爬虫Preview/49779/11.jpg\",\n            \"D:/图集岛爬虫Preview/49779/3.jpg\",\n            \"D:/图集岛爬虫Preview/49780/21.jpg\",\n            \"D:/图集岛爬虫Preview/49784/46.jpg\",\n            \"D:/图集岛爬虫Preview/49789/25.jpg\",\n            \"D:/图集岛爬虫Preview/49789/36.jpg\",\n            \"D:/图集岛爬虫Preview/49791/47.jpg\",\n            \"D:/图集岛爬虫Preview/49792/13.jpg\",\n            \"D:/图集岛爬虫Preview/49804/15.jpg\",\n            \"D:/图集岛爬虫Preview/49805/14.jpg\",\n            \"D:/图集岛爬虫Preview/49805/24.jpg\",\n            \"D:/图集岛爬虫Preview/49805/4.jpg\",\n            \"D:/图集岛爬虫Preview/49805/7.jpg\",\n            \"D:/图集岛爬虫Preview/49815/49.jpg\",\n            \"D:/图集岛爬虫Preview/49816/75.jpg\",\n            \"D:/图集岛爬虫Preview/49818/6.jpg\",\n            \"D:/图集岛爬虫Preview/49819/26.jpg\",\n            \"D:/图集岛爬虫Preview/49822/13.jpg\",\n            \"D:/图集岛爬虫Preview/49822/18.jpg\",\n            \"D:/图集岛爬虫Preview/49823/11.jpg\",\n            \"D:/图集岛爬虫Preview/49826/15.jpg\",\n            \"D:/图集岛爬虫Preview/49830/62.jpg\",\n            \"D:/图集岛爬虫Preview/49836/2.jpg\",\n            \"D:/图集岛爬虫Preview/49842/20.jpg\",\n            \"D:/图集岛爬虫Preview/49842/35.jpg\",\n            \"D:/图集岛爬虫Preview/49858/45.jpg\",\n            \"D:/图集岛爬虫Preview/49859/1.jpg\",\n            \"D:/图集岛爬虫Preview/49863/46.jpg\",\n            \"D:/图集岛爬虫Preview/49863/5.jpg\",\n            \"D:/图集岛爬虫Preview/49870/17.jpg\",\n            \"D:/图集岛爬虫Preview/49874/6.jpg\",\n            \"D:/图集岛爬虫Preview/49878/46.jpg\",\n            \"D:/图集岛爬虫Preview/49879/15.jpg\",\n            \"D:/图集岛爬虫Preview/49885/20.jpg\",\n            \"D:/图集岛爬虫Preview/49891/13.jpg\",\n            \"D:/图集岛爬虫Preview/49891/68.jpg\",\n            \"D:/图集岛爬虫Preview/49895/69.jpg\",\n            \"D:/图集岛爬虫Preview/49900/18.jpg\",\n            \"D:/图集岛爬虫Preview/49900/33.jpg\",\n            \"D:/图集岛爬虫Preview/49901/14.jpg\",\n            \"D:/图集岛爬虫Preview/49905/71.jpg\",\n            \"D:/图集岛爬虫Preview/49909/5.jpg\",\n            \"D:/图集岛爬虫Preview/49910/32.jpg\",\n            \"D:/图集岛爬虫Preview/49916/39.jpg\",\n            \"D:/图集岛爬虫Preview/49933/29.jpg\",\n            \"D:/图集岛爬虫Preview/49933/41.jpg\",\n            \"D:/图集岛爬虫Preview/49936/32.jpg\",\n            \"D:/图集岛爬虫Preview/49942/46.jpg\",\n            \"D:/图集岛爬虫Preview/49954/79.jpg\",\n            \"D:/图集岛爬虫Preview/49960/54.jpg\",\n            \"D:/图集岛爬虫Preview/49962/21.jpg\",\n            \"D:/图集岛爬虫Preview/49962/34.jpg\",\n            \"D:/图集岛爬虫Preview/49964/7.jpg\",\n            \"D:/图集岛爬虫Preview/49967/9.jpg\",\n            \"D:/图集岛爬虫Preview/49969/1.jpg\",\n            \"D:/图集岛爬虫Preview/49969/55.jpg\",\n            \"D:/图集岛爬虫Preview/49969/85.jpg\",\n            \"D:/图集岛爬虫Preview/49975/40.jpg\",\n            \"D:/图集岛爬虫Preview/49976/3.jpg\",\n            \"D:/图集岛爬虫Preview/49977/19.jpg\",\n            \"D:/图集岛爬虫Preview/49978/25.jpg\",\n            \"D:/图集岛爬虫Preview/49978/38.jpg\",\n            \"D:/图集岛爬虫Preview/49978/51.jpg\",\n            \"D:/图集岛爬虫Preview/49979/18.jpg\",\n            \"D:/图集岛爬虫Preview/49980/4.jpg\",\n            \"D:/图集岛爬虫Preview/49984/16.jpg\",\n            \"D:/图集岛爬虫Preview/49984/7.jpg\",\n            \"D:/图集岛爬虫Preview/49986/48.jpg\",\n            \"D:/图集岛爬虫Preview/49988/24.jpg\",\n            \"D:/图集岛爬虫Preview/49999/48.jpg\",\n            \"D:/图集岛爬虫Preview/49999/53.jpg\",\n            \"D:/图集岛爬虫Preview/49999/57.jpg\",\n            \"D:/图集岛爬虫Preview/49999/64.jpg\",\n            \"D:/图集岛爬虫Preview/49999/8.jpg\",\n            \"D:/图集岛爬虫Preview/50000/16.jpg\",\n            \"D:/图集岛爬虫Preview/50000/17.jpg\",\n            \"D:/图集岛爬虫Preview/50002/38.jpg\",\n            \"D:/图集岛爬虫Preview/50003/20.jpg\",\n            \"D:/图集岛爬虫Preview/50004/20.jpg\",\n            \"D:/图集岛爬虫Preview/50004/7.jpg\",\n            \"D:/图集岛爬虫Preview/50006/42.jpg\",\n            \"D:/图集岛爬虫Preview/50007/9.jpg\",\n            \"D:/图集岛爬虫Preview/50012/75.jpg\",\n            \"D:/图集岛爬虫Preview/50021/25.jpg\",\n            \"D:/图集岛爬虫Preview/50022/46.jpg\",\n            \"D:/图集岛爬虫Preview/50026/4.jpg\",\n            \"D:/图集岛爬虫Preview/50028/1.jpg\",\n            \"D:/图集岛爬虫Preview/50028/4.jpg\",\n            \"D:/图集岛爬虫Preview/50030/19.jpg\",\n            \"D:/图集岛爬虫Preview/50031/6.jpg\",\n            \"D:/图集岛爬虫Preview/50032/1.jpg\",\n            \"D:/图集岛爬虫Preview/50035/38.jpg\",\n            \"D:/图集岛爬虫Preview/50038/18.jpg\",\n            \"D:/图集岛爬虫Preview/50038/2.jpg\",\n            \"D:/图集岛爬虫Preview/50038/34.jpg\",\n            \"D:/图集岛爬虫Preview/50042/28.jpg\",\n            \"D:/图集岛爬虫Preview/50042/38.jpg\",\n            \"D:/图集岛爬虫Preview/50043/6.jpg\",\n            \"D:/图集岛爬虫Preview/50048/10.jpg\",\n            \"D:/图集岛爬虫Preview/50048/13.jpg\",\n            \"D:/图集岛爬虫Preview/50048/18.jpg\",\n            \"D:/图集岛爬虫Preview/50048/3.jpg\",\n            \"D:/图集岛爬虫Preview/50048/35.jpg\",\n            \"D:/图集岛爬虫Preview/50048/4.jpg\",\n            \"D:/图集岛爬虫Preview/50053/10.jpg\",\n            \"D:/图集岛爬虫Preview/50053/19.jpg\",\n            \"D:/图集岛爬虫Preview/50053/39.jpg\",\n            \"D:/图集岛爬虫Preview/50053/8.jpg\",\n            \"D:/图集岛爬虫Preview/50053/9.jpg\",\n            \"D:/图集岛爬虫Preview/50066/39.jpg\",\n            \"D:/图集岛爬虫Preview/50068/2.jpg\",\n            \"D:/图集岛爬虫Preview/50069/63.jpg\",\n            \"D:/图集岛爬虫Preview/50069/64.jpg\",\n            \"D:/图集岛爬虫Preview/50071/43.jpg\",\n            \"D:/图集岛爬虫Preview/50077/41.jpg\",\n            \"D:/图集岛爬虫Preview/50083/3.jpg\",\n            \"D:/图集岛爬虫Preview/50088/19.jpg\",\n            \"D:/图集岛爬虫Preview/50089/1.jpg\",\n            \"D:/图集岛爬虫Preview/50091/15.jpg\",\n            \"D:/图集岛爬虫Preview/50091/19.jpg\",\n            \"D:/图集岛爬虫Preview/50100/36.jpg\",\n            \"D:/图集岛爬虫Preview/50101/18.jpg\",\n            \"D:/图集岛爬虫Preview/50101/2.jpg\",\n            \"D:/图集岛爬虫Preview/50102/8.jpg\",\n            \"D:/图集岛爬虫Preview/50103/24.jpg\",\n            \"D:/图集岛爬虫Preview/50106/61.jpg\",\n            \"D:/图集岛爬虫Preview/50109/22.jpg\",\n            \"D:/图集岛爬虫Preview/50110/11.jpg\",\n            \"D:/图集岛爬虫Preview/50113/53.jpg\",\n            \"D:/图集岛爬虫Preview/50114/23.jpg\",\n            \"D:/图集岛爬虫Preview/50114/4.jpg\",\n            \"D:/图集岛爬虫Preview/50117/1.jpg\",\n            \"D:/图集岛爬虫Preview/50120/13.jpg\",\n            \"D:/图集岛爬虫Preview/50121/4.jpg\",\n            \"D:/图集岛爬虫Preview/50121/6.jpg\",\n            \"D:/图集岛爬虫Preview/50125/0.jpg\",\n            \"D:/图集岛爬虫Preview/50126/39.jpg\",\n            \"D:/图集岛爬虫Preview/50131/30.jpg\",\n            \"D:/图集岛爬虫Preview/50140/12.jpg\",\n            \"D:/图集岛爬虫Preview/50142/9.jpg\",\n            \"D:/图集岛爬虫Preview/50149/12.jpg\",\n            \"D:/图集岛爬虫Preview/50151/57.jpg\",\n            \"D:/图集岛爬虫Preview/50154/54.jpg\",\n            \"D:/图集岛爬虫Preview/50160/19.jpg\",\n            \"D:/图集岛爬虫Preview/50160/21.jpg\",\n            \"D:/图集岛爬虫Preview/50167/33.jpg\",\n            \"D:/图集岛爬虫Preview/50170/16.jpg\",\n            \"D:/图集岛爬虫Preview/50170/2.jpg\",\n            \"D:/图集岛爬虫Preview/50174/22.jpg\",\n            \"D:/图集岛爬虫Preview/50176/4.jpg\",\n            \"D:/图集岛爬虫Preview/50177/19.jpg\",\n            \"D:/图集岛爬虫Preview/50179/7.jpg\",\n            \"D:/图集岛爬虫Preview/50181/1.jpg\",\n            \"D:/图集岛爬虫Preview/50181/8.jpg\",\n            \"D:/图集岛爬虫Preview/50183/4.jpg\",\n            \"D:/图集岛爬虫Preview/50189/16.jpg\",\n            \"D:/图集岛爬虫Preview/50192/17.jpg\",\n            \"D:/图集岛爬虫Preview/50192/24.jpg\",\n            \"D:/图集岛爬虫Preview/50192/36.jpg\",\n            \"D:/图集岛爬虫Preview/50193/26.jpg\",\n            \"D:/图集岛爬虫Preview/50194/8.jpg\",\n            \"D:/图集岛爬虫Preview/50319/22.jpg\"\n    };\n\n    private static void reDownload() {\n        String directoryStr = \"F:/图集岛爬虫Preview/\";\n        for (String jpg : jpgs) {\n            String tmp = jpg.replace(directoryStr, \"\");\n\n            String albumId = tmp.split(\"-\")[0];\n            String fileName = tmp.split(\"/\")[1];\n\n            String onlinePath = \"https://tjg.gzhuibei.com/a/1/\" + albumId + \"/\" + fileName;\n\n            SpiderUtil.ioDownload2Times(onlinePath, jpg, 3);\n        }\n    }\n\n    private static void delSize0() {\n        String part = \"图集岛爬虫Preview\";\n        String directoryStr = \"F:/\" + part + \"/\";\n        File directory = new File(directoryStr);\n\n        File[] folders = directory.listFiles((FilenameFilter) DirectoryFileFilter.DIRECTORY);\n        if (folders == null) {\n            return;\n        }\n        for (File folder : folders) {\n            String folderName = folder.getName();\n            String subDirectoryStr = directoryStr + folderName;\n\n            File subDirectory = new File(subDirectoryStr);\n            Collection<File> jpgFiles = FileUtils.listFiles(subDirectory, new String[]{\"jpg\"}, false);\n            for (File jpg : jpgFiles) {\n                if (jpg.length() == 0) {\n\n//                    jpg.delete();\n                    System.out.println(\"size0 jpg=\" + subDirectoryStr + \"/\" + jpg.getName());\n                }\n            }\n        }\n    }\n\n    public static void main(String[] args) {\n//        reDownload();\n\n//        delSize0();\n\n        Set<String> zipFileNames = new HashSet<>();\n        Set<String> fileNames = new HashSet<>();\n        File zipDirectory = new File(\"F:/zip图集岛爬虫（40001-50000）/\");\n        File directory = new File(\"F:/图集岛爬虫（40001-50000）/\");\n\n        Collection<File> zipFiles = FileUtils.listFiles(zipDirectory, new String[]{\"zip\"}, false);\n        for (File folder : zipFiles) {\n            String folderName = folder.getName();\n            zipFileNames.add(folderName.replace(\".zip\", \"\"));\n        }\n\n        File[] folders = directory.listFiles((FilenameFilter) DirectoryFileFilter.DIRECTORY);\n        if (folders == null) {\n            return;\n        }\n        for (File folder : folders) {\n            String folderName = folder.getName();\n            fileNames.add(folderName);\n        }\n\n        fileNames.removeAll(zipFileNames);\n        System.out.println(fileNames);\n    }\n}\n"
  },
  {
    "path": "oys-tujidao/src/main/java/com/devyy/oys/tujidao/dao/TuJiDaoAlbumMapper.java",
    "content": "package com.devyy.oys.tujidao.dao;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\nimport com.devyy.oys.tujidao.TuJiDaoAlbumDO;\n\nimport org.springframework.stereotype.Repository;\n\n/**\n * Mybatis-Plus Mapper\n *\n * @since 2019-12-01\n */\n@Repository\npublic interface TuJiDaoAlbumMapper extends BaseMapper<TuJiDaoAlbumDO> {\n\n}\n"
  },
  {
    "path": "oys-tujidao/src/test/java/com/devyy/oys/tujidao/TuJiDaoServiceImplTest.java",
    "content": "package com.devyy.oys.tujidao;\n\nimport com.devyy.oys.tujidao.dao.TuJiDaoAlbumMapper;\n\nimport org.jsoup.Jsoup;\nimport org.jsoup.nodes.Document;\n\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\n\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.MockedStatic;\nimport org.mockito.Mockito;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.net.URL;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\n\n/**\n * TuJiDaoServiceImpl UT\n *\n * @since 2022-01-18\n */\n@ExtendWith(MockitoExtension.class)\npublic class TuJiDaoServiceImplTest {\n    @InjectMocks\n    private final TuJiDaoServiceImpl tuJiDaoService = new TuJiDaoServiceImpl();\n\n    @Mock\n    private TuJiDaoAlbumMapper tuJiDaoAlbumMapper;\n\n    @Test\n    public void doSyncRecords() throws IOException {\n        // mock 网页\n        URL url = getClass().getResource(\"/gengxin2.html\");\n        Assertions.assertNotNull(url);\n        File file = new File(url.getPath());\n        Document document = Jsoup.parse(file, StandardCharsets.UTF_8.name());\n\n        // mock Jsoup.connect().cookies().get()\n        MockedStatic<Jsoup> jsoupMockedStatic = Mockito.mockStatic(Jsoup.class, Mockito.RETURNS_DEEP_STUBS);\n        jsoupMockedStatic.when(() -> Jsoup.connect(Mockito.anyString()).cookies(Mockito.anyMap()).get())\n                .thenReturn(document);\n\n        // mock tuJiDaoAlbumMapper.selectByMap()\n        Mockito.when(tuJiDaoAlbumMapper.selectByMap(Mockito.anyMap())).thenReturn(new ArrayList<>());\n\n        // mock tuJiDaoAlbumMapper.insert()\n        Mockito.when(tuJiDaoAlbumMapper.insert(Mockito.any())).thenReturn(1);\n\n        // doTest\n        tuJiDaoService.doSyncRecords();\n        // verify\n        jsoupMockedStatic.verify(() -> Jsoup.connect(Mockito.anyString()), Mockito.atLeastOnce());\n        Mockito.verify(tuJiDaoAlbumMapper, Mockito.atLeastOnce()).insert(Mockito.any());\n    }\n}"
  },
  {
    "path": "oys-tujidao/src/test/resources/gengxin.html",
    "content": "\n<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n    <meta http-equiv=\"Cache-Control\" content=\"no-transform\" />\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\" />\n    <title>更新记录_图集岛</title>\n    <script type=\"text/javascript\" src=\"https://www.tujidao.com/Static/css/jquery.js\"></script>\n    <script type=\"text/javascript\" src=\"https://www.tujidao.com/Static/css/lazyload.js\"></script>\n    <script src=\"https://www.layuicdn.com/layui/layui.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.layuicdn.com/layui/css/layui.css\" />\n\n    <script language=\"javascript\" src=\"https://www.tujidao.com/Static/css/viewer.js\"></script>\n    <script>\n        $(document).ready(function(){\n\n            $(\"#onmenu\").click(function() {\n\n\n                $(\"#onmenu\").toggle();\n                $(\"#offmenu\").toggle();\n                $(\"#caidian\").animate({ height: 'show', opacity: 'show' }, 'slow');\n\n\n            });\n\n\n            $(\"#offmenu\").click(function() {\n\n                $(\"#offmenu\").toggle();\n                $(\"#onmenu\").toggle();\n                $(\"#caidian\").animate({ height: 'hide', opacity: 'hide' }, 'slow');\n\n            });\n\n\n        });\n\n    </script>\n    <link href=\"https://www.tujidao.com/Static/css/css.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div class=\"top\">\n    <ul class=\"menu\">\n        <li class=\"my\"><a href=\"/u/\"><i class=\"layui-icon layui-icon-username\"></i></a></li>\n        <li class=\"logo\"><a href=\"/\">图集岛</a></li>\n        <li class=\"tj\"><i class=\"layui-icon layui-icon-shrink-right\" id=\"onmenu\"></i><i class=\"layui-icon layui-icon-close\" id=\"offmenu\"></i></li>\n    </ul>\n</div>\n\n<div class=\"c\"></div>\n\n\n\n<div id=\"caidian\">\n\n    <div class=\"caidan\">\n        <div class=\"sousu\"><form action=\"/sousu/\" method=\"post\"><input name=\"s0\" type=\"text\" value=\"\" placeholder=\"请输入关键词\"><button type=\"submit\">搜 索</button></form></div>\n\n        <div class=\"layui-tab layui-tab-brief\" lay-filter=\"docDemoTabBrief\">\n            <ul class=\"layui-tab-title\">\n                <li class=\"layui-this\">标签类型</li>\n                <li>机构厂商</li>\n                <li>地区</li>\n\n            </ul>\n            <div class=\"layui-tab-content\">\n                <div class=\"layui-tab-item layui-show\">\n\n                    <div class=\"tags\">\n\n\n                        <a href=\"/s/?id=47\">极品</a>\n                        <a href=\"/s/?id=55\">美少女</a>\n                        <a href=\"/s/?id=62\">御姐</a>\n                        <a href=\"/s/?id=59\">女神</a>\n                        <a href=\"/s/?id=80\">日本少女</a>\n                        <a href=\"/s/?id=85\">嫩模</a>\n                        <a href=\"/s/?id=84\">妹子</a>\n                        <a href=\"/s/?id=45\">尤物</a>\n                        <a href=\"/s/?id=83\">正妹</a>\n                        <a href=\"/s/?id=87\">熟女</a>\n                        <a href=\"/s/?id=99\">乙女</a>\n                        <a href=\"/s/?id=100\">女星</a>\n                        <a href=\"/s/?id=81\">阳光</a>\n                        <a href=\"/s/?id=116\">网红</a>\n                        <a href=\"/s/?id=132\">少FU</a>\n                        <a href=\"/s/?id=138\">日本少FU</a>\n                        <a href=\"/s/?id=215\">泳装少女</a>\n                        <a href=\"/s/?id=151\">软妹</a>\n                        <a href=\"/s/?id=150\">日本妹子</a>\n                        <a href=\"/s/?id=149\">萌女</a>\n                        <a href=\"/s/?id=154\">车模</a>\n                        <a href=\"/s/?id=159\">女优</a>\n                        <a href=\"/s/?id=166\">少女</a>\n                        <a href=\"/s/?id=165\">日本嫩模</a>\n                        <a href=\"/s/?id=187\">清纯少女</a>\n                        <a href=\"/s/?id=186\">性感少女</a>\n                        <a href=\"/s/?id=185\">混血</a>\n                        <a href=\"/s/?id=184\">黑长直</a>\n                        <a href=\"/s/?id=119\">明星</a>\n                        <a href=\"/s/?id=194\">杂志</a>\n                        <a href=\"/s/?id=197\">欧美熟女</a>\n                        <a href=\"/s/?id=196\">金发</a>\n                        <a href=\"/s/?id=201\">黑人</a>\n                        <a href=\"/s/?id=212\">女郎</a>\n                        <a href=\"/s/?id=214\">轻熟女</a>\n                        <a href=\"/s/?id=227\">巨RU女优</a>\n                        <a href=\"/s/?id=251\">女友</a>\n                        <a href=\"/s/?id=254\">白领</a>\n                        <a href=\"/s/?id=40\">萝莉</a>\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>风格</legend></fieldset>\n\n                        <a href=\"/s/?id=14\">可爱</a>\n                        <a href=\"/s/?id=32\">甜美</a>\n                        <a href=\"/s/?id=23\">清纯</a>\n                        <a href=\"/s/?id=35\">性感</a>\n                        <a href=\"/s/?id=34\">气质</a>\n                        <a href=\"/s/?id=52\">妩媚</a>\n                        <a href=\"/s/?id=51\">清新</a>\n                        <a href=\"/s/?id=54\">唯美</a>\n                        <a href=\"/s/?id=33\">美胸</a>\n                        <a href=\"/s/?id=42\">诱惑</a>\n                        <a href=\"/s/?id=41\">私房</a>\n                        <a href=\"/s/?id=46\">翘T</a>\n                        <a href=\"/s/?id=44\">大胆</a>\n                        <a href=\"/s/?id=43\">福利</a>\n                        <a href=\"/s/?id=53\">大胸</a>\n                        <a href=\"/s/?id=111\">高贵</a>\n                        <a href=\"/s/?id=121\">粉嫩</a>\n                        <a href=\"/s/?id=95\">惊艳</a>\n                        <a href=\"/s/?id=94\">白嫩</a>\n                        <a href=\"/s/?id=91\">养眼</a>\n                        <a href=\"/s/?id=89\">巨RU</a>\n                        <a href=\"/s/?id=73\">情趣</a>\n                        <a href=\"/s/?id=29\">短发</a>\n                        <a href=\"/s/?id=202\">丰T</a>\n                        <a href=\"/s/?id=242\">丰满</a>\n                        <a href=\"/s/?id=236\">巨RU萝莉</a>\n                        <a href=\"/s/?id=232\">勾魂</a>\n                        <a href=\"/s/?id=231\">半裸</a>\n                        <a href=\"/s/?id=230\">欧美大胸</a>\n                        <a href=\"/s/?id=229\">蕾丝诱惑</a>\n                        <a href=\"/s/?id=228\">制服诱惑</a>\n                        <a href=\"/s/?id=221\">丰满少F</a>\n                        <a href=\"/s/?id=220\">风骚少F</a>\n                        <a href=\"/s/?id=219\">风骚</a>\n                        <a href=\"/s/?id=218\">顶级少F</a>\n                        <a href=\"/s/?id=206\">美T少F</a>\n                        <a href=\"/s/?id=202\">肥TUN</a>\n                        <a href=\"/s/?id=195\">欧美巨RU</a>\n                        <a href=\"/s/?id=192\">学生</a>\n                        <a href=\"/s/?id=191\">肉感</a>\n                        <a href=\"/s/?id=189\">双马尾</a>\n                        <a href=\"/s/?id=183\">大尺度</a>\n                        <a href=\"/s/?id=181\">骨感</a>\n                        <a href=\"/s/?id=162\">长发</a>\n                        <a href=\"/s/?id=161\">冷艳</a>\n                        <a href=\"/s/?id=158\">包T</a>\n                        <a href=\"/s/?id=160\">美T</a>\n                        <a href=\"/s/?id=153\">爆RU</a>\n                        <a href=\"/s/?id=137\">魅惑</a>\n                        <a href=\"/s/?id=136\">优雅</a>\n                        <a href=\"/s/?id=133\">美RU</a>\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>丝 · 腿 · 足</legend></fieldset>\n                        <a href=\"/s/?id=213\">丝袜女郎</a>\n                        <a href=\"/s/?id=253\">黑丝萝莉</a>\n                        <a href=\"/s/?id=252\">白丝萝莉</a>\n                        <a href=\"/s/?id=12\">长筒袜</a>\n                        <a href=\"/s/?id=15\">丝袜</a>\n                        <a href=\"/s/?id=72\">黑丝</a>\n                        <a href=\"/s/?id=71\">丝袜美腿</a>\n                        <a href=\"/s/?id=109\">灰丝</a>\n                        <a href=\"/s/?id=31\">美腿</a>\n                        <a href=\"/s/?id=76\">高跟</a>\n                        <a href=\"/s/?id=88\">腿模</a>\n                        <a href=\"/s/?id=79\">丝袜诱惑</a>\n                        <a href=\"/s/?id=78\">网袜</a>\n                        <a href=\"/s/?id=105\">丝足</a>\n                        <a href=\"/s/?id=104\">白丝</a>\n                        <a href=\"/s/?id=103\">肉丝</a>\n                        <a href=\"/s/?id=129\">红丝</a>\n                        <a href=\"/s/?id=143\">吊带丝袜</a>\n                        <a href=\"/s/?id=142\">美脚</a>\n                        <a href=\"/s/?id=141\">玉足</a>\n                        <a href=\"/s/?id=140\">情趣丝袜</a>\n                        <a href=\"/s/?id=139\">美足</a>\n                        <a href=\"/s/?id=155\">网衣</a>\n                        <a href=\"/s/?id=169\">长腿</a>\n                        <a href=\"/s/?id=168\">凉高跟</a>\n                        <a href=\"/s/?id=167\">高跟美腿</a>\n                        <a href=\"/s/?id=199\">欧美制服</a>\n                        <a href=\"/s/?id=198\">欧美丝袜</a>\n                        <a href=\"/s/?id=205\">街拍美T</a>\n                        <a href=\"/s/?id=204\">丝袜美T</a>\n                        <a href=\"/s/?id=249\">美丝</a>\n                        <a href=\"/s/?id=208\">丝足高跟</a>\n                        <a href=\"/s/?id=207\">丝足诱惑</a>\n                        <a href=\"/s/?id=243\">街拍丝袜</a>\n                        <a href=\"/s/?id=240\">丝袜人体</a>\n                        <a href=\"/s/?id=239\">丝袜短裙</a>\n                        <a href=\"/s/?id=238\">街拍短裙</a>\n                        <a href=\"/s/?id=237\">丝袜制服</a>\n                        <a href=\"/s/?id=235\">街拍美腿</a>\n                        <a href=\"/s/?id=234\">街拍高跟</a>\n                        <a href=\"/s/?id=233\">丝袜肥T</a>\n                        <a href=\"/s/?id=226\">街拍黑丝</a>\n                        <a href=\"/s/?id=225\">黑丝制服</a>\n                        <a href=\"/s/?id=224\">黑丝美腿</a>\n                        <a href=\"/s/?id=223\">丝袜熟女</a>\n                        <a href=\"/s/?id=222\">丝袜少F</a>\n                        <a href=\"/s/?id=258\">肉丝美腿</a>\n                        <a href=\"/s/?id=259\">黑丝诱惑</a>\n                        <a href=\"/s/?id=257\">情趣制服</a>\n\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>情趣</legend></fieldset>\n                        <a href=\"/s/?id=135\">薄纱</a>\n                        <a href=\"/s/?id=255\">剧情</a>\n                        <a href=\"/s/?id=93\">肚兜</a>\n                        <a href=\"/s/?id=69\">旗袍</a>\n                        <a href=\"/s/?id=112\">空姐</a>\n                        <a href=\"/s/?id=9\">赛车女郎</a>\n                        <a href=\"/s/?id=20\">护士</a>\n                        <a href=\"/s/?id=21\">运动</a>\n                        <a href=\"/s/?id=27\">女仆</a>\n                        <a href=\"/s/?id=26\">兔女郎</a>\n                        <a href=\"/s/?id=28\">制服</a>\n                        <a href=\"/s/?id=36\">COS</a>\n                        <a href=\"/s/?id=48\">猫女</a>\n                        <a href=\"/s/?id=108\">美束</a>\n                        <a href=\"/s/?id=68\">古典</a>\n                        <a href=\"/s/?id=67\">SM</a>\n                        <a href=\"/s/?id=63\">圣诞</a>\n                        <a href=\"/s/?id=50\">湿身</a>\n                        <a href=\"/s/?id=70\">人体</a>\n                        <a href=\"/s/?id=125\">厨娘</a>\n                        <a href=\"/s/?id=124\">JK</a>\n                        <a href=\"/s/?id=123\">女警</a>\n                        <a href=\"/s/?id=122\">老师</a>\n                        <a href=\"/s/?id=120\">医生</a>\n                        <a href=\"/s/?id=106\">新年</a>\n                        <a href=\"/s/?id=67\">捆绑</a>\n                        <a href=\"/s/?id=67\">绳艺</a>\n                        <a href=\"/s/?id=250\">眼镜</a>\n                        <a href=\"/s/?id=211\">不知火舞</a>\n                        <a href=\"/s/?id=210\">COSER</a>\n                        <a href=\"/s/?id=209\">清纯护士</a>\n                        <a href=\"/s/?id=148\">纹身</a>\n                        <a href=\"/s/?id=147\">OL</a>\n                        <a href=\"/s/?id=146\">秘书</a>\n                        <a href=\"/s/?id=115\">调教</a>\n                        <a href=\"/s/?id=114\">镣铐</a>\n                        <a href=\"/s/?id=130\">姐妹花</a>\n                        <a href=\"/s/?id=134\">透视</a>\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>场景</legend></fieldset>\n                        <a href=\"/s/?id=200\">桌球</a>\n                        <a href=\"/s/?id=75\">浴室</a>\n                        <a href=\"/s/?id=102\">篮球</a>\n                        <a href=\"/s/?id=92\">拳击</a>\n                        <a href=\"/s/?id=90\">足球</a>\n                        <a href=\"/s/?id=82\">居家</a>\n                        <a href=\"/s/?id=10\">办公室</a>\n                        <a href=\"/s/?id=65\">街拍</a>\n                        <a href=\"/s/?id=74\">外拍</a>\n                        <a href=\"/s/?id=96\">海边</a>\n                        <a href=\"/s/?id=118\">展台</a>\n                        <a href=\"/s/?id=152\">钢管</a>\n                        <a href=\"/s/?id=145\">床上</a>\n                        <a href=\"/s/?id=144\">酒店</a>\n                        <a href=\"/s/?id=131\">健身</a>\n                        <a href=\"/s/?id=180\">户外</a>\n                        <a href=\"/s/?id=247\">香车美人</a>\n                        <a href=\"/s/?id=163\">沙滩</a>\n\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>服装</legend></fieldset>\n                        <a href=\"/s/?id=117\">连衣裙</a>\n                        <a href=\"/s/?id=11\">泳装</a>\n                        <a href=\"/s/?id=13\">校服</a>\n                        <a href=\"/s/?id=19\">长裙</a>\n                        <a href=\"/s/?id=18\">热裤</a>\n                        <a href=\"/s/?id=17\">睡衣</a>\n                        <a href=\"/s/?id=16\">蕾丝</a>\n                        <a href=\"/s/?id=22\">超短裙</a>\n                        <a href=\"/s/?id=25\">和服</a>\n                        <a href=\"/s/?id=24\">牛仔</a>\n                        <a href=\"/s/?id=38\">水手服</a>\n                        <a href=\"/s/?id=49\">比基尼</a>\n                        <a href=\"/s/?id=64\">丁字裤</a>\n                        <a href=\"/s/?id=77\">内衣</a>\n                        <a href=\"/s/?id=37\">高叉</a>\n                        <a href=\"/s/?id=30\">职业装</a>\n                        <a href=\"/s/?id=58\">死库水</a>\n                        <a href=\"/s/?id=113\">婚纱</a>\n                        <a href=\"/s/?id=110\">豹纹</a>\n                        <a href=\"/s/?id=107\">衬衫</a>\n                        <a href=\"/s/?id=127\">紧身裤</a>\n                        <a href=\"/s/?id=126\">体操服</a>\n                        <a href=\"/s/?id=128\">皮衣</a>\n                        <a href=\"/s/?id=157\">西装</a>\n                        <a href=\"/s/?id=193\">学生制服</a>\n                        <a href=\"/s/?id=164\">日本制服</a>\n                        <a href=\"/s/?id=244\">迷你裙</a>\n                        <a href=\"/s/?id=245\">毛衣</a>\n                        <a href=\"/s/?id=203\">长靴</a>\n                        <a href=\"/s/?id=248\">吊带</a>\n                        <a href=\"/s/?id=256\">抹胸</a>\n                        <a href=\"/s/?id=156\">背心</a>\n\n\n                    </div>\n\n                </div>\n                <div class=\"layui-tab-item\">\n\n                    <div class=\"tags\">\n\n                        <a href=\"/x/?id=43\">Graphis</a>\n                        <a href=\"/x/?id=59\">秀人网</a>\n                        <a href=\"/x/?id=57\">Beautyleg</a>\n                        <a href=\"/x/?id=31\">克拉女神</a>\n                        <a href=\"/x/?id=114\">绅士约拍</a>\n                        <a href=\"/x/?id=113\">DJAWA</a>\n                        <a href=\"/x/?id=112\">壹吻映画</a>\n                        <a href=\"/x/?id=111\">LD零度</a>\n                        <a href=\"/x/?id=110\">宅急约</a>\n                        <a href=\"/x/?id=109\">尤蜜</a>\n                        <a href=\"/x/?id=101\">ARTGRAVIA</a>\n                        <a href=\"/x/?id=95\">喵糖映画</a>\n                        <a href=\"/x/?id=85\">语画界</a>\n                        <a href=\"/x/?id=84\">尤美</a>\n                        <a href=\"/x/?id=83\">日本CosPlay</a>\n                        <a href=\"/x/?id=82\">森萝财团</a>\n                        <a href=\"/x/?id=81\">蜜丝</a>\n                        <a href=\"/x/?id=80\">Cosdoki</a>\n                        <a href=\"/x/?id=79\">Girlz-High</a>\n                        <a href=\"/x/?id=78\">台湾正妹</a>\n                        <a href=\"/x/?id=74\">美媛馆</a>\n                        <a href=\"/x/?id=73\">尤物馆</a>\n                        <a href=\"/x/?id=72\">魅妍社</a>\n                        <a href=\"/x/?id=71\">蜜桃社</a>\n                        <a href=\"/x/?id=70\">模范学院</a>\n                        <a href=\"/x/?id=68\">爱蜜社</a>\n                        <a href=\"/x/?id=67\">嗲囡囡</a>\n                        <a href=\"/x/?id=62\">尤果圈爱尤物</a>\n                        <a href=\"/x/?id=58\">尤蜜荟</a>\n                        <a href=\"/x/?id=52\">YS Web</a>\n                        <a href=\"/x/?id=51\">Hello! Project Digital Books</a>\n                        <a href=\"/x/?id=49\">丽柜</a>\n                        <a href=\"/x/?id=46\">ISHOW爱秀</a>\n                        <a href=\"/x/?id=14\">丝享家</a>\n                        <a href=\"/x/?id=13\">丝足便当</a>\n                        <a href=\"/x/?id=12\">异思趣向</a>\n                        <a href=\"/x/?id=2\">网络美女</a>\n                        <a href=\"/x/?id=35\">Minisuka.tv</a>\n                        <a href=\"/x/?id=17\">Digi-Gra</a>\n                        <a href=\"/x/?id=18\">LovePop</a>\n\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>停更 · 倒闭</legend></fieldset>\n                        <a href=\"/x/?id=75\">推女郎</a>\n                        <a href=\"/x/?id=45\">头条女神</a>\n                        <a href=\"/x/?id=94\">Young Magazine</a>\n                        <a href=\"/x/?id=93\">Young Gangan</a>\n                        <a href=\"/x/?id=92\">Young Champion</a>\n                        <a href=\"/x/?id=91\">Weekly Big Comic Spirits</a>\n                        <a href=\"/x/?id=90\">FRIDAY杂志写真</a>\n                        <a href=\"/x/?id=89\">FLASH杂志写真</a>\n                        <a href=\"/x/?id=88\">阳光宝贝</a>\n                        <a href=\"/x/?id=87\">丝意SIEE</a>\n                        <a href=\"/x/?id=86\">风之领域</a>\n                        <a href=\"/x/?id=77\">猎女神</a>\n                        <a href=\"/x/?id=76\">OnlyTease</a>\n                        <a href=\"/x/?id=69\">星乐园</a>\n                        <a href=\"/x/?id=63\">尤果网</a>\n                        <a href=\"/x/?id=66\">波萝社</a>\n                        <a href=\"/x/?id=65\">@misty</a>\n                        <a href=\"/x/?id=64\">Wanibooks</a>\n                        <a href=\"/x/?id=61\">影私荟</a>\n                        <a href=\"/x/?id=60\">顽味生活</a>\n                        <a href=\"/x/?id=56\">优星馆</a>\n                        <a href=\"/x/?id=55\">御女郎</a>\n                        <a href=\"/x/?id=54\">NS Eyes</a>\n                        <a href=\"/x/?id=53\">Image.tv</a>\n                        <a href=\"/x/?id=50\">Bomb.TV</a>\n                        <a href=\"/x/?id=48\">PB写真集</a>\n                        <a href=\"/x/?id=47\">4K-STAR</a>\n                        <a href=\"/x/?id=44\">动感之星</a>\n                        <a href=\"/x/?id=42\">Bejean On Line</a>\n                        <a href=\"/x/?id=41\">51MODO</a>\n                        <a href=\"/x/?id=40\">Imuto.tv</a>\n                        <a href=\"/x/?id=39\">推女神</a>\n                        <a href=\"/x/?id=38\">DDY Pantyhose</a>\n                        <a href=\"/x/?id=37\">爱丝</a>\n                        <a href=\"/x/?id=36\">VYJ</a>\n                        <a href=\"/x/?id=34\">网红馆</a>\n                        <a href=\"/x/?id=33\">WPB写真</a>\n                        <a href=\"/x/?id=32\">美腿宝贝</a>\n                        <a href=\"/x/?id=30\">瑞丝馆</a>\n                        <a href=\"/x/?id=29\">薄荷叶</a>\n                        <a href=\"/x/?id=28\">Sabra</a>\n                        <a href=\"/x/?id=27\">果团网</a>\n                        <a href=\"/x/?id=26\">青豆客</a>\n                        <a href=\"/x/?id=25\">花の颜</a>\n                        <a href=\"/x/?id=24\">模特联盟</a>\n                        <a href=\"/x/?id=23\">花漾</a>\n                        <a href=\"/x/?id=22\">兔几盟</a>\n                        <a href=\"/x/?id=21\">Juicy Honey</a>\n                        <a href=\"/x/?id=20\">X-City</a>\n                        <a href=\"/x/?id=19\">Princess Collection</a>\n                        <a href=\"/x/?id=16\">熊川纪信</a>\n                        <a href=\"/x/?id=15\">星颜社</a>\n                        <a href=\"/x/?id=11\">The Black Alley</a>\n                        <a href=\"/x/?id=10\">激萌文化</a>\n                        <a href=\"/x/?id=9\">Young Animal Arashi</a>\n                        <a href=\"/x/?id=8\">DGC</a>\n                        <a href=\"/x/?id=7\">RQ-STAR</a>\n                        <a href=\"/x/?id=6\">Young Animal</a>\n                        <a href=\"/x/?id=5\">For-side</a>\n                        <a href=\"/x/?id=4\">Weekly Playboy</a>\n                        <a href=\"/x/?id=3\">Weekly Young Jump</a>\n                        <a href=\"/x/?id=1\">BWH</a>\n                        <a href=\"/x/?id=108\">山茶摄影</a>\n                        <a href=\"/x/?id=107\">奈丝</a>\n                        <a href=\"/x/?id=106\">大生模拍</a>\n                        <a href=\"/x/?id=105\">佳爷SJA</a>\n                        <a href=\"/x/?id=100\">一千零一夜</a>\n                        <a href=\"/x/?id=99\">丽丝映像</a>\n                        <a href=\"/x/?id=98\">斯文传媒SIW</a>\n                        <a href=\"/x/?id=97\">轻兰映画</a>\n                        <a href=\"/x/?id=96\">纳丝摄影</a>\n                        <a href=\"/x/?id=104\">袜涩</a>\n                        <a href=\"/x/?id=103\">思话</a>\n                        <a href=\"/x/?id=102\">丝慕</a>\n\n\n                    </div>\n\n                </div>\n\n                <div class=\"layui-tab-item\">\n\n                    <div class=\"tags\"><a href=\"/cat/?id=10\">国内</a><a href=\"/cat/?id=8\">日本</a><a href=\"/cat/?id=11\">中国台湾</a><a href=\"/cat/?id=20\">欧美</a><a href=\"/cat/?id=19\">韩国</a><a href=\"/cat/?id=23\">泰国</a></div>\n\n                </div>\n\n            </div>\n        </div>\n\n    </div>\n\n</div>\n\n<div class=\"width\">\n    <div class=\"unav\">\n        <a href=\"/u/\">主页</a>\n        <a href=\"/u/?action=gengxin\">更新记录</a>\n        <a href=\"/u/?action=shoucang\">我的收藏</a>\n        <a href=\"/u/?action=shengji\" class=\"on\">帐户升级</a>\n        <a href=\"/u/?action=edit\">修改</a>\n        <a href=\"/u/?action=out\">退出</a>\n    </div>\n</div>\n<div class=\"width\">\n    <p><center>公告:春节放假停更，2021.02.10 - 02.19 节后恢复正常更新，祝所有用户新年快乐，感谢你们的支持 。</center></p>\n    <fieldset class=\"layui-elem-field layui-field-title\">\n        <legend>更新记录</legend>\n    </fieldset>\n\n    <div class=\"c1\">\n        <ul>\n            <li><span>2022-01-15</span><a href=\"/a/?id=48272\">[秀人XiuRen] No.3890 可樂Vicky</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48271\">[秀人XiuRen] No.3889 夏西CiCi</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48270\">[秀人XiuRen] No.3888 韩静安</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48269\">[秀人XiuRen] No.3887 媛媛酱belle</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48268\">[秀人XiuRen] No.3886 周慕汐baby</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48267\">[秀人XiuRen] No.3885 春药儿</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48266\">[秀人XiuRen] No.3884 王心怡</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48265\">[秀人XiuRen] No.3882 美桃酱</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48264\">[秀人XiuRen] No.3881 西门小玉</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48263\">[秀人XiuRen] No.3880 顾乔楠Cora</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48262\">[秀人XiuRen] No.3879 周于希Sandy</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48261\">[秀人XiuRen] No.3878 杨晨晨Yome</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48260\">[秀人XiuRen] No.3877 唐安琪</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48259\">[秀人XiuRen] No.3876 允爾</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48258\">[秀人XiuRen] No.3875 明日花桃桃</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48257\">[秀人XiuRen] No.3874 乔漫妮mina</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48256\">[秀人XiuRen] No.3873 吴雪瑶</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48255\">[秀人XiuRen] No.3872 小波多</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48254\">[秀人XiuRen] No.3871 安然Maleah</a></li>\n\n            <li><span>2022-01-15</span><a href=\"/a/?id=48253\">[秀人XiuRen] No.3870 梦心月</a></li>\n\n        </ul>\n    </div>\n\n\n    <div class=\"bk10\"></div>\n    <center><div id=\"pages\" class=\"text-c\"><div><span  class=\"current\">1</span><a class=\"num\" href=\"/u/?action=gengxin&page=2\">2</a><a class=\"num\" href=\"/u/?action=gengxin&page=3\">3</a><a class=\"num\" href=\"/u/?action=gengxin&page=4\">4</a><a class=\"num\" href=\"/u/?action=gengxin&page=5\">5</a><a class=\"num\" href=\"/u/?action=gengxin&page=6\">6</a><a class=\"num\" href=\"/u/?action=gengxin&page=7\">7</a><a class=\"num\" href=\"/u/?action=gengxin&page=8\">8</a><a class=\"num\" href=\"/u/?action=gengxin&page=9\">9</a><a class=\"next\" href=\"/u/?action=gengxin&page=2\">下一页</a><a class=\"next\" href=\"/u/?action=gengxin&page=50\">末页</a></div></div></center>\n    <div class=\"bk20\"></div>\n    <script>\n        layui.use('element', function(){\n            var element = layui.element;\n        });\n    </script>\n    <div class=\"footer\"> 到底了~ <a href=\"https://m.tujidao.com/\">APP下载</a> | <a href=\"http://www.wotuji.com/\">网址发布</a>\n        <p style=\"display:none\"><script src=\"https://s11.cnzz.com/z_stat.php?id=1257039673&web_id=1257039673\" language=\"JavaScript\"></script></p></div>\n</body>\n</html>"
  },
  {
    "path": "oys-tujidao/src/test/resources/gengxin2.html",
    "content": "\n<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n    <meta http-equiv=\"Cache-Control\" content=\"no-transform\" />\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\" />\n    <title>更新记录_图集岛</title>\n    <script type=\"text/javascript\" src=\"https://www.tujidao.com/Static/css/jquery.js\"></script>\n    <script type=\"text/javascript\" src=\"https://www.tujidao.com/Static/css/lazyload.js\"></script>\n    <script src=\"https://www.tujidao.com/Static/css/layui/layui.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.tujidao.com/Static/css/layui/css/layui.css\" />\n\n    <script language=\"javascript\" src=\"https://www.tujidao.com/Static/css/viewer.js\"></script>\n    <script>\n  $(document).ready(function(){\n\n     $(\"#onmenu\").click(function() {\n\n\n        $(\"#onmenu\").toggle();\n        $(\"#offmenu\").toggle();\n        $(\"#caidian\").animate({ height: 'show', opacity: 'show' }, 'slow');\n\n\n       });\n\n\n       $(\"#offmenu\").click(function() {\n\n        $(\"#offmenu\").toggle();\n        $(\"#onmenu\").toggle();\n        $(\"#caidian\").animate({ height: 'hide', opacity: 'hide' }, 'slow');\n\n       });\n\n\n});\n\n</script>\n    <link href=\"https://www.tujidao.com/Static/css/css.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div class=\"top\">\n    <ul class=\"menu\">\n        <li class=\"my\"><a href=\"/u/\"><i class=\"layui-icon layui-icon-username\"></i></a></li>\n        <li class=\"logo\"><a href=\"/\">图集岛</a></li>\n        <li class=\"tj\"><i class=\"layui-icon layui-icon-shrink-right\" id=\"onmenu\"></i><i class=\"layui-icon layui-icon-close\" id=\"offmenu\"></i></li>\n    </ul>\n</div>\n\n<div class=\"c\"></div>\n\n\n\n<div id=\"caidian\">\n\n    <div class=\"caidan\">\n        <div class=\"sousu\"><form action=\"/sousu/\" method=\"post\"><input name=\"s0\" type=\"text\" value=\"\" placeholder=\"请输入关键词\"><button type=\"submit\">搜 索</button></form></div>\n\n        <div class=\"layui-tab layui-tab-brief\" lay-filter=\"docDemoTabBrief\">\n            <ul class=\"layui-tab-title\">\n                <li><a href=\"https://www.tujidao.com/u/?action=gengxin\">全部/更新</a></li>\n                <li class=\"layui-this\">标签</li>\n                <li>机构</li>\n                <li>地区</li>\n                <li><a href=\"https://yituyu.zahun.com/?fr=tujidao\" target=\"_blank\" style=\"color: #5fb878\">原创</a></li>\n\n            </ul>\n            <div class=\"layui-tab-content\">\n                <div class=\"layui-tab-item\"></div>\n                <div class=\"layui-tab-item layui-show\">\n\n                    <div class=\"tags\">\n\n\n                        <a href=\"/s/?id=47\">极品</a>\n                        <a href=\"/s/?id=55\">美少女</a>\n                        <a href=\"/s/?id=62\">御姐</a>\n                        <a href=\"/s/?id=59\">女神</a>\n                        <a href=\"/s/?id=80\">日本少女</a>\n                        <a href=\"/s/?id=85\">嫩模</a>\n                        <a href=\"/s/?id=84\">妹子</a>\n                        <a href=\"/s/?id=45\">尤物</a>\n                        <a href=\"/s/?id=83\">正妹</a>\n                        <a href=\"/s/?id=87\">熟女</a>\n                        <a href=\"/s/?id=99\">乙女</a>\n                        <a href=\"/s/?id=100\">女星</a>\n                        <a href=\"/s/?id=81\">阳光</a>\n                        <a href=\"/s/?id=116\">网红</a>\n                        <a href=\"/s/?id=132\">少FU</a>\n                        <a href=\"/s/?id=138\">日本少FU</a>\n                        <a href=\"/s/?id=215\">泳装少女</a>\n                        <a href=\"/s/?id=151\">软妹</a>\n                        <a href=\"/s/?id=150\">日本妹子</a>\n                        <a href=\"/s/?id=149\">萌女</a>\n                        <a href=\"/s/?id=154\">车模</a>\n                        <a href=\"/s/?id=159\">女优</a>\n                        <a href=\"/s/?id=166\">少女</a>\n                        <a href=\"/s/?id=165\">日本嫩模</a>\n                        <a href=\"/s/?id=187\">清纯少女</a>\n                        <a href=\"/s/?id=186\">性感少女</a>\n                        <a href=\"/s/?id=185\">混血</a>\n                        <a href=\"/s/?id=184\">黑长直</a>\n                        <a href=\"/s/?id=119\">明星</a>\n                        <a href=\"/s/?id=194\">杂志</a>\n                        <a href=\"/s/?id=197\">欧美熟女</a>\n                        <a href=\"/s/?id=196\">金发</a>\n                        <a href=\"/s/?id=201\">黑人</a>\n                        <a href=\"/s/?id=212\">女郎</a>\n                        <a href=\"/s/?id=214\">轻熟女</a>\n                        <a href=\"/s/?id=227\">巨RU女优</a>\n                        <a href=\"/s/?id=251\">女友</a>\n                        <a href=\"/s/?id=254\">白领</a>\n                        <a href=\"/s/?id=40\">萝莉</a>\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>风格</legend></fieldset>\n\n                        <a href=\"/s/?id=14\">可爱</a>\n                        <a href=\"/s/?id=32\">甜美</a>\n                        <a href=\"/s/?id=23\">清纯</a>\n                        <a href=\"/s/?id=35\">性感</a>\n                        <a href=\"/s/?id=34\">气质</a>\n                        <a href=\"/s/?id=52\">妩媚</a>\n                        <a href=\"/s/?id=51\">清新</a>\n                        <a href=\"/s/?id=54\">唯美</a>\n                        <a href=\"/s/?id=33\">美胸</a>\n                        <a href=\"/s/?id=42\">诱惑</a>\n                        <a href=\"/s/?id=41\">私房</a>\n                        <a href=\"/s/?id=46\">翘T</a>\n                        <a href=\"/s/?id=44\">大胆</a>\n                        <a href=\"/s/?id=43\">福利</a>\n                        <a href=\"/s/?id=53\">大胸</a>\n                        <a href=\"/s/?id=111\">高贵</a>\n                        <a href=\"/s/?id=121\">粉嫩</a>\n                        <a href=\"/s/?id=95\">惊艳</a>\n                        <a href=\"/s/?id=94\">白嫩</a>\n                        <a href=\"/s/?id=91\">养眼</a>\n                        <a href=\"/s/?id=89\">巨RU</a>\n                        <a href=\"/s/?id=73\">情趣</a>\n                        <a href=\"/s/?id=29\">短发</a>\n                        <a href=\"/s/?id=202\">丰T</a>\n                        <a href=\"/s/?id=242\">丰满</a>\n                        <a href=\"/s/?id=236\">巨RU萝莉</a>\n                        <a href=\"/s/?id=232\">勾魂</a>\n                        <a href=\"/s/?id=231\">半裸</a>\n                        <a href=\"/s/?id=230\">欧美大胸</a>\n                        <a href=\"/s/?id=229\">蕾丝诱惑</a>\n                        <a href=\"/s/?id=228\">制服诱惑</a>\n                        <a href=\"/s/?id=221\">丰满少F</a>\n                        <a href=\"/s/?id=220\">风骚少F</a>\n                        <a href=\"/s/?id=219\">风骚</a>\n                        <a href=\"/s/?id=218\">顶级少F</a>\n                        <a href=\"/s/?id=206\">美T少F</a>\n                        <a href=\"/s/?id=202\">肥TUN</a>\n                        <a href=\"/s/?id=195\">欧美巨RU</a>\n                        <a href=\"/s/?id=192\">学生</a>\n                        <a href=\"/s/?id=191\">肉感</a>\n                        <a href=\"/s/?id=189\">双马尾</a>\n                        <a href=\"/s/?id=183\">大尺度</a>\n                        <a href=\"/s/?id=181\">骨感</a>\n                        <a href=\"/s/?id=162\">长发</a>\n                        <a href=\"/s/?id=161\">冷艳</a>\n                        <a href=\"/s/?id=158\">包T</a>\n                        <a href=\"/s/?id=160\">美T</a>\n                        <a href=\"/s/?id=153\">爆RU</a>\n                        <a href=\"/s/?id=137\">魅惑</a>\n                        <a href=\"/s/?id=136\">优雅</a>\n                        <a href=\"/s/?id=133\">美RU</a>\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>丝 · 腿 · 足</legend></fieldset>\n                        <a href=\"/s/?id=213\">丝袜女郎</a>\n                        <a href=\"/s/?id=253\">黑丝萝莉</a>\n                        <a href=\"/s/?id=252\">白丝萝莉</a>\n                        <a href=\"/s/?id=12\">长筒袜</a>\n                        <a href=\"/s/?id=15\">丝袜</a>\n                        <a href=\"/s/?id=72\">黑丝</a>\n                        <a href=\"/s/?id=71\">丝袜美腿</a>\n                        <a href=\"/s/?id=109\">灰丝</a>\n                        <a href=\"/s/?id=31\">美腿</a>\n                        <a href=\"/s/?id=76\">高跟</a>\n                        <a href=\"/s/?id=88\">腿模</a>\n                        <a href=\"/s/?id=79\">丝袜诱惑</a>\n                        <a href=\"/s/?id=78\">网袜</a>\n                        <a href=\"/s/?id=105\">丝足</a>\n                        <a href=\"/s/?id=104\">白丝</a>\n                        <a href=\"/s/?id=103\">肉丝</a>\n                        <a href=\"/s/?id=129\">红丝</a>\n                        <a href=\"/s/?id=143\">吊带丝袜</a>\n                        <a href=\"/s/?id=142\">美脚</a>\n                        <a href=\"/s/?id=141\">玉足</a>\n                        <a href=\"/s/?id=140\">情趣丝袜</a>\n                        <a href=\"/s/?id=139\">美足</a>\n                        <a href=\"/s/?id=155\">网衣</a>\n                        <a href=\"/s/?id=169\">长腿</a>\n                        <a href=\"/s/?id=168\">凉高跟</a>\n                        <a href=\"/s/?id=167\">高跟美腿</a>\n                        <a href=\"/s/?id=199\">欧美制服</a>\n                        <a href=\"/s/?id=198\">欧美丝袜</a>\n                        <a href=\"/s/?id=205\">街拍美T</a>\n                        <a href=\"/s/?id=204\">丝袜美T</a>\n                        <a href=\"/s/?id=249\">美丝</a>\n                        <a href=\"/s/?id=208\">丝足高跟</a>\n                        <a href=\"/s/?id=207\">丝足诱惑</a>\n                        <a href=\"/s/?id=243\">街拍丝袜</a>\n                        <a href=\"/s/?id=240\">丝袜人体</a>\n                        <a href=\"/s/?id=239\">丝袜短裙</a>\n                        <a href=\"/s/?id=238\">街拍短裙</a>\n                        <a href=\"/s/?id=237\">丝袜制服</a>\n                        <a href=\"/s/?id=235\">街拍美腿</a>\n                        <a href=\"/s/?id=234\">街拍高跟</a>\n                        <a href=\"/s/?id=233\">丝袜肥T</a>\n                        <a href=\"/s/?id=226\">街拍黑丝</a>\n                        <a href=\"/s/?id=225\">黑丝制服</a>\n                        <a href=\"/s/?id=224\">黑丝美腿</a>\n                        <a href=\"/s/?id=223\">丝袜熟女</a>\n                        <a href=\"/s/?id=222\">丝袜少F</a>\n                        <a href=\"/s/?id=258\">肉丝美腿</a>\n                        <a href=\"/s/?id=259\">黑丝诱惑</a>\n                        <a href=\"/s/?id=257\">情趣制服</a>\n\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>情趣</legend></fieldset>\n                        <a href=\"/s/?id=135\">薄纱</a>\n                        <a href=\"/s/?id=255\">剧情</a>\n                        <a href=\"/s/?id=93\">肚兜</a>\n                        <a href=\"/s/?id=69\">旗袍</a>\n                        <a href=\"/s/?id=112\">空姐</a>\n                        <a href=\"/s/?id=9\">赛车女郎</a>\n                        <a href=\"/s/?id=20\">护士</a>\n                        <a href=\"/s/?id=21\">运动</a>\n                        <a href=\"/s/?id=27\">女仆</a>\n                        <a href=\"/s/?id=26\">兔女郎</a>\n                        <a href=\"/s/?id=28\">制服</a>\n                        <a href=\"/s/?id=36\">COS</a>\n                        <a href=\"/s/?id=48\">猫女</a>\n                        <a href=\"/s/?id=108\">美束</a>\n                        <a href=\"/s/?id=68\">古典</a>\n                        <a href=\"/s/?id=67\">SM</a>\n                        <a href=\"/s/?id=63\">圣诞</a>\n                        <a href=\"/s/?id=50\">湿身</a>\n                        <a href=\"/s/?id=70\">人体</a>\n                        <a href=\"/s/?id=125\">厨娘</a>\n                        <a href=\"/s/?id=124\">JK</a>\n                        <a href=\"/s/?id=123\">女警</a>\n                        <a href=\"/s/?id=122\">老师</a>\n                        <a href=\"/s/?id=120\">医生</a>\n                        <a href=\"/s/?id=106\">新年</a>\n                        <a href=\"/s/?id=67\">捆绑</a>\n                        <a href=\"/s/?id=67\">绳艺</a>\n                        <a href=\"/s/?id=250\">眼镜</a>\n                        <a href=\"/s/?id=211\">不知火舞</a>\n                        <a href=\"/s/?id=210\">COSER</a>\n                        <a href=\"/s/?id=209\">清纯护士</a>\n                        <a href=\"/s/?id=148\">纹身</a>\n                        <a href=\"/s/?id=147\">OL</a>\n                        <a href=\"/s/?id=146\">秘书</a>\n                        <a href=\"/s/?id=115\">调教</a>\n                        <a href=\"/s/?id=114\">镣铐</a>\n                        <a href=\"/s/?id=130\">姐妹花</a>\n                        <a href=\"/s/?id=134\">透视</a>\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>场景</legend></fieldset>\n                        <a href=\"/s/?id=200\">桌球</a>\n                        <a href=\"/s/?id=75\">浴室</a>\n                        <a href=\"/s/?id=102\">篮球</a>\n                        <a href=\"/s/?id=92\">拳击</a>\n                        <a href=\"/s/?id=90\">足球</a>\n                        <a href=\"/s/?id=82\">居家</a>\n                        <a href=\"/s/?id=10\">办公室</a>\n                        <a href=\"/s/?id=65\">街拍</a>\n                        <a href=\"/s/?id=74\">外拍</a>\n                        <a href=\"/s/?id=96\">海边</a>\n                        <a href=\"/s/?id=118\">展台</a>\n                        <a href=\"/s/?id=152\">钢管</a>\n                        <a href=\"/s/?id=145\">床上</a>\n                        <a href=\"/s/?id=144\">酒店</a>\n                        <a href=\"/s/?id=131\">健身</a>\n                        <a href=\"/s/?id=180\">户外</a>\n                        <a href=\"/s/?id=247\">香车美人</a>\n                        <a href=\"/s/?id=163\">沙滩</a>\n\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>服装</legend></fieldset>\n                        <a href=\"/s/?id=117\">连衣裙</a>\n                        <a href=\"/s/?id=11\">泳装</a>\n                        <a href=\"/s/?id=13\">校服</a>\n                        <a href=\"/s/?id=19\">长裙</a>\n                        <a href=\"/s/?id=18\">热裤</a>\n                        <a href=\"/s/?id=17\">睡衣</a>\n                        <a href=\"/s/?id=16\">蕾丝</a>\n                        <a href=\"/s/?id=22\">超短裙</a>\n                        <a href=\"/s/?id=25\">和服</a>\n                        <a href=\"/s/?id=24\">牛仔</a>\n                        <a href=\"/s/?id=38\">水手服</a>\n                        <a href=\"/s/?id=49\">比基尼</a>\n                        <a href=\"/s/?id=64\">丁字裤</a>\n                        <a href=\"/s/?id=77\">内衣</a>\n                        <a href=\"/s/?id=37\">高叉</a>\n                        <a href=\"/s/?id=30\">职业装</a>\n                        <a href=\"/s/?id=58\">死库水</a>\n                        <a href=\"/s/?id=113\">婚纱</a>\n                        <a href=\"/s/?id=110\">豹纹</a>\n                        <a href=\"/s/?id=107\">衬衫</a>\n                        <a href=\"/s/?id=127\">紧身裤</a>\n                        <a href=\"/s/?id=126\">体操服</a>\n                        <a href=\"/s/?id=128\">皮衣</a>\n                        <a href=\"/s/?id=157\">西装</a>\n                        <a href=\"/s/?id=193\">学生制服</a>\n                        <a href=\"/s/?id=164\">日本制服</a>\n                        <a href=\"/s/?id=244\">迷你裙</a>\n                        <a href=\"/s/?id=245\">毛衣</a>\n                        <a href=\"/s/?id=203\">长靴</a>\n                        <a href=\"/s/?id=248\">吊带</a>\n                        <a href=\"/s/?id=256\">抹胸</a>\n                        <a href=\"/s/?id=156\">背心</a>\n\n\n                    </div>\n\n                </div>\n                <div class=\"layui-tab-item\">\n\n                    <div class=\"tags\">\n\n                        <a href=\"/x/?id=43\">Graphis</a>\n                        <a href=\"/x/?id=59\">秀人网</a>\n                        <a href=\"/x/?id=57\">Beautyleg</a>\n                        <a href=\"/x/?id=31\">克拉女神</a>\n                        <a href=\"/x/?id=114\">绅士约拍</a>\n                        <a href=\"/x/?id=113\">DJAWA</a>\n                        <a href=\"/x/?id=112\">壹吻映画</a>\n                        <a href=\"/x/?id=111\">LD零度</a>\n                        <a href=\"/x/?id=110\">宅急约</a>\n                        <a href=\"/x/?id=109\">尤蜜</a>\n                        <a href=\"/x/?id=101\">ARTGRAVIA</a>\n                        <a href=\"/x/?id=95\">喵糖映画</a>\n                        <a href=\"/x/?id=85\">语画界</a>\n                        <a href=\"/x/?id=84\">尤美</a>\n                        <a href=\"/x/?id=83\">日本CosPlay</a>\n                        <a href=\"/x/?id=82\">森萝财团</a>\n                        <a href=\"/x/?id=81\">蜜丝</a>\n                        <a href=\"/x/?id=80\">Cosdoki</a>\n                        <a href=\"/x/?id=79\">Girlz-High</a>\n                        <a href=\"/x/?id=78\">台湾正妹</a>\n                        <a href=\"/x/?id=74\">美媛馆</a>\n                        <a href=\"/x/?id=73\">尤物馆</a>\n                        <a href=\"/x/?id=72\">魅妍社</a>\n                        <a href=\"/x/?id=71\">蜜桃社</a>\n                        <a href=\"/x/?id=70\">模范学院</a>\n                        <a href=\"/x/?id=68\">爱蜜社</a>\n                        <a href=\"/x/?id=67\">嗲囡囡</a>\n                        <a href=\"/x/?id=62\">尤果圈爱尤物</a>\n                        <a href=\"/x/?id=58\">尤蜜荟</a>\n                        <a href=\"/x/?id=52\">YS Web</a>\n                        <a href=\"/x/?id=51\">Hello! Project Digital Books</a>\n                        <a href=\"/x/?id=49\">丽柜</a>\n                        <a href=\"/x/?id=46\">ISHOW爱秀</a>\n                        <a href=\"/x/?id=14\">丝享家</a>\n                        <a href=\"/x/?id=13\">丝足便当</a>\n                        <a href=\"/x/?id=12\">异思趣向</a>\n                        <a href=\"/x/?id=2\">网络美女</a>\n                        <a href=\"/x/?id=35\">Minisuka.tv</a>\n                        <a href=\"/x/?id=17\">Digi-Gra</a>\n                        <a href=\"/x/?id=18\">LovePop</a>\n\n\n                        <fieldset class=\"layui-elem-field layui-field-title\"><legend>停更 · 倒闭</legend></fieldset>\n                        <a href=\"/x/?id=75\">推女郎</a>\n                        <a href=\"/x/?id=45\">头条女神</a>\n                        <a href=\"/x/?id=94\">Young Magazine</a>\n                        <a href=\"/x/?id=93\">Young Gangan</a>\n                        <a href=\"/x/?id=92\">Young Champion</a>\n                        <a href=\"/x/?id=91\">Weekly Big Comic Spirits</a>\n                        <a href=\"/x/?id=90\">FRIDAY杂志写真</a>\n                        <a href=\"/x/?id=89\">FLASH杂志写真</a>\n                        <a href=\"/x/?id=88\">阳光宝贝</a>\n                        <a href=\"/x/?id=87\">丝意SIEE</a>\n                        <a href=\"/x/?id=86\">风之领域</a>\n                        <a href=\"/x/?id=77\">猎女神</a>\n                        <a href=\"/x/?id=76\">OnlyTease</a>\n                        <a href=\"/x/?id=69\">星乐园</a>\n                        <a href=\"/x/?id=63\">尤果网</a>\n                        <a href=\"/x/?id=66\">波萝社</a>\n                        <a href=\"/x/?id=65\">@misty</a>\n                        <a href=\"/x/?id=64\">Wanibooks</a>\n                        <a href=\"/x/?id=61\">影私荟</a>\n                        <a href=\"/x/?id=60\">顽味生活</a>\n                        <a href=\"/x/?id=56\">优星馆</a>\n                        <a href=\"/x/?id=55\">御女郎</a>\n                        <a href=\"/x/?id=54\">NS Eyes</a>\n                        <a href=\"/x/?id=53\">Image.tv</a>\n                        <a href=\"/x/?id=50\">Bomb.TV</a>\n                        <a href=\"/x/?id=48\">PB写真集</a>\n                        <a href=\"/x/?id=47\">4K-STAR</a>\n                        <a href=\"/x/?id=44\">动感之星</a>\n                        <a href=\"/x/?id=42\">Bejean On Line</a>\n                        <a href=\"/x/?id=41\">51MODO</a>\n                        <a href=\"/x/?id=40\">Imuto.tv</a>\n                        <a href=\"/x/?id=39\">推女神</a>\n                        <a href=\"/x/?id=38\">DDY Pantyhose</a>\n                        <a href=\"/x/?id=37\">爱丝</a>\n                        <a href=\"/x/?id=36\">VYJ</a>\n                        <a href=\"/x/?id=34\">网红馆</a>\n                        <a href=\"/x/?id=33\">WPB写真</a>\n                        <a href=\"/x/?id=32\">美腿宝贝</a>\n                        <a href=\"/x/?id=30\">瑞丝馆</a>\n                        <a href=\"/x/?id=29\">薄荷叶</a>\n                        <a href=\"/x/?id=28\">Sabra</a>\n                        <a href=\"/x/?id=27\">果团网</a>\n                        <a href=\"/x/?id=26\">青豆客</a>\n                        <a href=\"/x/?id=25\">花の颜</a>\n                        <a href=\"/x/?id=24\">模特联盟</a>\n                        <a href=\"/x/?id=23\">花漾</a>\n                        <a href=\"/x/?id=22\">兔几盟</a>\n                        <a href=\"/x/?id=21\">Juicy Honey</a>\n                        <a href=\"/x/?id=20\">X-City</a>\n                        <a href=\"/x/?id=19\">Princess Collection</a>\n                        <a href=\"/x/?id=16\">熊川纪信</a>\n                        <a href=\"/x/?id=15\">星颜社</a>\n                        <a href=\"/x/?id=11\">The Black Alley</a>\n                        <a href=\"/x/?id=10\">激萌文化</a>\n                        <a href=\"/x/?id=9\">Young Animal Arashi</a>\n                        <a href=\"/x/?id=8\">DGC</a>\n                        <a href=\"/x/?id=7\">RQ-STAR</a>\n                        <a href=\"/x/?id=6\">Young Animal</a>\n                        <a href=\"/x/?id=5\">For-side</a>\n                        <a href=\"/x/?id=4\">Weekly Playboy</a>\n                        <a href=\"/x/?id=3\">Weekly Young Jump</a>\n                        <a href=\"/x/?id=1\">BWH</a>\n                        <a href=\"/x/?id=108\">山茶摄影</a>\n                        <a href=\"/x/?id=107\">奈丝</a>\n                        <a href=\"/x/?id=106\">大生模拍</a>\n                        <a href=\"/x/?id=105\">佳爷SJA</a>\n                        <a href=\"/x/?id=100\">一千零一夜</a>\n                        <a href=\"/x/?id=99\">丽丝映像</a>\n                        <a href=\"/x/?id=98\">斯文传媒SIW</a>\n                        <a href=\"/x/?id=97\">轻兰映画</a>\n                        <a href=\"/x/?id=96\">纳丝摄影</a>\n                        <a href=\"/x/?id=104\">袜涩</a>\n                        <a href=\"/x/?id=103\">思话</a>\n                        <a href=\"/x/?id=102\">丝慕</a>\n\n\n                    </div>\n\n                </div>\n\n                <div class=\"layui-tab-item\">\n\n                    <div class=\"tags\"><a href=\"/cat/?id=10\">国内</a><a href=\"/cat/?id=8\">日本</a><a href=\"/cat/?id=11\">中国台湾</a><a href=\"/cat/?id=20\">欧美</a><a href=\"/cat/?id=19\">韩国</a><a href=\"/cat/?id=23\">泰国</a></div>\n\n                </div>\n\n\n            </div>\n        </div>\n\n    </div>\n\n</div>\n\n<div class=\"width\">\n    <fieldset class=\"layui-elem-field layui-field-title\">\n        <legend>全部图集 / 更新记录</legend>\n    </fieldset>\n</div>\n\n<div class=\"hezi\">\n    <ul>\n        <li id=\"48926\">\n            <a href=\"/a/?id=48926\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48926/0.jpg\"></a>\n            <span class=\"shuliang\">70P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=224\">黑丝美腿</a> <a href=\"/s/?id=225\">黑丝制服</a></p>\n            <p>人物：<a href=\"/t/?id=6226\">Arude薇薇</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48926\">[秀人XiuRen] No.4080 Arude薇薇</a></p>\n        </li>\n        <li id=\"48925\">\n            <a href=\"/a/?id=48925\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48925/0.jpg\"></a>\n            <span class=\"shuliang\">60P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=219\">风骚</a></p>\n            <p>人物：<a href=\"/t/?id=3156\">周于希</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48925\">[秀人XiuRen] No.4079 周于希Sandy</a></p>\n        </li>\n        <li id=\"48924\">\n            <a href=\"/a/?id=48924\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48924/0.jpg\"></a>\n            <span class=\"shuliang\">69P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=140\">情趣丝袜</a> <a href=\"/s/?id=143\">吊带丝袜</a></p>\n            <p>人物：<a href=\"/t/?id=459\">杨晨晨</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48924\">[秀人XiuRen] No.4078 杨晨晨Yome</a></p>\n        </li>\n        <li id=\"48923\">\n            <a href=\"/a/?id=48923\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48923/0.jpg\"></a>\n            <span class=\"shuliang\">72P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=82\">居家</a> <a href=\"/s/?id=132\">S妇</a></p>\n            <p>人物：<a href=\"/t/?id=5815\">安然Maleah</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48923\">[秀人XiuRen] No.4077 安然Maleah</a></p>\n        </li>\n        <li id=\"48922\">\n            <a href=\"/a/?id=48922\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48922/0.jpg\"></a>\n            <span class=\"shuliang\">65P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=73\">情趣内衣</a></p>\n            <p>人物：<a href=\"/t/?id=6332\">Summer宝宝</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48922\">[秀人XiuRen] No.4076 summer宝宝</a></p>\n        </li>\n        <li id=\"48921\">\n            <a href=\"/a/?id=48921\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48921/0.jpg\"></a>\n            <span class=\"shuliang\">68P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=255\">剧情</a> <a href=\"/s/?id=146\">秘书</a> <a href=\"/s/?id=72\">黑丝</a></p>\n            <p>人物：<a href=\"/t/?id=3156\">周于希</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48921\">[秀人XiuRen] No.4075 周于希Sandy</a></p>\n        </li>\n        <li id=\"48920\">\n            <a href=\"/a/?id=48920\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48920/0.jpg\"></a>\n            <span class=\"shuliang\">69P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=220\">风骚少妇</a> <a href=\"/s/?id=218\">顶级少妇</a> <a href=\"/s/?id=82\">居家</a></p>\n            <p>人物：<a href=\"/t/?id=5963\">鱼子酱fish</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48920\">[秀人XiuRen] No.4074 鱼子酱Fish</a></p>\n        </li>\n        <li id=\"48919\">\n            <a href=\"/a/?id=48919\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48919/0.jpg\"></a>\n            <span class=\"shuliang\">61P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=59\">女神</a> <a href=\"/s/?id=31\">美腿</a></p>\n            <p>人物：<a href=\"/t/?id=1174\">可乐Vicky</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48919\">[秀人XiuRen] No.4073 可樂Vicky</a></p>\n        </li>\n        <li id=\"48918\">\n            <a href=\"/a/?id=48918\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48918/0.jpg\"></a>\n            <span class=\"shuliang\">77P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=146\">秘书</a> <a href=\"/s/?id=147\">OL</a> <a href=\"/s/?id=47\">极品</a></p>\n            <p>人物：<a href=\"/t/?id=6058\">允爾</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48918\">[秀人XiuRen] No.4072 允爾</a></p>\n        </li>\n        <li id=\"48917\">\n            <a href=\"/a/?id=48917\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48917/0.jpg\"></a>\n            <span class=\"shuliang\">111P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=132\">S妇</a></p>\n            <p>人物：<a href=\"/t/?id=5819\">周慕汐fairy</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48917\">[秀人XiuRen] No.4071 周慕汐baby</a></p>\n        </li>\n        <li id=\"48916\">\n            <a href=\"/a/?id=48916\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48916/0.jpg\"></a>\n            <span class=\"shuliang\">58P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=127\">紧身裤</a> <a href=\"/s/?id=36\">COS</a></p>\n            <p>人物：<a href=\"/t/?id=4259\">顾桥楠</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48916\">[秀人XiuRen] No.4070 顾乔楠Cora</a></p>\n        </li>\n        <li id=\"48915\">\n            <a href=\"/a/?id=48915\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48915/0.jpg\"></a>\n            <span class=\"shuliang\">64P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=132\">S妇</a></p>\n            <p>人物：<a href=\"/t/?id=954\">芝芝Booty</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48915\">[秀人XiuRen] No.4069 芝芝Booty</a></p>\n        </li>\n        <li id=\"48914\">\n            <a href=\"/a/?id=48914\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48914/0.jpg\"></a>\n            <span class=\"shuliang\">83P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=225\">黑丝制服</a> <a href=\"/s/?id=255\">剧情</a></p>\n            <p>人物：<a href=\"/t/?id=788\">陆萱萱</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48914\">[秀人XiuRen] No.4068 陆萱萱</a></p>\n        </li>\n        <li id=\"48913\">\n            <a href=\"/a/?id=48913\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48913/0.jpg\"></a>\n            <span class=\"shuliang\">58P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=69\">旗袍</a> <a href=\"/s/?id=62\">御姐</a></p>\n            <p>人物：<a href=\"/t/?id=3184\">方子萱</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48913\">[秀人XiuRen] No.4067 方子萱</a></p>\n        </li>\n        <li id=\"48912\">\n            <a href=\"/a/?id=48912\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48912/0.jpg\"></a>\n            <span class=\"shuliang\">58P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=19\">长裙</a> <a href=\"/s/?id=219\">风骚</a></p>\n            <p>人物：<a href=\"/t/?id=795\">月音瞳</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48912\">[秀人XiuRen] No.4066 月音瞳</a></p>\n        </li>\n        <li id=\"48911\">\n            <a href=\"/a/?id=48911\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48911/0.jpg\"></a>\n            <span class=\"shuliang\">67P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=219\">风骚</a></p>\n            <p>人物：<a href=\"/t/?id=4072\">Emily顾奈奈酱</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48911\">[秀人XiuRen] No.4065 Emily尹菲</a></p>\n        </li>\n        <li id=\"48910\">\n            <a href=\"/a/?id=48910\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48910/0.jpg\"></a>\n            <span class=\"shuliang\">61P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=225\">黑丝制服</a></p>\n            <p>人物：<a href=\"/t/?id=4746\">如歌fairy</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48910\">[秀人XiuRen] No.4064 fairy如歌</a></p>\n        </li>\n        <li id=\"48909\">\n            <a href=\"/a/?id=48909\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48909/0.jpg\"></a>\n            <span class=\"shuliang\">48P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=25\">和服</a> <a href=\"/s/?id=70\">RT</a></p>\n            <p>人物：<a href=\"/t/?id=6351\">韩希蕾</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48909\">[秀人XiuRen] No.4063 韩希蕾</a></p>\n        </li>\n        <li id=\"48908\">\n            <a href=\"/a/?id=48908\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48908/0.jpg\"></a>\n            <span class=\"shuliang\">42P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=225\">黑丝制服</a></p>\n            <p>人物：<a href=\"/t/?id=6137\">吴雪瑶</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48908\">[秀人XiuRen] No.4062 吴雪瑶</a></p>\n        </li>\n        <li id=\"48907\">\n            <a href=\"/a/?id=48907\" target=\"_blank\"><img src=\"https://tjg.gzhuibei.com/a/1/48907/0.jpg\"></a>\n            <span class=\"shuliang\">81P</span>\n            <p>收录：2022-02-12</p>\n            <p>机构：<a href=\"/x/?id=59\">秀人网</a></p>\n            <p>标签：<a href=\"/s/?id=73\">情趣内衣</a> <a href=\"/s/?id=219\">风骚</a></p>\n            <p>人物：<a href=\"/t/?id=6066\">唐安琪</a></p>\n            <p class=\"biaoti\"><a href=\"/a/?id=48907\">[秀人XiuRen] No.4061 唐安琪</a></p>\n        </li>\n    </ul>\n</div>\n\n<div class=\"bk10\"></div>\n<center><div id=\"pages\" class=\"text-c\"><div><span  class=\"current\">1</span><a class=\"num\" href=\"/u/?action=gengxin&page=2\">2</a><a class=\"num\" href=\"/u/?action=gengxin&page=3\">3</a><a class=\"num\" href=\"/u/?action=gengxin&page=4\">4</a><a class=\"num\" href=\"/u/?action=gengxin&page=5\">5</a><a class=\"num\" href=\"/u/?action=gengxin&page=6\">6</a><a class=\"num\" href=\"/u/?action=gengxin&page=7\">7</a><a class=\"num\" href=\"/u/?action=gengxin&page=8\">8</a><a class=\"num\" href=\"/u/?action=gengxin&page=9\">9</a><a class=\"next\" href=\"/u/?action=gengxin&page=2\">下一页</a><a class=\"next\" href=\"/u/?action=gengxin&page=2446\">末页</a></div></div></center>\n<div class=\"bk20\"></div>\n<center><form action=\"?\" method=\"get\"><input name=\"action\" type=\"hidden\" value=\"gengxin\">跳转至 <input name=\"page\" type=\"text\" value=\"\"> 页 <button type=\"submit\">确定跳转</button> </form> </center>\n<div class=\"bk10\"></div>\n\n\n\n\n<script>\nlayui.use('element', function(){\n  var element = layui.element;\n});\n</script>\n<div class=\"footer\"> 到底了~ <a href=\"https://m.tujidao.com/\">APP下载</a> | <a href=\"http://www.wotuji.com/\">网址发布</a>\n    <p style=\"display:none\"><script src=\"https://s11.cnzz.com/z_stat.php?id=1257039673&web_id=1257039673\" language=\"JavaScript\"></script></p></div>\n</body>\n</html>"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.devyy</groupId>\n    <artifactId>openyspider</artifactId>\n    <version>${revision}</version>\n    <packaging>pom</packaging>\n\n    <modules>\n        <module>oys-core</module>\n        <module>oys-tujidao</module>\n        <module>oys-boot-starter</module>\n        <module>oys-codeforces</module>\n    </modules>\n\n    <properties>\n        <!-- 三方库 -->\n        <org.springframework.boot.spring-boot-dependencies.version>2.7.5\n        </org.springframework.boot.spring-boot-dependencies.version>\n        <org.projectlombok.lombok.version>1.18.24</org.projectlombok.lombok.version>\n        <com.baomidou.mybatis-plus-boot-starter.version>3.5.2</com.baomidou.mybatis-plus-boot-starter.version>\n        <io.springfox.springfox-boot-starter.version>3.0.0</io.springfox.springfox-boot-starter.version>\n        <commons-io.commons-io.version>2.11.0</commons-io.commons-io.version>\n        <org.jsoup.jsoup.version>1.15.3</org.jsoup.jsoup.version>\n        <org.seleniumhq.selenium.selenium-chrome-driver.version>4.1.4</org.seleniumhq.selenium.selenium-chrome-driver.version>\n\n        <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>\n        <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>\n        <maven-failsafe-plugin.version>2.22.2</maven-failsafe-plugin.version>\n        <jacoco-maven-plugin.version>0.8.8</jacoco-maven-plugin.version>\n\n        <!-- 一方库 -->\n        <revision>4.0-SNAPSHOT</revision>\n\n        <java.version>17</java.version>\n        <maven.compiler.source>17</maven.compiler.source>\n        <maven.compiler.target>17</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-dependencies</artifactId>\n                <version>${org.springframework.boot.spring-boot-dependencies.version}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n            <dependency>\n                <groupId>org.seleniumhq.selenium</groupId>\n                <artifactId>selenium-api</artifactId>\n                <version>${org.seleniumhq.selenium.selenium-chrome-driver.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.seleniumhq.selenium</groupId>\n                <artifactId>selenium-remote-driver</artifactId>\n                <version>${org.seleniumhq.selenium.selenium-chrome-driver.version}</version>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <!-- UT -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-inline</artifactId>\n        </dependency>\n\n        <!-- jsoup -->\n        <dependency>\n            <groupId>org.jsoup</groupId>\n            <artifactId>jsoup</artifactId>\n            <version>${org.jsoup.jsoup.version}</version>\n        </dependency>\n        <!-- lombok -->\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>${org.projectlombok.lombok.version}</version>\n        </dependency>\n        <!-- jdbc -->\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n        </dependency>\n        <!-- mybatis-plus-->\n        <dependency>\n            <groupId>com.baomidou</groupId>\n            <artifactId>mybatis-plus-boot-starter</artifactId>\n            <version>${com.baomidou.mybatis-plus-boot-starter.version}</version>\n        </dependency>\n        <!-- swagger3 -->\n        <dependency>\n            <groupId>io.springfox</groupId>\n            <artifactId>springfox-boot-starter</artifactId>\n            <version>${io.springfox.springfox-boot-starter.version}</version>\n        </dependency>\n        <!-- commons-io -->\n        <dependency>\n            <groupId>commons-io</groupId>\n            <artifactId>commons-io</artifactId>\n            <version>${commons-io.commons-io.version}</version>\n        </dependency>\n\n        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->\n        <dependency>\n            <groupId>org.seleniumhq.selenium</groupId>\n            <artifactId>selenium-chrome-driver</artifactId>\n            <version>${org.seleniumhq.selenium.selenium-chrome-driver.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.kafka</groupId>\n            <artifactId>spring-kafka</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-redis</artifactId>\n        </dependency>\n\n        <!-- https://mvnrepository.com/artifact/com.kennycason/kumo-core -->\n        <dependency>\n            <groupId>com.kennycason</groupId>\n            <artifactId>kumo-core</artifactId>\n            <version>1.28</version>\n        </dependency>\n        <dependency>\n            <groupId>com.kennycason</groupId>\n            <artifactId>kumo-api</artifactId>\n            <version>1.28</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>flatten-maven-plugin</artifactId>\n                <version>${flatten-maven-plugin.version}</version>\n                <configuration>\n                    <updatePomFile>true</updatePomFile>\n                    <flattenMode>resolveCiFriendliesOnly</flattenMode>\n                    <pomElements>\n                        <dependencies>expand</dependencies>\n                    </pomElements>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>flatten</id>\n                        <phase>process-resources</phase>\n                        <goals>\n                            <goal>flatten</goal>\n                        </goals>\n                    </execution>\n                    <execution>\n                        <id>flatten.clean</id>\n                        <phase>clean</phase>\n                        <goals>\n                            <goal>clean</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <version>${maven-surefire-plugin.version}</version>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-failsafe-plugin</artifactId>\n                <version>${maven-failsafe-plugin.version}</version>\n            </plugin>\n\n            <!-- https://www.baeldung.com/jacoco -->\n            <plugin>\n                <groupId>org.jacoco</groupId>\n                <artifactId>jacoco-maven-plugin</artifactId>\n                <version>${jacoco-maven-plugin.version}</version>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>prepare-agent</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "sql_scripts/oys3_all_scripts_mysql.sql",
    "content": "/*==============================================================*/\n/* Table: OYS_TUJIDAO_ALBUM                                     */\n/*==============================================================*/\nCREATE TABLE OYS_TUJIDAO_ALBUM_T\n(\n   ID                   BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID' ,\n   STATE                INT  COMMENT '状态',\n   TOTAL                INT  COMMENT '图片总数',\n   ALBUM_NAME           VARCHAR(255)  COMMENT '相册名',\n   ALBUM_ID             INT  COMMENT '相册id',\n   CREATION_DATE        DATETIME DEFAULT CURRENT_TIMESTAMP  COMMENT '创建时间',\n   LAST_UPDATED_DATE    DATETIME DEFAULT CURRENT_TIMESTAMP  COMMENT '最后修改时间',\n   PRIMARY KEY (ID),\n   KEY ALBUM_ID_UNIQUE (ALBUM_ID)\n);\n\n/*==============================================================*/\n/* Table: OYS_CODEFORCES                                        */\n/*==============================================================*/\nCREATE TABLE OYS_CODEFORCES\n(\n    SUBMISSION_ID        VARCHAR(32) NOT NULL  COMMENT '提交 ID',\n    NO                   NUMERIC(11,0)  COMMENT '序号',\n    FRAGMENT             VARCHAR(1024)  COMMENT '片段值',\n    PRIMARY KEY (SUBMISSION_ID)\n);"
  }
]