簽名圖片一鍵批量生成 使用Java的Webmagic爬蟲實現

来源:https://www.cnblogs.com/xiaoshuai123/archive/2020/01/11/12180399.html
-Advertisement-
Play Games

使用Webmagic爬蟲實現的簽名檔一鍵生成 實現原理 這裡爬取的網址是http://jiqie.zhenbi.com/c/ 然後獲取到裡面提交數據,提交地址,在對這些數據進行Post提交 解析html標簽獲得圖片地址並輸出到控制台 不會使用Webmagic爬蟲框架的 自行百度配置 本文主要是學習P ...


使用Webmagic爬蟲實現的簽名檔一鍵生成

實現原理

這裡爬取的網址是http://jiqie.zhenbi.com/c/
然後獲取到裡面提交數據,提交地址,在對這些數據進行Post提交
解析html標簽獲得圖片地址並輸出到控制台

不會使用Webmagic爬蟲框架的 自行百度配置
本文主要是學習Post提交

測試結果:

下麵請看代碼實現


import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.model.HttpRequestBody;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.utils.HttpConstant;

import java.util.HashMap;

import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PostDemo implements PageProcessor {
    Site site = Site.me().setRetryTimes(3).setTimeOut(1500);
    @Override
    public void process(Page page) {
        Random r = new Random();

        //生成的文字
        String text = "快樂的小蜘蛛";

        //第一次請求:獲取所有類型
        if ("http://jiqie.zhenbi.com/c/".equals(page.getUrl().toString())){



            //解析a標簽
            //<a href="34.htm">彩色文字版本墨人動態簽名檔線上製作</a>

            List<String> list = page.getHtml().$("a","href").all();
            List<String> listtext = page.getHtml().$("a","text").all();

            // 創建 Pattern 對象 匹配數字
            Pattern r = Pattern.compile("[0-9]+");

            // 現在創建 matcher 對象
            Matcher m;
            Request req;
            for (int i =0;i<list.size();i++){
                m = r.matcher(list.get(i));
                if (!m.find())continue;
                req = new Request();
                req.setUrl("http://jiqie.zhenbi.com/c/"+ m.group()+".htm");
                req.putExtra("mindex",m.group());
                req.putExtra("name",listtext.get(i));
                page.addTargetRequest(req);
            }
            return;

        //第二次請求:獲取數據參數以及Post提交地址
        }else if(page.getUrl().toString().endsWith(".htm")){
            //是否有id :show
            if (!page.getHtml().$("#show").match())return;

            Request request =page.getRequest();
            request.setMethod(HttpConstant.Method.POST);

            //zhenbi('re2.php','0');
            String index = page.getHtml().$("#up","onclick").regex("\\w+\\.").toString().replace(".","");
            System.out.println(index);

            request.setUrl("http://jiqie.zhenbi.com/c/"+index+".php");

            Map<String,Object> map = new HashMap<>();

            /*   提交數據

            id  我是ZHT0301 我為自己代言
            idi jiqie
            id1 20
            id2 16
            id3 26
            id4
            id5 #624475
            id6
             */

            //獲取參數

            map.put("id",text);
            map.put("idi","jiqie");

            map.put("id1",page.getHtml()
                    .$("#id1").xpath("//select/option[@selected='selected']")
                    .$("option","value"));

            map.put("id2",page.getHtml()
                    .$("#id2").xpath("//select/option[@selected='selected']")
                    .$("option","value"));

            map.put("id3",page.getHtml().$("#id3","value"));
            map.put("id4",page.getHtml().$("#id4","value"));
            map.put("id5",page.getHtml().$("#id5","value"));
            map.put("id6",page.getHtml().$("#id6","value"));


            System.out.println(map);
            request.setRequestBody(HttpRequestBody.form(map,"utf-8"));
            page.addTargetRequest(request);
            try {
                //隨緣冷靜,衝動是魔鬼
                Thread.sleep(r.nextInt(500)+100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        //第三次請求:獲取圖片的地址
        }else{
            page.putField("id",page.getRequest().getExtra("mindex"));
            page.putField("name",page.getRequest().getExtra("name"));
            page.putField("img_src",page.getHtml().$("img","src"));
        }
    }

    @Override
    public Site getSite() {
        return site;
    }


    public static void main(String[] args) {

        Spider.create(new PostDemo())
                .addUrl("http://jiqie.zhenbi.com/c/")
                .thread(1)
                .run();
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在指定範圍內生成一個隨機數作為目標值,用戶對目標值進行猜測。 import java.util.Random; // 隨機數 import java.util.Scanner; // 獲取用戶輸入 public class Example { public static void main(Stri ...
  • 生成指定範圍內的隨機數 Math.random() 生成隨機數,隨機數在0到1之間,類型是 double。 public class randCase { public static void main(String[] args) { double rand = 0; for (int i = 0 ...
  • 簡介 AspectJ是一個基於Java語言的AOP框架,Spring2.0以後新增了對AspectJ切點表達式支持。因為Spring1.0的時候Aspectj還未出現; AspectJ1.5中新增了對註解的支持,允許直接在Bean類中定義切麵。新版本的Spring框架建 議我們都使用AspectJ方 ...
  • 在寫 Python 項目的時候,我們可能經常會遇到導入模塊失敗的錯誤:ImportError: No module named 'xxx'或者ModuleNotFoundError: No module named 'xxx'。 導入失敗問題,通常分為兩種:一種是導入自己寫的模塊(即以 .py 為後 ...
  • 從源碼角度瞭解SpringMVC的執行流程 SpringMVC的執行流程網上有很多帖子都有講解,流程圖和文字描述都很詳細,但是你如果沒有通過具體源碼自己走一遍流程,其實只是死記硬背。所以想開個帖子從源碼角度再梳理一遍SpringMVC的執行流程,加深印象。 [TOC] SpringMVC介紹 Spr ...
  • 添加或取消 Ctrl + Shift + 對應的數字(1 9) 作用 相當於標簽,Ctrl + 對應的數字鍵,可以快速定位到做了標簽的代碼行 ...
  • 有queryset:A和B 要合併它們,根據網上的答案,貌似是用itertools庫的chain對象比較好,地址 c=chain(x,y) 但是當c用於分頁的時候,就有問題,會報chain沒有len屬性,當試圖給c賦len屬性的時候不成功。 但是,可以這樣 A和B是查詢queryset a=[] a ...
  • 貪婪演算法 貪心演算法(Greedy Algorithm) 簡介貪心演算法,又名貪婪法,是尋找最優解問題的常用方法,這種方法模式一般將求解過程分成若幹個步驟,但每個步驟都應用貪心原則,選取當前狀態下最好/最優的選擇(局部最有利的選擇),並以此希望最後堆疊出的結果也是最好/最優的解。{看著這個名字,貪心,貪 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...