Prechádzať zdrojové kódy

add:crawler4lovefoot添加feetpassion源v1

lvzhiqiang 4 mesiacov pred
rodič
commit
a1811f3c49

+ 2 - 0
src/main/java/top/lvzhiqiang/config/MyJavJobs.java

@@ -178,6 +178,8 @@ public class MyJavJobs {
         crawler4LoveFootService.jsoupLoveFoot4avnoashi(null, 2, 2);
 
         crawler4LoveFootService.jsoupLoveFoot4jpfoot(null, 2, 2);
+
+        crawler4LoveFootService.jsoupLoveFoot4feetpassion(null, 2, 2);
     }
 
     /**

+ 2 - 0
src/main/java/top/lvzhiqiang/controller/CrawlerController.java

@@ -258,6 +258,8 @@ public class CrawlerController {
                 crawler4LoveFootService.jsoupLoveFoot4avnoashi(status, isDel, ignoreRetryCount);
             } else if (status == 12) {
                 crawler4LoveFootService.jsoupLoveFoot4jpfoot(status, isDel, ignoreRetryCount);
+            } else if (status == 13) {
+                crawler4LoveFootService.jsoupLoveFoot4feetpassion(status, isDel, ignoreRetryCount);
             }
         }
 

+ 1 - 0
src/main/java/top/lvzhiqiang/entity/CrawlerLoveFoot.java

@@ -78,6 +78,7 @@ public class CrawlerLoveFoot implements Serializable {
      */
     private String orginAvnoashiUrl;
     private String orginJpfootUrl;
+    private String orginFeetpassionUrl;
 
     private String javdbUrl;
 

+ 1 - 0
src/main/java/top/lvzhiqiang/entity/VideoInfo.java

@@ -127,6 +127,7 @@ public class VideoInfo implements Serializable {
      */
     private String orginAvnoashiUrl;
     private String orginJpfootUrl;
+    private String orginFeetpassionUrl;
 
     private String score;
     private String comment;

+ 11 - 4
src/main/java/top/lvzhiqiang/mapper/CrawlerLoveFootMapper.java

@@ -33,22 +33,29 @@ public interface CrawlerLoveFootMapper {
     CrawlerLoveFoot findLatestInfo4avnoashi();
     @Select("SELECT * FROM crawler_lovefoot_info WHERE orgin_jpfoot_url is not null and delete_flag = 1 order by update_date desc limit 1")
     CrawlerLoveFoot findLatestInfo4jpfoot();
+    @Select("SELECT * FROM crawler_lovefoot_info WHERE orgin_feetpassion_url is not null and delete_flag = 1 order by update_date desc limit 1")
+    CrawlerLoveFoot findLatestInfo4feetpassion();
 
     /**
      * 新增
      *
      * @param crawlerLoveFoot
      */
-    @Insert("INSERT INTO crawler_lovefoot_info(name, identification_code, issue_date, length, director, maker, issuer, genres, cast, img_url, orgin_avnoashi_url, type, status, failure_cause, clock_date, update_date, create_time, modify_time) " +
-            "VALUES (#{name}, #{identificationCode}, #{issueDate}, #{length}, #{director}, #{maker}, #{issuer}, #{genres}, #{cast}, #{imgUrl}, #{orginAvnoashiUrl}, #{type}, #{status}, #{failureCause}, #{clockDate}, #{updateDate}, #{createTime}, now()) " +
+    @Insert("INSERT INTO crawler_lovefoot_info(name, identification_code, issue_date, length, director, maker, issuer, genres, cast, img_url, orgin_avnoashi_url, javdb_url, type, status, failure_cause, clock_date, update_date, create_time, modify_time) " +
+            "VALUES (#{name}, #{identificationCode}, #{issueDate}, #{length}, #{director}, #{maker}, #{issuer}, #{genres}, #{cast}, #{imgUrl}, #{orginAvnoashiUrl}, #{javdbUrl}, #{type}, #{status}, #{failureCause}, #{clockDate}, #{updateDate}, #{createTime}, now()) " +
             "ON DUPLICATE KEY UPDATE name=values(name),issue_date=values(issue_date),length=values(length),director=values(director),maker=values(maker),issuer=values(issuer),genres=values(genres),cast=values(cast)," +
             "img_url=values(img_url),orgin_avnoashi_url=values(orgin_avnoashi_url),type=values(type),status=values(status),failure_cause=values(failure_cause),clock_date=values(clock_date),update_date=values(update_date),modify_time=now()")
     int insertOrUpdate4avnoashi(CrawlerLoveFoot crawlerLoveFoot);
-    @Insert("INSERT INTO crawler_lovefoot_info(name, identification_code, issue_date, length, director, maker, issuer, genres, cast, img_url, orgin_jpfoot_url, type, status, failure_cause, clock_date, update_date, create_time, modify_time) " +
-            "VALUES (#{name}, #{identificationCode}, #{issueDate}, #{length}, #{director}, #{maker}, #{issuer}, #{genres}, #{cast}, #{imgUrl}, #{orginJpfootUrl}, #{type}, #{status}, #{failureCause}, #{clockDate}, #{updateDate}, #{createTime}, now()) " +
+    @Insert("INSERT INTO crawler_lovefoot_info(name, identification_code, issue_date, length, director, maker, issuer, genres, cast, img_url, orgin_jpfoot_url, javdb_url, type, status, failure_cause, clock_date, update_date, create_time, modify_time) " +
+            "VALUES (#{name}, #{identificationCode}, #{issueDate}, #{length}, #{director}, #{maker}, #{issuer}, #{genres}, #{cast}, #{imgUrl}, #{orginJpfootUrl}, #{javdbUrl}, #{type}, #{status}, #{failureCause}, #{clockDate}, #{updateDate}, #{createTime}, now()) " +
             "ON DUPLICATE KEY UPDATE name=values(name),issue_date=values(issue_date),length=values(length),director=values(director),maker=values(maker),issuer=values(issuer),genres=values(genres),cast=values(cast)," +
             "img_url=values(img_url),orgin_jpfoot_url=values(orgin_jpfoot_url),type=values(type),status=values(status),failure_cause=values(failure_cause),clock_date=values(clock_date),update_date=values(update_date),modify_time=now()")
     int insertOrUpdate4jpfoot(CrawlerLoveFoot crawlerLoveFoot);
+    @Insert("INSERT INTO crawler_lovefoot_info(name, identification_code, issue_date, length, director, maker, issuer, genres, cast, img_url, orgin_feetpassion_url, javdb_url, type, status, failure_cause, clock_date, update_date, create_time, modify_time) " +
+            "VALUES (#{name}, #{identificationCode}, #{issueDate}, #{length}, #{director}, #{maker}, #{issuer}, #{genres}, #{cast}, #{imgUrl}, #{orginFeetpassionUrl}, #{javdbUrl}, #{type}, #{status}, #{failureCause}, #{clockDate}, #{updateDate}, #{createTime}, now()) " +
+            "ON DUPLICATE KEY UPDATE name=values(name),issue_date=values(issue_date),length=values(length),director=values(director),maker=values(maker),issuer=values(issuer),genres=values(genres),cast=values(cast)," +
+            "img_url=values(img_url),orgin_feetpassion_url=values(orgin_feetpassion_url),type=values(type),status=values(status),failure_cause=values(failure_cause),clock_date=values(clock_date),update_date=values(update_date),modify_time=now()")
+    int insertOrUpdate4feetpassion(CrawlerLoveFoot crawlerLoveFoot);
 
     /**
      * 获取类型

+ 2 - 0
src/main/java/top/lvzhiqiang/service/Crawler4LoveFootService.java

@@ -15,4 +15,6 @@ public interface Crawler4LoveFootService {
     void jsoupLoveFoot4jpfoot(Integer status, Integer isDel, Integer ignoreRetryCount) throws Exception;
 
     void jsoupLoveFoot4CrawingFail2(Integer status, Integer ignoreRetryCount, String website, String identificationCode);
+
+    void jsoupLoveFoot4feetpassion(Integer status, Integer isDel, Integer ignoreRetryCount) throws Exception;
 }

+ 160 - 2
src/main/java/top/lvzhiqiang/service/impl/Crawler4LoveFootServiceImpl.java

@@ -68,7 +68,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
     public void beforeProxy() {
         if (null == proxy) {
             if ("dev".equals(env)) {
-                proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080));
+                proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7897));
             } else {
                 proxy = Proxy.NO_PROXY;
             }
@@ -144,6 +144,40 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
 
     @Async
     @Override
+    public void jsoupLoveFoot4feetpassion(Integer status, Integer isDel, Integer ignoreRetryCount) throws Exception {
+        log.warn("jsoupLoveFoot4feetpassion 开始:status={},isDel={},ignoreRetryCount={}", status, isDel, ignoreRetryCount);
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+        if (isDel == 1) {
+            crawlerLoveFootMapper.deleteAll();
+        }
+
+        List<DicCode> dicCodeList = dicCodeMapper.findAll();
+        // 获取常量MAP
+        footConstantMap = dicCodeList.stream()
+                .filter(x -> "foot".equals(x.getCodeDesc()) && x.getEnv().contains(env))
+                .collect(Collectors.toMap(DicCode::getCodeKey, DicCode::getCodeValue, (key1, key2) -> key1));
+        javbusConstantMap = dicCodeList.stream()
+                .filter(x -> x.getType() != null && 1 == x.getType() && x.getEnv().contains(env))
+                .collect(Collectors.toMap(DicCode::getCodeKey, DicCode::getCodeValue, (key1, key2) -> key1));
+        javdbConstantMap = dicCodeList.stream()
+                .filter(x -> x.getType() != null && 2 == x.getType() && x.getEnv().contains(env))
+                .collect(Collectors.toMap(DicCode::getCodeKey, DicCode::getCodeValue, (key1, key2) -> key1));
+        // 获取javbus防屏蔽地址
+        javbusUrlList = videoSitePoolMapper.findUrlByTypeAndDeleteFlag(1, 1);
+        if (javbusUrlList.size() == 0) {
+            log.warn("javbusUrlList为空");
+            return;
+        }
+        // 代理及TOKEN设置
+        beforeProxy();
+        // 解析原始站点
+        jsoupLoveFoot4feetpassionSub(status, ignoreRetryCount);
+        log.warn("jsoupLoveFoot4feetpassion 结束:time={}", stopWatch.getTotalTimeSeconds());
+    }
+
+    @Async
+    @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public void jsoupLoveFoot4CrawingFail(Integer status, Integer ignoreRetryCount, String website, String identificationCode) {
         log.warn("jjsoupLoveFoot4CrawingFail 开始");
@@ -624,7 +658,10 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
 
         String machiImgUrl = "足舐/".concat(fileName);
 
-        saveFile(response.bodyStream(), javbusConstantMap.get("apics_path").concat(machiImgUrl));
+        if (!"dev".equals(env)) {
+            saveFile(response.bodyStream(), javbusConstantMap.get("apics_path").concat(machiImgUrl));
+        }
+
         long end = System.currentTimeMillis();
 
         crawlerLoveFoot.setImgUrl(machiImgUrl);
@@ -844,6 +881,127 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
         }
     }
 
+    public void jsoupLoveFoot4feetpassionSub(Integer status, Integer ignoreRetryCount) throws Exception {
+        CrawlerLoveFoot latestLoveFoot = crawlerLoveFootMapper.findLatestInfo4feetpassion();
+
+        LocalDate latestDate;
+        if (latestLoveFoot == null) {
+            latestDate = LocalDate.of(1970, 1, 1);
+        } else {
+            latestDate = latestLoveFoot.getUpdateDate();
+        }
+
+        String feetpassionUrl = footConstantMap.get("feetpassion_url");
+        headerMap.put("referer", feetpassionUrl);
+        Document loveFootDocument;
+        Document loveFootDetailDocument;
+        int successIndex = 0;
+        outer:
+        while (true) {
+            loveFootDocument = JsoupUtil.requestDocument(feetpassionUrl, JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
+            log.warn("jsoupLoveFoot4feetpassionSub page success:url={}", feetpassionUrl);
+
+            Elements sourceSelects = loveFootDocument.select("div.archive").select("article.archive__item");
+            for (Element sourceSelect : sourceSelects) {
+                Thread.sleep(1000L);
+                String sourceUrl = sourceSelect.select("div.eyecatch > a.eyecatch__link").attr("abs:href");
+
+                String sourceUrlOri = sourceUrl;
+                sourceUrl = URLDecoder.decode(sourceUrl, "UTF-8");
+
+                Integer statusInt = 2;
+                Integer typeInt = 1;
+                LocalDate clockDate = null;
+                LocalDate updateDate = null;
+                String keywords = null;
+                try {
+                    loveFootDetailDocument = JsoupUtil.requestDocument(sourceUrlOri, JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
+                    String clockDateStr = loveFootDetailDocument.select("div.dividerBottom > ul.dateList-main").select("li.icon-clock").text();
+                    String updateDateStr = loveFootDetailDocument.select("div.dividerBottom > ul.dateList-main").select("li.icon-update").text();
+                    if (StringUtils.isNotEmpty(clockDateStr)) {
+                        clockDate = LocalDate.parse(clockDateStr, DateUtils.dateFormatter3);
+                    }
+                    if (StringUtils.isNotEmpty(updateDateStr)) {
+                        updateDate = LocalDate.parse(updateDateStr, DateUtils.dateFormatter3);
+                    }
+
+                    if (clockDate == null && updateDate == null) {
+                        break outer;
+                    }
+                    if (clockDate == null) {
+                        clockDate = updateDate;
+                    }
+                    if (updateDate == null) {
+                        updateDate = clockDate;
+                    }
+
+                    if (updateDate.isBefore(latestDate) || updateDate.isEqual(latestDate)) {
+                        break outer;
+                    }
+
+                    // 获取关键词
+                    Elements keywordsElements = loveFootDetailDocument.select("div.postContents").select("a > span");
+                    if (!keywordsElements.isEmpty()) {
+                        keywords = keywordsElements.get(0).text().trim();
+                    } else {
+                        keywordsElements = loveFootDetailDocument.select("div.postContents > section.content").select("p");
+                        keywords = keywordsElements.get(0).text().trim();
+                        keywords = keywords.split(":")[1].trim();
+                        keywords = keywords.substring(0, keywords.lastIndexOf(" ")).trim();
+                    }
+
+                    if (StringUtils.isNotEmpty(keywords)) {
+                        statusInt = 1;
+                        successIndex++;
+                        log.warn("jsoupLoveFoot4feetpassionSub parseDetailToKeywords success,sourceUrl={},keywords={},successNum={}", sourceUrl, keywords, successIndex);
+                    } else {
+                        throw new Exception("keywords is null");
+                    }
+
+                    // 通过关键词获取识别码
+                    CrawlerLoveFoot crawlerLoveFoot = new CrawlerLoveFoot();
+                    crawlerLoveFoot.setClockDate(clockDate);
+                    crawlerLoveFoot.setUpdateDate(updateDate);
+                    crawlerLoveFoot.setOrginFeetpassionUrl(sourceUrl);
+                    crawlerLoveFoot.setType(2);
+                    crawlerLoveFoot.setStatus(3);
+                    crawlerLoveFoot.setCreateTime(LocalDateTime.now());
+                    crawlerLoveFoot.setName(keywords);
+
+                    Thread.sleep(3000);
+                    String message = parseKeywordsToCode(crawlerLoveFoot, keywords, "javdb");
+                    if (StringUtils.isNotEmpty(message)) {
+                        statusInt = 4;
+                        throw new Exception(message);
+                    }
+
+                    crawlerLoveFootMapper.insertOrUpdate4feetpassion(crawlerLoveFoot);
+                } catch (Exception e) {
+                    // log.error("jsoupLoveFoot4jpfootSub detail fail,sourceUrl={}", sourceUrl, e);
+                    CrawlerLoveFoot crawlerLoveFoot = new CrawlerLoveFoot();
+                    crawlerLoveFoot.setIdentificationCode(UUID.randomUUID().toString());
+                    crawlerLoveFoot.setOrginFeetpassionUrl(sourceUrl);
+                    crawlerLoveFoot.setClockDate(clockDate);
+                    crawlerLoveFoot.setUpdateDate(updateDate);
+                    crawlerLoveFoot.setName(keywords);
+                    crawlerLoveFoot.setType(typeInt);
+                    crawlerLoveFoot.setStatus(statusInt);
+                    crawlerLoveFoot.setCreateTime(LocalDateTime.now());
+                    crawlerLoveFoot.setFailureCause(e.getMessage());
+                    crawlerLoveFootMapper.insertOrUpdate4feetpassion(crawlerLoveFoot);
+                }
+            }
+
+            // 继续下一页
+            Elements nextSelects = loveFootDocument.select("ul.pager > li.pager__item-next").select("a");
+            if (nextSelects.size() > 0) {
+                feetpassionUrl = nextSelects.get(0).attr("abs:href");
+            } else {
+                break;
+            }
+        }
+    }
+
     private String parseKeywordsToCode(CrawlerLoveFoot crawlerLoveFoot, String keywords, String website) {
         int retryCount = 0;
         Document javbusSearchDocument = null;

+ 1 - 1
src/main/resources/mapper/VideoInfoLoveFootMapper.xml

@@ -6,7 +6,7 @@
 <mapper namespace="top.lvzhiqiang.mapper.CrawlerLoveFootMapper">
 
     <select id="getVideoInfoLoveFootList" resultType="top.lvzhiqiang.entity.VideoInfo">
-        select vi.id,vi.name,vi.identification_code,vi.issue_date,vi.modify_time,vi.update_date,vi.type,vi.img_url,vi.orgin_avnoashi_url,vi.orgin_jpfoot_url,IFNULL(vi.cast, vi.genres) AS main_who,IFNULL(vio.score, 0) AS score, IFNULL(vio.comment, '暂无评论') AS comment,
+        select vi.id,vi.name,vi.identification_code,vi.issue_date,vi.modify_time,vi.update_date,vi.type,vi.img_url,vi.orgin_avnoashi_url,vi.orgin_jpfoot_url,vi.orgin_feetpassion_url,IFNULL(vi.cast, vi.genres) AS main_who,IFNULL(vio.score, 0) AS score, IFNULL(vio.comment, '暂无评论') AS comment,
             IFNULL(temp1.identification_code, 'false') AS videoInfoFlag,IFNULL(temp2.identification_code, 'false') AS videoInfoPoolFlag,temp2.type AS videoInfoPoolType
         from crawler_lovefoot_info vi
         left join video_info_other vio on vi.identification_code = vio.identification_code and vio.delete_flag = 1

+ 1 - 0
src/main/resources/static/crawler.html

@@ -260,6 +260,7 @@
                 <option value="41">爬取失败2</option>
                 <option value="11">从0开始avnoashi</option>
                 <option value="12">从0开始jpfoot</option>
+                <option value="13">从0开始feetpassion</option>
             </select>
             <span>website</span>
             <select name="website" style="height: 21.43px;">

+ 4 - 0
src/main/resources/static/js/my-video.js

@@ -148,6 +148,7 @@ function search(pageNo, startFlag, searchSelectFlag) {
                     } else if (bigType == '足舐') {
                         scoreStr += (videoInfo.orginAvnoashiUrl === null ? '' : 'avnoashi|');
                         scoreStr += (videoInfo.orginJpfootUrl === null ? '' : 'jpfoot|');
+                        scoreStr += (videoInfo.orginFeetpassionUrl === null ? '' : 'feetpassion|');
 
                         scoreStr += (videoInfo.videoInfoFlag === 'false' ? '' : '骑兵|');
 
@@ -163,6 +164,9 @@ function search(pageNo, startFlag, searchSelectFlag) {
                         orginUrl += videoInfo.orginAvnoashiUrl === null ? '' : videoInfo.orginAvnoashiUrl;
                         orginUrl += (videoInfo.orginAvnoashiUrl != null && videoInfo.orginJpfootUrl != null) ? ',' : '';
                         orginUrl += videoInfo.orginJpfootUrl === null ? '' : videoInfo.orginJpfootUrl;
+                        if (orginUrl === '') {
+                            orginUrl += videoInfo.orginFeetpassionUrl;
+                        }
                     } else {
                         scoreStr = videoInfo.score;
                     }

+ 34 - 0
src/test/java/top/lvzhiqiang/CrawlerLoveFootTest.java

@@ -0,0 +1,34 @@
+package top.lvzhiqiang;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import top.lvzhiqiang.service.Crawler4LoveFootService;
+
+import javax.annotation.Resource;
+
+/**
+ * 单元测试类
+ *
+ * @author lvzhiqiang
+ * 2022/9/10 21:24
+ */
+@Slf4j
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(properties = {
+        "spring.profiles.active=dev",
+        "logging.level.top.lvzhiqiang=DEBUG"
+}
+)
+public class CrawlerLoveFootTest {
+
+    @Resource
+    private Crawler4LoveFootService crawler4LoveFootService;
+
+    @Test
+    public void testJsoupLoveFoot4feetpassion() throws Exception {
+        crawler4LoveFootService.jsoupLoveFoot4feetpassion(null, 2, 2);
+    }
+}

+ 53 - 0
src/test/java/top/lvzhiqiang/Test7.java

@@ -0,0 +1,53 @@
+package top.lvzhiqiang;
+
+import org.jsoup.nodes.Document;
+import org.jsoup.select.Elements;
+import top.lvzhiqiang.util.DateUtils;
+import top.lvzhiqiang.util.JsoupUtil;
+
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Test7 {
+    public static void main(String[] args) throws Exception {
+        String keywords = "動画作品名:義父の濃厚な舌技で舐め堕ちした美人妻 小島みなみ ssni00953";
+        keywords = "動画作品名:元地方局アナウンサーの人妻 初ドラマ作品!! 抱かれたくない男に死にたくなるほどイカされて… 田中なな実 jul00935";
+        keywords ="動画作品名:義父の濃厚な舌技で舐め堕ちした美人妻 小島みなみ ssni00953";
+        keywords = keywords.split(":")[1].trim();
+        keywords = keywords.substring(0, keywords.lastIndexOf(" ")).trim();
+        System.out.println(keywords);
+
+
+        String sourceUrl = "https://feetpassion.net/ashi-name/ 【新木希空】丸みを帯びた新木希空さんの足の/";
+        sourceUrl = "https://feetpassion.net/ashi-name/%e3%80%80%e3%80%90%e6%9d%b1%e5%87%9b%e3%80%91%e5%8f%b3%e8%b6%b3%e3%81%af%e3%83%94%e3%83%b3%e3%82%af%e3%80%81%e5%b7%a6%e8%b6%b3%e3%81%af%e3%82%a4%e3%82%a8%e3%83%ad%e3%83%bc%e3%81%ae%e3%83%95%e3%83%83/";
+        sourceUrl = "https://feetpassion.net/ashi-name/【川上ゆう】暑い夏の今だからこそ、ロングブー/";
+
+        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7897));
+        Map<String, String> headerMap = new HashMap<>();
+        headerMap.put("referer", sourceUrl);
+        Document loveFootDetailDocument = JsoupUtil.requestDocument(sourceUrl, JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
+        String clockDateStr = loveFootDetailDocument.select("div.dividerBottom > ul.dateList-main").select("li.icon-clock").text();
+        String updateDateStr = loveFootDetailDocument.select("div.dividerBottom > ul.dateList-main").select("li.icon-update").text();
+        LocalDate clockDate = LocalDate.parse(clockDateStr, DateUtils.dateFormatter3);
+        LocalDate updateDate = LocalDate.parse(updateDateStr, DateUtils.dateFormatter3);
+
+
+        // 获取关键词
+        Elements keywordsElements = loveFootDetailDocument.select("div.postContents").select("a > span");
+        if (!keywordsElements.isEmpty()) {
+            keywords = keywordsElements.get(0).text().trim();
+        } else {
+            keywordsElements = loveFootDetailDocument.select("div.postContents > section.content").select("p");
+            keywords = keywordsElements.get(0).text().trim();
+            keywords = keywords.split(":")[1].trim();
+            keywords = keywords.substring(0, keywords.lastIndexOf(" ")).trim();
+        }
+        System.out.println(keywords);
+    }
+}