鱼C论坛

 找回密码
 立即注册
查看: 6162|回复: 4

[技术交流] WebMagic爬取网站图片

[复制链接]
发表于 2017-3-12 21:38:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
WebMagic网站http://webmagic.io/
参考https://www.oschina.net/code/snippet_1397325_35514

1.实现PageProcessor
import java.util.ArrayList;
import java.util.List;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.utils.UrlUtils;

public class ImgProcessor implements PageProcessor {

        private String urlPattern;
         
    private Site site;
    
    private int key = 0;
    
    public ImgProcessor(){}
 
    public ImgProcessor(String startUrl, String urlPattern) {
        this.site = Site.me().setDomain(UrlUtils.getDomain(startUrl));
        this.urlPattern= urlPattern;
    }
 
    @Override
    public void process(Page page) {
            String imgRegex = "http://mm.howkuai.com/wp-content/uploads/20[0-9]{2}[a-z]/[0-9]{1,4}/[0-9]{1,4}/[0-9]{1,4}.jpg";
        List<String> requests = page.getHtml().links().regex(urlPattern).all();
        String imgHostFileName = page.getHtml().xpath("//title/text()").toString().replaceAll("[|\\pP‘’“”\\s(妹子图)]", "");
        List<String> listProcess = page.getHtml().$("div#picture").regex(imgRegex).all();
        //此处将标题一并抓取,之后提取出来作为文件名
        listProcess.add(0, imgHostFileName);
        page.putField("img", listProcess);
        
        page.addTargetRequests(requests);
 
    }
 
    @Override
    public Site getSite() {
        return site;
    }

}
2.实现Pipeline
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;
import us.codecraft.webmagic.utils.FilePersistentBase;

public class ImgPipeline extends FilePersistentBase implements Pipeline {

        private Logger logger = LoggerFactory.getLogger(getClass());
    public ImgPipeline() {
        setPath("/data/webmagic/");
    }
 
    public ImgPipeline(String path) {
        setPath(path);
    }
 
 
    @Override
    public void process(ResultItems resultItems, Task task) {
        String fileStorePath = this.path;
        try {
 
            String imgShortNameNew="(http://mm.howkuai.com/wp-content/uploads/)|(jpg)";
            CloseableHttpClient httpclient = HttpClients.createDefault();
            for (Map.Entry<String, Object> entry : resultItems.getAll().entrySet()) {
 
                if (entry.getValue() instanceof List) {
 
                    List listOne= (List) entry.getValue();
                    List<String> list = new ArrayList<String>();
                    for(int i=0;i<listOne.size();i++){
                        list.add((String)listOne.get(i));
                    }
 
                    for(int i=0;i<list.size();i++)
                    {
 
                        StringBuffer sb = new StringBuffer();
                        StringBuffer imgFileNameNewYuan =sb.append(fileStorePath)
                                .append(list.get(0)) //此处提取文件夹名,即之前采集的标题名
                                .append("\");
                        //这里先判断文件夹名是否存在,不存在则建立相应文件夹
                        Path target = Paths.get(imgFileNameNewYuan.toString());
                        if(!Files.isReadable(target)){
                            Files.createDirectory(target);
                        }
                        String extName=com.google.common.io
                                       .Files.getFileExtension(list.get(i));//获取文件后缀
                        StringBuffer imgFileNameNew = imgFileNameNewYuan
                                .append((list.get(i)).replaceAll(imgShortNameNew, "")
                                .replaceAll("[\\pP‘’“”]", ""))
                                .append(".")
                                .append(extName);
                        if(extName == null || extName.equals("")){
                                continue;
                        }
                        
 
                        //这里通过httpclient下载之前抓取到的图片网址,并放在对应的文件中
                        HttpGet httpget = new HttpGet(list.get(i));
                        HttpResponse response = httpclient.execute(httpget);
                        HttpEntity entity = response.getEntity();
                        InputStream in = entity.getContent();
 
                        File file = new File(imgFileNameNew.toString());
 
                        System.out.println("Download:"+imgFileNameNew);
                       if(!file.exists()){
                               try {
                               FileOutputStream fout = new FileOutputStream(file);
                               int l = -1;
                               byte[] tmp = new byte[1024];
                               while ((l = in.read(tmp)) != -1) {
                                   fout.write(tmp,0,l);
                               }
                               fout.flush();
                               fout.close();
                           } finally {
    
                               in.close();
                           }
                       }
 
                    }
                }else {
                    System.out.println(entry.getKey() + ":\t" + entry.getValue());
                }
            }
            httpclient.close();
        } catch (IOException e) {
            logger.warn("write file error", e);
        }
    }

}

3.爬图
import us.codecraft.webmagic.Spider;

public class ImgSpiderTest {
        public static void main(String[] args) {
                String fileStorePath = "E:\\webmagic-data\\test";//这里E盘中必须存在webmagic-data文件夹    文件夹中必须包含test文件夹   否则报错
        String urlPattern = "http://www.meizitu.com/[a-z]/[0-9]{1,4}.html";
        ImgProcessor imgspider=new ImgProcessor("http://www.meizitu.com/",urlPattern);
 
        //webmagic采集图片代码演示,相关网站仅做代码测试之用,请勿过量采集
        Spider.create(imgspider)
                .addUrl("http://www.meizitu.com/")
                .addPipeline(new ImgPipeline(fileStorePath))
                .thread(10)       //此处线程数可调节
                .run();
        }
}
ImgProcessor中的"http://mm.howkuai.com/wp-content/uploads/20[0-9]{2}[a-z]/[0-9]{1,4}/[0-9]{1,4}/[0-9]{1,4}.jpg";可能会变,如果爬不到图片,可查看一下

评分

参与人数 1荣誉 +2 鱼币 +6 贡献 +3 收起 理由
零度非安全 + 2 + 6 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-12 22:28:25 | 显示全部楼层
楼主可以!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-13 13:01:31 | 显示全部楼层

如果不是前几天看见你的正则表达式,我也不会想到WebMagic
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-4 16:32:07 | 显示全部楼层
楼主,为啥我只能爬到标题,没有图片内容呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-25 09:27:48 | 显示全部楼层
哦吼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表