Repository: RxGirlz/OpenYspider
Branch: 4.x
Commit: bdb54be48d74
Files: 29
Total size: 123.3 KB
Directory structure:
gitextract_fx82gl62/
├── .gitignore
├── README-JAV.md
├── README.md
├── oys-boot-starter/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── devyy/
│ │ └── oys/
│ │ └── srarter/
│ │ ├── OpenYspiderApplication.java
│ │ ├── config/
│ │ │ ├── MybatisPlusConfig.java
│ │ │ └── Swagger3Config.java
│ │ └── main/
│ │ └── JavMain.java
│ └── resources/
│ ├── META-INF/
│ │ └── additional-spring-configuration-metadata.json
│ ├── application-mysql.properties
│ └── application.properties
├── oys-codeforces/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── devyy/
│ └── oys/
│ └── codeforces/
│ ├── CfController.java
│ ├── CfDO.java
│ └── dao/
│ └── CfMapper.java
├── oys-core/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── devyy/
│ └── oys/
│ └── srarter/
│ └── core/
│ ├── enums/
│ │ └── StateTypeEnum.java
│ └── util/
│ └── SpiderUtil.java
├── oys-tujidao/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── devyy/
│ │ └── oys/
│ │ └── tujidao/
│ │ ├── TuJiDaoAlbumDO.java
│ │ ├── TuJiDaoController.java
│ │ ├── TuJiDaoService.java
│ │ ├── TuJiDaoServiceImpl.java
│ │ └── dao/
│ │ └── TuJiDaoAlbumMapper.java
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── devyy/
│ │ └── oys/
│ │ └── tujidao/
│ │ └── TuJiDaoServiceImplTest.java
│ └── resources/
│ ├── gengxin.html
│ └── gengxin2.html
├── pom.xml
└── sql_scripts/
└── oys3_all_scripts_mysql.sql
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
================================================
FILE: README-JAV.md
================================================
- IPX=265 5T2
- SSNI=256 停更 5T2
- SSIS=162 5T4
- MIAA=135 5T5
- STARS=132 5T3
- MIDE=128 5T3
- FSDSS=128 5T4
- JUL=103 5T4
- JUFE=85 5T5
- HND=85 5T1
- /
- ABP=84 5T1
- CAWD=71 5T4
- FCH=66 停更 5T5
- DASD=58 5T3
- ABW=54 5T4
- CJOD=53 5T5
- PPPD=52 5T3
- RKI=46 5T5
- PRED=45 5T1
- MGMQ=45 5T5
- /
- DPMI=45 5T3
- DNJR=44 5T5
- MSFH=42 5T5 停更
- MKMP=41 5T3
- MOPG=39 停更 5T5
- DMOW=37 停更 5T5
- GVH=37 5T3
- OTIM=34 停更 5T3
- GENM=33 5T5
- MEYD=32 5T1
- /
- OKP=32 5T2
- MVSD=31 5T3
- WANZ=30 停更 5T1
- MGMJ=30 停更 5T5
- BLK=30 5T3
- APNS=29 5T3
- MGMP=27 5T5
- EKDV=27 5T1
- EBOD=26 5T2
- OFJE=26 5T2
- /
- ARM=25 5T5
- MDTM=23 5T1
- AARM=22 5T5
- IPVR=21 5T4
- CLOT=18 5T5
- TPPN=18 5T3
- ECB=18 5T1
- MMUS=16
- DVAJ=16
- SHKD=16
---
OVG-149
PFES-003
PFES-012
RCTD-108
SNIS-792
SW-690
XMOM-016
---
IPX-992
IPX-838
IPX-819
IPX-916
IPX-851
IPX-832
IPX-812
JUFE-400
JUFE-385
JUFE-375
CJOD-340
RKI-623
MGMQ
MOPT-019
MOPT-021
AARM-109
AARM-110
松本いちか
VRKM-497
EBVR-035
================================================
FILE: README.md
================================================
# OpenYspider 4.x
千万级图片、视频爬虫 [开源版本]

## 简介
OpenYspider 是一个使用 Java 编写的简单爬虫。主要用到的技术栈有:
1. spring-boot-starter-web
2. spring-boot-starter-test
3. mybatis-plus-boot-starter
4. springfox-boot-starter
5. lombok
6. jsoup
7. mockito + jacoco
当前 LTS 的网站有:
1. `tujidao.com`
Deprecated 的网站(请于历史提交中查看):
1. `tangyun365.com`
2. `yalayi.com`
3. `rosmm88.com`
4. `mzsock.com`
5. `meinvla.net`
6. `leetcode-cn.com`
## 开发环境
`Windows 11` + `JDK 17` + `Mysql 8.x`
```sh
$ java --version
openjdk 17.0.1 2021-10-19
OpenJDK Runtime Environment (build 17.0.1+12-39)
OpenJDK 64-Bit Server VM (build 17.0.1+12-39, mixed mode, sharing)
```
运行启动类 `OpenYspiderApplication` 后,浏览器访问 [http://localhost:23333/swagger-ui/index.html#/](http://localhost:23333/swagger-ui/index.html#/)
数据库脚本: [sql_scripts](./sql_scripts/oys3_all_scripts_mysql.sql)
## 爬取网站
数据统计截止 2022-02-12
### 1 图集岛(原美图日) [ 2,647,717P / 905G ]
- 目标网站:[https://www.tujidao.com/](https://www.tujidao.com/)
- 特点:图片路径可遍历
```sql
select count(*) from oys_tujidao_album_t where album_id > 0 and album_id <= 10000; -- 9995 ok
select count(*) from oys_tujidao_album_t where album_id > 10000 and album_id <= 20000; -- 10000
select count(*) from oys_tujidao_album_t where album_id > 20000 and album_id <= 30000; -- 9999 [23001]
select count(*) from oys_tujidao_album_t where album_id > 30000 and album_id <= 40000; -- 10000
select count(*) from oys_tujidao_album_t where album_id > 40000 and album_id <= 50000; -- 8925 [46018]
```
## 部分成果展示


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