lvzhiqiang 4 maanden geleden
bovenliggende
commit
3b3bcbe468

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

@@ -186,9 +186,9 @@ public class MyJavJobs {
      * 每天23:55 jsoupLoveFoot4CrawingFail
      */
     //@Scheduled(cron = "0 55 23 * * ?", zone = SCHEDULED_ZONE)
-    public void jsoupLoveFoot4CrawingFail() {
+    public void jsoupLoveFoot4CrawingFail() throws Exception {
         log.warn("jsoupLoveFoot4CrawingFail开始==============================");
 
-        crawler4LoveFootService.jsoupLoveFoot4CrawingFail(4, 2, "javbus", null);
+        crawler4LoveFootService.jsoupLoveFoot4CrawingFail(4, "", 2, "javbus", null);
     }
 }

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

@@ -238,7 +238,7 @@ public class CrawlerController {
      */
     @RequestMapping("/jsoupLoveFoot")
     @ResponseBody
-    public R jsoupLoveFoot(Integer status, Integer isDel, Integer ignoreRetryCount, String website, String identificationCode) throws Exception {
+    public R jsoupLoveFoot(Integer status, String source, Integer isDel, Integer ignoreRetryCount, String website, String identificationCode) throws Exception {
         if (null == isDel) {
             isDel = 2;
         }
@@ -247,7 +247,7 @@ public class CrawlerController {
         }
 
         if (4 == status || 1 == status || 2 == status) {
-            crawler4LoveFootService.jsoupLoveFoot4CrawingFail(status, ignoreRetryCount, website, identificationCode);
+            crawler4LoveFootService.jsoupLoveFoot4CrawingFail(status, source, ignoreRetryCount, website, identificationCode);
         } if (41 == status) {
             if (StringUtils.isEmpty(identificationCode)) {
                 throw new ParameterException("identificationCode不能为空!");

+ 1 - 1
src/main/java/top/lvzhiqiang/mapper/CoinMapper.java

@@ -173,7 +173,7 @@ public interface CoinMapper {
             "</if>" +
             " order by " +
             "<foreach collection='sortField' item='sf' index=\"index\" separator=\",\">" +
-            "   ${sf} ${sort}" +
+            "   ${sf} is null,${sf} ${sort}" +
             " </foreach>" +
             "</script>"})
     List<CoinWatchlist> findWatchlistList2ByUserId(Map<String, Object> params);

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

@@ -33,7 +33,7 @@ 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")
+    @Select("SELECT * FROM crawler_lovefoot_info WHERE orgin_feetpassion_url is not null and delete_flag = 1 order by clock_date desc limit 1")
     CrawlerLoveFoot findLatestInfo4feetpassion();
 
     /**
@@ -134,6 +134,9 @@ public interface CrawlerLoveFootMapper {
     @Update("update crawler_lovefoot_info set delete_flag = 2,modify_time = now() where identification_code = #{identificationCode}")
     void delByCode(String identificationCode);
 
+    @Update("delete from crawler_lovefoot_info where id = #{id}")
+    void delById(Long id);
+
     void updateInfoByCode(CrawlerLoveFoot crawlerLoveFoot);
 
     @Select("select 1 from crawler_lovefoot_info where identification_code = #{code} limit 1")

+ 1 - 1
src/main/java/top/lvzhiqiang/service/Crawler4LoveFootService.java

@@ -10,7 +10,7 @@ public interface Crawler4LoveFootService {
 
     void jsoupLoveFoot4avnoashi(Integer status, Integer isDel, Integer ignoreRetryCount) throws Exception;
 
-    void jsoupLoveFoot4CrawingFail(Integer status, Integer ignoreRetryCount, String website, String identificationCode);
+    void jsoupLoveFoot4CrawingFail(Integer status, String source, Integer ignoreRetryCount, String website, String identificationCode) throws Exception;
 
     void jsoupLoveFoot4jpfoot(Integer status, Integer isDel, Integer ignoreRetryCount) throws Exception;
 

+ 68 - 32
src/main/java/top/lvzhiqiang/service/impl/Crawler4LoveFootServiceImpl.java

@@ -179,7 +179,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
     @Async
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public void jsoupLoveFoot4CrawingFail(Integer status, Integer ignoreRetryCount, String website, String identificationCode) {
+    public void jsoupLoveFoot4CrawingFail(Integer status, String source, Integer ignoreRetryCount, String website, String identificationCode) throws Exception {
         log.warn("jjsoupLoveFoot4CrawingFail 开始");
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
@@ -225,7 +225,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
         beforeProxy();
         // 解析原始站点
 
-        int successCount = jsoupLoveFoot4CrawingFailSub(loveFootList, website);
+        int successCount = jsoupLoveFoot4CrawingFailSub(loveFootList, website, source);
         log.warn("jjsoupLoveFoot4CrawingFail 结束:totalCount={},successCount={},time={}", loveFootList.size(), successCount, stopWatch.getTotalTimeSeconds());
     }
 
@@ -287,7 +287,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
     }
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public int jsoupLoveFoot4CrawingFailSub(List<CrawlerLoveFoot> loveFootList, String website) {
+    public int jsoupLoveFoot4CrawingFailSub(List<CrawlerLoveFoot> loveFootList, String website, String source) throws Exception {
         int successCount = 0;
         Document loveFootDetailDocument;
         for (CrawlerLoveFoot crawlerLoveFoot : loveFootList) {
@@ -296,33 +296,56 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
             String message = null;
             int retryCount = 0;
 
-            if (StringUtils.isEmpty(crawlerLoveFoot.getName()) && StringUtils.isNotEmpty(crawlerLoveFoot.getOrginAvnoashiUrl()) && crawlerLoveFoot.getOrginAvnoashiUrl().contains("avnoashi-1.com")) {
-                try {
-                    headerMap.put("referer", crawlerLoveFoot.getOrginAvnoashiUrl());
-                    loveFootDetailDocument = JsoupUtil.requestDocument(crawlerLoveFoot.getOrginAvnoashiUrl(), JsoupUtil.HTTP_GET, proxy, null, header2Map, null);
-                    // 获取关键词
-                    String keywords = loveFootDetailDocument.select("div.postContents").select("td:contains(タイトル)").next("td").text();
-                    if (StringUtils.isNotEmpty(keywords)) {
-                        crawlerLoveFoot.setName(keywords);
-                    } else {
-                        crawlerLoveFoot.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab");
+            if ("feetpassion".equals(source)) {
+                headerMap.put("referer", crawlerLoveFoot.getOrginFeetpassionUrl());
+                loveFootDetailDocument = JsoupUtil.requestDocument(crawlerLoveFoot.getOrginFeetpassionUrl(), JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
+
+                // 获取关键词
+                String keywords = "";
+                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();
+
+                    if (keywords.lastIndexOf(" ") >= 0) {
+                        keywords = keywords.substring(0, keywords.lastIndexOf(" ")).trim();
                     }
-                } catch (Exception e) {
-                    crawlerLoveFoot.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab");
                 }
-            } else if (StringUtils.isEmpty(crawlerLoveFoot.getName()) && StringUtils.isNotEmpty(crawlerLoveFoot.getOrginJpfootUrl()) && crawlerLoveFoot.getOrginJpfootUrl().contains("jp-foot.net")) {
-                try {
-                    headerMap.put("referer", crawlerLoveFoot.getOrginJpfootUrl());
-                    loveFootDetailDocument = JsoupUtil.requestDocument(crawlerLoveFoot.getOrginJpfootUrl(), JsoupUtil.HTTP_GET, proxy, null, header2Map, null);
-                    // 获取关键词
-                    String keywords = loveFootDetailDocument.select("div.avdetail_detailTop").select("p.avdetail_detailTopTitle").text().trim();
-                    if (StringUtils.isNotEmpty(keywords)) {
-                        crawlerLoveFoot.setName(keywords);
-                    } else {
+                if (StringUtils.isNotEmpty(keywords)) {
+                    crawlerLoveFoot.setName(keywords);
+                }
+            } else {
+                if (StringUtils.isEmpty(crawlerLoveFoot.getName()) && StringUtils.isNotEmpty(crawlerLoveFoot.getOrginAvnoashiUrl()) && crawlerLoveFoot.getOrginAvnoashiUrl().contains("avnoashi-1.com")) {
+                    try {
+                        headerMap.put("referer", crawlerLoveFoot.getOrginAvnoashiUrl());
+                        loveFootDetailDocument = JsoupUtil.requestDocument(crawlerLoveFoot.getOrginAvnoashiUrl(), JsoupUtil.HTTP_GET, proxy, null, header2Map, null);
+                        // 获取关键词
+                        String keywords = loveFootDetailDocument.select("div.postContents").select("td:contains(タイトル)").next("td").text();
+                        if (StringUtils.isNotEmpty(keywords)) {
+                            crawlerLoveFoot.setName(keywords);
+                        } else {
+                            crawlerLoveFoot.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab");
+                        }
+                    } catch (Exception e) {
+                        crawlerLoveFoot.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab");
+                    }
+                } else if (StringUtils.isEmpty(crawlerLoveFoot.getName()) && StringUtils.isNotEmpty(crawlerLoveFoot.getOrginJpfootUrl()) && crawlerLoveFoot.getOrginJpfootUrl().contains("jp-foot.net")) {
+                    try {
+                        headerMap.put("referer", crawlerLoveFoot.getOrginJpfootUrl());
+                        loveFootDetailDocument = JsoupUtil.requestDocument(crawlerLoveFoot.getOrginJpfootUrl(), JsoupUtil.HTTP_GET, proxy, null, header2Map, null);
+                        // 获取关键词
+                        String keywords = loveFootDetailDocument.select("div.avdetail_detailTop").select("p.avdetail_detailTopTitle").text().trim();
+                        if (StringUtils.isNotEmpty(keywords)) {
+                            crawlerLoveFoot.setName(keywords);
+                        } else {
+                            crawlerLoveFoot.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+                        }
+                    } catch (Exception e) {
                         crawlerLoveFoot.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
                     }
-                } catch (Exception e) {
-                    crawlerLoveFoot.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
                 }
             }
 
@@ -567,6 +590,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
 
                 Integer exist = crawlerLoveFootMapper.existLoveFootByCode(crawlerLoveFoot.getIdentificationCode());
                 if (exist != null) {
+                    crawlerLoveFootMapper.delById(crawlerLoveFoot.getId());
                     crawlerLoveFootMapper.updateInfoByCode(crawlerLoveFoot);
                 } else {
                     crawlerLoveFootMapper.updateInfoById(crawlerLoveFoot);
@@ -696,7 +720,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
             loveFootDocument = JsoupUtil.requestDocument(avnoashiUrl, JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
 
             pageNum++;
-            if (pageNum > 50) {
+            if (pageNum > 2) {
                 break;
             }
 
@@ -778,7 +802,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
 
             // 继续下一页
             Elements nextSelects = loveFootDocument.select("ul.pager").select("a:contains(Next)");
-            if (nextSelects.size() > 0) {
+            if (!nextSelects.isEmpty()) {
                 avnoashiUrl = nextSelects.get(0).attr("abs:href");
             } else {
                 break;
@@ -825,7 +849,10 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
                     updateDate = clockDate;
 
                     if (updateDate.isBefore(latestDate) || updateDate.isEqual(latestDate)) {
-                        break outer;
+                        Elements itemPinned = sourceSelects.select("span.avArchive_itemPinned");
+                        if (itemPinned.isEmpty()) {
+                            break outer;
+                        }
                     }
 
                     // 获取关键词
@@ -888,7 +915,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
         if (latestLoveFoot == null) {
             latestDate = LocalDate.of(1970, 1, 1);
         } else {
-            latestDate = latestLoveFoot.getUpdateDate();
+            latestDate = latestLoveFoot.getClockDate();
         }
 
         String feetpassionUrl = footConstantMap.get("feetpassion_url");
@@ -935,7 +962,7 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
                         updateDate = clockDate;
                     }
 
-                    if (updateDate.isBefore(latestDate) || updateDate.isEqual(latestDate)) {
+                    if (clockDate.isBefore(latestDate) || clockDate.isEqual(latestDate)) {
                         break outer;
                     }
 
@@ -946,8 +973,13 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
                     } else {
                         keywordsElements = loveFootDetailDocument.select("div.postContents > section.content").select("p");
                         keywords = keywordsElements.get(0).text().trim();
+                        if (keywords.split(":").length <= 1) {
+                            continue;
+                        }
                         keywords = keywords.split(":")[1].trim();
-                        keywords = keywords.substring(0, keywords.lastIndexOf(" ")).trim();
+                        if (keywords.lastIndexOf(" ") >= 0) {
+                            keywords = keywords.substring(0, keywords.lastIndexOf(" ")).trim();
+                        }
                     }
 
                     if (StringUtils.isNotEmpty(keywords)) {
@@ -971,6 +1003,10 @@ public class Crawler4LoveFootServiceImpl implements Crawler4LoveFootService {
                     Thread.sleep(3000);
                     String message = parseKeywordsToCode(crawlerLoveFoot, keywords, "javdb");
                     if (StringUtils.isNotEmpty(message)) {
+                        if (message.contains("javdb search result mismatch")) {
+                            continue;
+                        }
+
                         statusInt = 4;
                         throw new Exception(message);
                     }

+ 33 - 0
src/main/java/top/lvzhiqiang/util/JsoupUtil.java

@@ -7,6 +7,8 @@ import org.jsoup.nodes.Document;
 
 import javax.net.ssl.*;
 import java.net.Proxy;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.security.SecureRandom;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
@@ -149,4 +151,35 @@ public class JsoupUtil {
             e.printStackTrace();
         }
     }
+
+    /**
+     * 对 URL 中指定路径之后的部分进行编码
+     *
+     * @param originalUrl 原始 URL
+     * @param pathPrefix  需要编码的起始路径(如 "ashi-name/")
+     * @return 编码后的 URL
+     */
+    public static String encodeUrlAfterPath(String originalUrl, String pathPrefix) {
+        try {
+            // 1. 找到 pathPrefix 的位置
+            int prefixIndex = originalUrl.indexOf(pathPrefix);
+            if (prefixIndex == -1) {
+                return originalUrl; // 如果没有匹配的路径,直接返回原 URL
+            }
+
+            // 2. 拆分成“前半部分(不编码)”和“后半部分(需要编码)”
+            String beforePath = originalUrl.substring(0, prefixIndex + pathPrefix.length());
+            String afterPath = originalUrl.substring(prefixIndex + pathPrefix.length());
+
+            // 3. 对后半部分进行 URL 编码(UTF-8)
+            String encodedAfterPath = URLEncoder.encode(afterPath, StandardCharsets.UTF_8.toString()).replace("%2F", "/"); // 保留 "/" 不被编码
+
+            // 4. 拼接成完整 URL
+            return beforePath + encodedAfterPath;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return originalUrl; // 如果出错,返回原 URL
+        }
+    }
 }

+ 3 - 0
src/main/resources/mapper/VideoInfoLoveFootMapper.xml

@@ -131,6 +131,9 @@
             <if test="javdbUrl != null and javdbUrl != ''">
                 javdb_url = #{javdbUrl},
             </if>
+            <if test="orginFeetpassionUrl != null and orginFeetpassionUrl != ''">
+                orgin_feetpassion_url = #{orginFeetpassionUrl},
+            </if>
             <if test="type != null">
                 type = #{type},
             </if>

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

@@ -308,7 +308,6 @@
             <select id="apis-quiet-div-watchlist-filterField" style="height: 24px;">
                 <option value="2">已过滤</option>
                 <option value="1">未过滤</option>
-                <option value="3">哈哈哈</option>
                 <option value="">--</option>
             </select>
             <select id="apis-quiet-div-watchlist-cexFilterField" style="height: 24px;">

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

@@ -267,6 +267,13 @@
                 <option value="javdb">javdb</option>
                 <option value="javbus">javbus</option>
             </select>
+            <span>source</span>
+            <select name="source" style="height: 21.43px;">
+                <option value="feetpassion">feetpassion</option>
+                <option value="jpfoot">jpfoot</option>
+                <option value="avnoashi">avnoashi</option>
+                <option value="">--</option>
+            </select>
             <span>isDel</span>
             <input type="text" name="isDel" placeholder="1:是,2:否。默认否"/>
             <span>ignoreRetryCount</span>

+ 217 - 12
src/test/java/top/lvzhiqiang/Test7.java

@@ -1,13 +1,15 @@
 package top.lvzhiqiang;
 
 import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import top.lvzhiqiang.entity.CrawlerLoveFoot;
 import top.lvzhiqiang.util.DateUtils;
 import top.lvzhiqiang.util.JsoupUtil;
+import top.lvzhiqiang.util.StringUtils;
 
 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;
@@ -15,39 +17,242 @@ import java.util.HashMap;
 import java.util.Map;
 
 public class Test7 {
+    private static final Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7897));
+
     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();
+        boolean javdbFlag = true;
+        String source = "1";
+        String keywords = "";
+
+        if ("1".equals(source)) {
+            keywords = execFeetpassion();
+        } else if ("2".equals(source)) {
+            keywords = execJpfoot();
+        } else if ("3".equals(source)) {
+            keywords = execAvnoashi();
+        }
         System.out.println(keywords);
 
+        if (javdbFlag && StringUtils.isNotEmpty(keywords)) {
+            parseJavdb(keywords, proxy);
+        }
+    }
+
+    private static String execAvnoashi() throws Exception {
+        Document loveFootDocument;
+        Document loveFootDetailDocument;
+        String avnoashiUrl = "https://avnoashi-1.com/category/ashi-av/";
+        Map<String, String> headerMap = new HashMap<>();
+        headerMap.put("referer", avnoashiUrl);
+        Map<String, String> header2Map = new HashMap<>();
+        header2Map.put("referer", avnoashiUrl.concat("?sort=newer"));
+        int pageNum = 0;
+        boolean tiaoguoFlag = true;
+        while (true) {
+            loveFootDocument = JsoupUtil.requestDocument(avnoashiUrl, JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
+
+            pageNum++;
+            if (pageNum > 2) {
+                break;
+            }
+
+            Elements sourceSelects = loveFootDocument.select("div.dividerBottom > div.archive").select("div.archive__contents").select("h2");
+            for (Element sourceSelect : sourceSelects) {
+                String sourceUrl = sourceSelect.select("a").attr("abs:href");
+
+                if (tiaoguoFlag) {
+                    tiaoguoFlag = false;
+                    continue;
+                }
+
+                Integer statusInt = 2;
+                Integer typeInt = 1;
+                LocalDate clockDate = null;
+                LocalDate updateDate = null;
+                String keywords = null;
+
+                loveFootDetailDocument = JsoupUtil.requestDocument(sourceUrl, JsoupUtil.HTTP_GET, proxy, null, header2Map, null);
+                /*String clockDateStr = loveFootDetailDocument.select("div.viral").select("li.icon-clock").text();
+                String updateDateStr = loveFootDetailDocument.select("div.viral").select("li.icon-update").text();
+                clockDate = LocalDate.parse(clockDateStr, DateUtils.dateFormatter3);
+                updateDate = LocalDate.parse(updateDateStr, DateUtils.dateFormatter3);
+
+                if (updateDate.isBefore(latestDate) || updateDate.isEqual(latestDate)) {
+                    break outer;
+                }*/
+
+                // 获取关键词
+                keywords = loveFootDetailDocument.select("div.postContents").select("td:contains(タイトル)").next("td").text();
+                if (StringUtils.isNotEmpty(keywords)) {
+                    statusInt = 1;
+                    return keywords;
+                } else {
+                    throw new Exception("keywords is null");
+                }
+
+            }
+
+            // 继续下一页
+            Elements nextSelects = loveFootDocument.select("ul.pager").select("a:contains(Next)");
+            if (nextSelects.size() > 0) {
+                avnoashiUrl = nextSelects.get(0).attr("abs:href");
+            } else {
+                break;
+            }
+        }
+        return null;
+    }
+
+    private static String execJpfoot() throws Exception {
+        String sourceUrl = "https://jp-foot.net/av/h_460mbmh00051/";
+        Map<String, String> headerMap = new HashMap<>();
+        headerMap.put("referer", sourceUrl);
+        Document loveFootDetailDocument = JsoupUtil.requestDocument(sourceUrl, JsoupUtil.HTTP_GET, proxy, null, headerMap, null);
+        String dateStr = loveFootDetailDocument.select("div.avdetail_date").select("span.avdetail_dateText").text();
+
+        // 获取关键词
+        String keywords = loveFootDetailDocument.select("div.avdetail_detailTop").select("p.avdetail_detailTopTitle").text().trim();
+        if (StringUtils.isNotEmpty(keywords)) {
+            return keywords;
+        } else {
+            throw new Exception("keywords is null");
+        }
+    }
 
+    private static String execFeetpassion() throws Exception {
         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/【川上ゆう】暑い夏の今だからこそ、ロングブー/";
+        sourceUrl = "https://feetpassion.net/ashi-name/【女子大生】足舐めしながら生挿入するという完/";
+        sourceUrl = "https://feetpassion.net/ashi-name/有名大学卒-一流企業勤務-夫は会社役員の勝ち組f/";
+        sourceUrl = "https://feetpassion.net/ashi-name/篠田ゆうさんのギリシャ足を間近で見られる動画/";
+        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);
-
+        LocalDate clockDate = null;
+        LocalDate updateDate = null;
+        if (StringUtils.isNotEmpty(clockDateStr)) {
+            clockDate = LocalDate.parse(clockDateStr, DateUtils.dateFormatter3);
+        }
+        if (StringUtils.isNotEmpty(updateDateStr)) {
+            updateDate = LocalDate.parse(updateDateStr, DateUtils.dateFormatter3);
+        }
+        if (clockDate == null) {
+            clockDate = updateDate;
+        }
+        if (updateDate == null) {
+            updateDate = clockDate;
+        }
 
         // 获取关键词
         Elements keywordsElements = loveFootDetailDocument.select("div.postContents").select("a > span");
+        String keywords = "";
         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 (keywords.lastIndexOf(" ") >= 0) {
+                keywords = keywords.substring(0, keywords.lastIndexOf(" ")).trim();
+            }
         }
-        System.out.println(keywords);
+        return keywords;
+    }
+
+    public static void parseJavdb(String name, Proxy proxy) throws Exception {
+        CrawlerLoveFoot crawlerLoveFoot = new CrawlerLoveFoot();
+        crawlerLoveFoot.setName(name);
+        crawlerLoveFoot.setName(crawlerLoveFoot.getName().replace("%", "%").replace("#", "#").replace("?", "?"));
+        crawlerLoveFoot.setName(URLEncoder.encode(crawlerLoveFoot.getName(), StandardCharsets.UTF_8.toString()));
+
+        Map<String, String> javdbConstantMap = new HashMap<>();
+        javdbConstantMap.put("javdb", "https://javdb.com/");
+        String searchUrl = javdbConstantMap.get("javdb").concat("search?q=").concat(crawlerLoveFoot.getName()).concat("&f=all");
+        Map<String, String> header3Map = new HashMap<>();
+        header3Map.put("referer", searchUrl);
+
+        String codeUrl = null;
+        subsearch:
+        {
+            Document javdbSearchDocument = JsoupUtil.requestDocument(searchUrl, JsoupUtil.HTTP_GET, proxy, null, header3Map, null);
+            Elements itembSelects = javdbSearchDocument.select("div.movie-list").select("div.item");
+            String title;
+
+
+            if (itembSelects.size() != 0) {
+                for (Element itembSelect : itembSelects) {
+                    title = itembSelect.select("a.box").get(0).attr("title");
+                    if (title.contains(crawlerLoveFoot.getName())) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        break subsearch;
+                    }
+
+                    String newName = crawlerLoveFoot.getName().replace("●", "さ");
+                    if (title.contains(newName)) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        crawlerLoveFoot.setName(newName);
+                        break subsearch;
+                    }
+
+                    newName = crawlerLoveFoot.getName().replace("●", "這");
+                    if (title.contains(newName)) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        crawlerLoveFoot.setName(newName);
+                        break subsearch;
+                    }
+
+                    newName = crawlerLoveFoot.getName().replace("○", "〇");
+                    if (title.contains(newName)) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        crawlerLoveFoot.setName(newName);
+                        break subsearch;
+                    }
+                }
+            }
+
+            String newName = crawlerLoveFoot.getName().substring(crawlerLoveFoot.getName().length() / 2);
+            searchUrl = javdbConstantMap.get("javdb").concat("search?q=").concat(newName).concat("&f=all");
+            javdbSearchDocument = JsoupUtil.requestDocument(searchUrl, JsoupUtil.HTTP_GET, proxy, null, header3Map, null);
+            itembSelects = javdbSearchDocument.select("div.movie-list").select("div.item");
+            if (itembSelects.size() != 0) {
+                for (Element itembSelect : itembSelects) {
+                    title = itembSelect.select("a.box").get(0).attr("title");
+                    if (title.contains(crawlerLoveFoot.getName())) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        break subsearch;
+                    }
+
+                    newName = crawlerLoveFoot.getName().replace("●", "さ");
+                    if (title.contains(newName)) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        crawlerLoveFoot.setName(newName);
+                        break subsearch;
+                    }
+
+                    newName = crawlerLoveFoot.getName().replace("●", "這");
+                    if (title.contains(newName)) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        crawlerLoveFoot.setName(newName);
+                        break subsearch;
+                    }
+
+                    newName = crawlerLoveFoot.getName().replace("○", "〇");
+                    if (title.contains(newName)) {
+                        codeUrl = itembSelect.select("a.box").get(0).attr("abs:href");
+                        crawlerLoveFoot.setName(newName);
+                        break subsearch;
+                    }
+                }
+            }
+
+        }
+        System.out.println("codeUrl:" + codeUrl);
     }
 }