鱼C论坛

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

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

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

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

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

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

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

  3. import us.codecraft.webmagic.Page;
  4. import us.codecraft.webmagic.Site;
  5. import us.codecraft.webmagic.processor.PageProcessor;
  6. import us.codecraft.webmagic.utils.UrlUtils;

  7. public class ImgProcessor implements PageProcessor {

  8.         private String urlPattern;
  9.          
  10.     private Site site;
  11.    
  12.     private int key = 0;
  13.    
  14.     public ImgProcessor(){}

  15.     public ImgProcessor(String startUrl, String urlPattern) {
  16.         this.site = Site.me().setDomain(UrlUtils.getDomain(startUrl));
  17.         this.urlPattern= urlPattern;
  18.     }

  19.     @Override
  20.     public void process(Page page) {
  21.             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";
  22.         List<String> requests = page.getHtml().links().regex(urlPattern).all();
  23.         String imgHostFileName = page.getHtml().xpath("//title/text()").toString().replaceAll("[|\\pP‘’“”\\s(妹子图)]", "");
  24.         List<String> listProcess = page.getHtml().$("div#picture").regex(imgRegex).all();
  25.         //此处将标题一并抓取,之后提取出来作为文件名
  26.         listProcess.add(0, imgHostFileName);
  27.         page.putField("img", listProcess);
  28.         
  29.         page.addTargetRequests(requests);

  30.     }

  31.     @Override
  32.     public Site getSite() {
  33.         return site;
  34.     }

  35. }
复制代码

2.实现Pipeline
  1. import java.io.*;
  2. import java.nio.file.Files;
  3. import java.nio.file.Path;
  4. import java.nio.file.Paths;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.Map;

  8. import org.apache.http.HttpEntity;
  9. import org.apache.http.HttpResponse;
  10. import org.apache.http.client.methods.HttpGet;
  11. import org.apache.http.impl.client.CloseableHttpClient;
  12. import org.apache.http.impl.client.HttpClients;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;

  15. import us.codecraft.webmagic.ResultItems;
  16. import us.codecraft.webmagic.Task;
  17. import us.codecraft.webmagic.pipeline.Pipeline;
  18. import us.codecraft.webmagic.utils.FilePersistentBase;

  19. public class ImgPipeline extends FilePersistentBase implements Pipeline {

  20.         private Logger logger = LoggerFactory.getLogger(getClass());
  21.     public ImgPipeline() {
  22.         setPath("/data/webmagic/");
  23.     }

  24.     public ImgPipeline(String path) {
  25.         setPath(path);
  26.     }


  27.     @Override
  28.     public void process(ResultItems resultItems, Task task) {
  29.         String fileStorePath = this.path;
  30.         try {

  31.             String imgShortNameNew="(http://mm.howkuai.com/wp-content/uploads/)|(jpg)";
  32.             CloseableHttpClient httpclient = HttpClients.createDefault();
  33.             for (Map.Entry<String, Object> entry : resultItems.getAll().entrySet()) {

  34.                 if (entry.getValue() instanceof List) {

  35.                     List listOne= (List) entry.getValue();
  36.                     List<String> list = new ArrayList<String>();
  37.                     for(int i=0;i<listOne.size();i++){
  38.                         list.add((String)listOne.get(i));
  39.                     }

  40.                     for(int i=0;i<list.size();i++)
  41.                     {

  42.                         StringBuffer sb = new StringBuffer();
  43.                         StringBuffer imgFileNameNewYuan =sb.append(fileStorePath)
  44.                                 .append(list.get(0)) //此处提取文件夹名,即之前采集的标题名
  45.                                 .append("\");
  46.                         //这里先判断文件夹名是否存在,不存在则建立相应文件夹
  47.                         Path target = Paths.get(imgFileNameNewYuan.toString());
  48.                         if(!Files.isReadable(target)){
  49.                             Files.createDirectory(target);
  50.                         }
  51.                         String extName=com.google.common.io
  52.                                        .Files.getFileExtension(list.get(i));//获取文件后缀
  53.                         StringBuffer imgFileNameNew = imgFileNameNewYuan
  54.                                 .append((list.get(i)).replaceAll(imgShortNameNew, "")
  55.                                 .replaceAll("[\\pP‘’“”]", ""))
  56.                                 .append(".")
  57.                                 .append(extName);
  58.                         if(extName == null || extName.equals("")){
  59.                                 continue;
  60.                         }
  61.                         

  62.                         //这里通过httpclient下载之前抓取到的图片网址,并放在对应的文件中
  63.                         HttpGet httpget = new HttpGet(list.get(i));
  64.                         HttpResponse response = httpclient.execute(httpget);
  65.                         HttpEntity entity = response.getEntity();
  66.                         InputStream in = entity.getContent();

  67.                         File file = new File(imgFileNameNew.toString());

  68.                         System.out.println("Download:"+imgFileNameNew);
  69.                        if(!file.exists()){
  70.                                try {
  71.                                FileOutputStream fout = new FileOutputStream(file);
  72.                                int l = -1;
  73.                                byte[] tmp = new byte[1024];
  74.                                while ((l = in.read(tmp)) != -1) {
  75.                                    fout.write(tmp,0,l);
  76.                                }
  77.                                fout.flush();
  78.                                fout.close();
  79.                            } finally {
  80.    
  81.                                in.close();
  82.                            }
  83.                        }

  84.                     }
  85.                 }else {
  86.                     System.out.println(entry.getKey() + ":\t" + entry.getValue());
  87.                 }
  88.             }
  89.             httpclient.close();
  90.         } catch (IOException e) {
  91.             logger.warn("write file error", e);
  92.         }
  93.     }

  94. }
复制代码


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

  2. public class ImgSpiderTest {
  3.         public static void main(String[] args) {
  4.                 String fileStorePath = "E:\\webmagic-data\\test";//这里E盘中必须存在webmagic-data文件夹    文件夹中必须包含test文件夹   否则报错
  5.         String urlPattern = "http://www.meizitu.com/[a-z]/[0-9]{1,4}.html";
  6.         ImgProcessor imgspider=new ImgProcessor("http://www.meizitu.com/",urlPattern);

  7.         //webmagic采集图片代码演示,相关网站仅做代码测试之用,请勿过量采集
  8.         Spider.create(imgspider)
  9.                 .addUrl("http://www.meizitu.com/")
  10.                 .addPipeline(new ImgPipeline(fileStorePath))
  11.                 .thread(10)       //此处线程数可调节
  12.                 .run();
  13.         }
  14. }
复制代码

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-4-17 02:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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