博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java爬虫WebMagic框架爬取图片
阅读量:4104 次
发布时间:2019-05-25

本文共 4964 字,大约阅读时间需要 16 分钟。

一.该爬虫用了WebMagic爬虫框架实现

1.WebMagic开发文档:

2.在使用之前,您需要了解正则表达式和XPath,大神请忽略

二.下面是实现代码和分析

2.1添加maven依赖

    不知道maven的童鞋请参考

junit
junit
4.11
test
us.codecraft
webmagic-core
0.7.3

2.2.1.实现步骤

首先进入校花网首页,fn+f12进入开发者模式,找到class为title的a标签,下图

接着XPath得到所有的连接

List
detailURL = page.getHtml().xpath("//a[@class=\"title\"]").links().all();

2.2.2接下来,我们可以根据这个连接进入详细页,可以找到点赞数作为筛选的标准

2.2.3.接下来,我们可以得到图片的连接

如下为此步的代码

String diggNum = page.getHtml().xpath("//div[@class='digg_num']/text()").regex("\\d+").toString();            //点赞数要超过300            if (Integer.parseInt(diggNum) > 200) {                //得到照片url                String photoURL = page.getHtml().xpath("//div[@class='picbox']/a").css("img", "src").toString();                System.out.println(photoURL);                //得到名字                String nickname = page.getHtml().xpath("//div[@class='title']/h2/text()").toString();                System.out.println(nickname);

2.3.爬取部分的详细代码如下:

package com.hly.webmagic.Spider;import com.hly.webmagic.controller.DownloadImage;import us.codecraft.webmagic.Page;import us.codecraft.webmagic.Site;import us.codecraft.webmagic.Spider;import us.codecraft.webmagic.processor.PageProcessor;import java.util.ArrayList;import java.util.List;/** * @author :hly * @date :2018/6/2 */public class SchoolFlower implements PageProcessor {    //页面URL的正则表达式    //.是匹配所有的字符,//.表示只匹配一个,//.?同理    private static String REGEX_PAGE_URL = "http://www\\.521609\\.com/daxuexiaohua/list\\w+.html";    //爬取的页数    public static int PAGE_SIZE = 358;    //下载张数    public static int INDEX_PHOTO =0;    //配置    @Override    public Site getSite() {        return Site.me();    }    @Override    public void process(Page page) {        List
targetURL = new ArrayList
(); for (int i = 310; i < PAGE_SIZE; i++) //添加到目标url中 targetURL.add("http://www.521609.com/daxuexiaohua/list" + i + ".html"); //添加url到请求中 page.addTargetRequests(targetURL); //是图片列表页面 if (page.getUrl().regex(REGEX_PAGE_URL).match()) { //获得所有详情页的连接 //page.getHtml().xpath("//a[@class=\"title\"]").links().all(); List
detailURL = page.getHtml().xpath("//a[@class=\"title\"]").links().all(); System.out.println("size:"+detailURL.size()); for (String str:detailURL) //输出所有连接 System.out.println(str); page.addTargetRequests(detailURL); //如果是详情页 } else { //要按条件筛选 String diggNum = page.getHtml().xpath("//div[@class='digg_num']/text()").regex("\\d+").toString(); //点赞数要超过300 if (Integer.parseInt(diggNum) > 200) { //得到照片url String photoURL = page.getHtml().xpath("//div[@class='picbox']/a").css("img", "src").toString(); System.out.println(photoURL); //得到名字 String nickname = page.getHtml().xpath("//div[@class='title']/h2/text()").toString(); System.out.println(nickname); try { // 根据图片URL 下载图片方法 /** * String 图片URL地址 * String 图片名称 * String 保存路径 */ DownloadImage.download( "http://www.521609.com"+photoURL, nickname + ".jpg", "F:\\schoolFlowerImage\\"); System.out.println("第"+(INDEX_PHOTO++)+"张"); } catch (Exception e) { e.printStackTrace(); } } } } public static void main(String[]arv){ //起始URL,开启的线程数为10个 Spider.create(new SchoolFlower()).addUrl("http://www.521609.com/daxuexiaohua/list310.html").thread(10).run(); }}

2.4接下来是下载的代码

你可以保存到电脑的文件夹

package com.hly.webmagic.download;import java.io.*;import java.net.URL;import java.net.URLConnection;/** * @author :hly * @date :2018/6/1 */public class SpiderDownload {    public static void download(String urlStr,String filename,String savePath) throws IOException {        URL url = new URL(urlStr);        //打开url连接        URLConnection connection = url.openConnection();        //请求超时时间        connection.setConnectTimeout(5000);        //输入流        InputStream in = connection.getInputStream();        //缓冲数据        byte [] bytes = new byte[1024];        //数据长度        int len;        //文件        File file = new File(savePath);        if(!file.exists())            file.mkdirs();        OutputStream out  = new FileOutputStream(file.getPath()+"\\"+filename);        //先读到bytes中        while ((len=in.read(bytes))!=-1){            //再从bytes中写入文件            out.write(bytes,0,len);        }        //关闭IO        out.close();        in.close();    }}

以上是所有的实现代码

你可能感兴趣的文章
7 年工作经验,面试官竟然还让我写算法题???
查看>>
被 Zoom 逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
查看>>
再见,Eclipse...
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
漫话:为什么你下载小电影的时候进度总是卡在 99% 就不动了?
查看>>
我去!原来大神都是这样玩转「多线程与高并发」的...
查看>>
当你无聊时,可以玩玩 GitHub 上这个开源项目...
查看>>
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>
安利 10 个让你爽到爆的 IDEA 必备插件!
查看>>
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
Java各种集合类的合并(数组、List、Set、Map)
查看>>
JS中各种数组遍历方式的性能对比
查看>>
Mysql复制表以及复制数据库
查看>>
进程管理(一)
查看>>
linux 内核—进程的地址空间(1)
查看>>
存储器管理(二)
查看>>
开局一张图,学一学项目管理神器Maven!
查看>>