签名图片一键生成 使用Webmagic爬虫实现

使用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")
                    .toString().replace("null",""));

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

            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();
    }
}
上一篇:学习JDK8源码之--ArrayDeque


下一篇:Switch regulator 和 Linear regulator