package com.mieba.spider;

 import java.util.ArrayList;
import java.util.List;
import java.util.Vector; import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html; public class WanhoPageProcessor implements PageProcessor
{ private Site site = Site
.me()
.setTimeOut(10000)
.setRetryTimes(3)
.setSleepTime(1000)
.setCharset("UTF-8"); @Override
public Site getSite()
{
// TODO Auto-generated method stub
return site;
} @Override
public void process(Page page)
{
// TODO Auto-generated method stub
//获取当前页的所有喜报
List<String> list = page.getHtml().xpath("//div[@class='main_l']/ul/li").all();
//要保存喜报的集合
Vector<ArticleVo> voLst = new Vector<>();
//遍历喜报
String title;
String content;
String img;
for (String item : list)
{
Html tmp = Html.create(item);
//标题
title = tmp.xpath("//div[@class='content']/h4/a/text()").toString();
//内容
content = tmp.xpath("//div[@class='content']/p/text()").toString();
//图片路径
img = tmp.xpath("//a/img/@src").toString();
//加入集合
ArticleVo vo = new ArticleVo(title, content, img);
voLst.add(vo);
}
//保存数据至page中,后续进行持久化
page.putField("e_list", voLst);
//加载其它页
page.addTargetRequests( getOtherUrls());
} //其它页
public List<String> getOtherUrls()
{
List<String> urlLsts = new ArrayList<>();
for(int i=2;i<7;i++){
urlLsts.add("http://www.wanho.net/a/jyxb/list_15_"+i+".html");
}
return urlLsts;
} }
 package com.mieba.spider;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Vector; import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline; public class WanhoPipeline implements Pipeline
{ @Override
public void process(ResultItems resultItems, Task arg1)
{
// TODO Auto-generated method stub
// 获取抓取过程中保存的数据
Vector<ArticleVo> voLst = resultItems.get("e_list");
// 持久到文件中
PrintWriter pw = null;
try
{
pw = new PrintWriter(new FileWriter("wanho.txt", true));
for (ArticleVo vo : voLst)
{
pw.println(vo);
pw.flush();
saveImg(vo.getImg());
}
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} finally
{
pw.close();
}
} private void saveImg(String img)
{
// TODO Auto-generated method stub
String imgUrl = "http://www.wanho.net" + img;
InputStream is = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try
{
URL url = new URL(imgUrl);
URLConnection uc = url.openConnection();
is = uc.getInputStream();
bis = new BufferedInputStream(is);
File photoFile = new File("photo");
if (!photoFile.exists())
{
photoFile.mkdirs();
}
String imgName = img.substring(img.lastIndexOf("/") + 1);
File saveFile = new File(photoFile, imgName);
bos = new BufferedOutputStream(new FileOutputStream(saveFile));
byte[] bs = new byte[1024];
int len;
while ((len = bis.read(bs)) != -1)
{
bos.write(bs, 0, len);
} } catch (MalformedURLException e)
{
// TODO: handle exception
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
bos.close();
} catch (IOException e)
{
e.printStackTrace();
}
try
{
bis.close();
} catch (IOException e)
{
e.printStackTrace();
}
try
{
is.close();
} catch (IOException e)
{
e.printStackTrace();
} }
} }
 package com.mieba.spider;

 public class ArticleVo
{
private String title;
private String content;
private String img;
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
public String getContent()
{
return content;
}
public void setContent(String content)
{
this.content = content;
}
public String getImg()
{
return img;
}
public void setImg(String img)
{
this.img = img;
}
public ArticleVo(String title, String content, String img)
{
super();
this.title = title;
this.content = content;
this.img = img;
}
@Override
public String toString()
{
return "ArticleVo [title=" + title + ", content=" + content + ", img=" + img + "]";
} }
package com.mieba.spider;

import us.codecraft.webmagic.Spider;

public class Demo
{
public static void main(String[] args)
{ // 爬取开始
Spider
// 爬取过程
.create(new WanhoPageProcessor())
// 爬取结果保存
.addPipeline(new WanhoPipeline())
// 爬取的第一个页面
.addUrl("http://www.wanho.net/a/jyxb/")
// 启用的线程数
.thread(5).run();
}
}

爬取到的照片

爬取到的简报

大家如果要使用代码,配置webmagic的依赖包即可使用。

Java爬虫学习(2)之用对象保存文件demo(1)的更多相关文章

  1. Java爬虫一键爬取结果并保存为Excel

    Java爬虫一键爬取结果并保存为Excel 将爬取结果保存为一个Excel表格 官方没有给出导出Excel 的教程 这里我就发一个导出为Excel的教程 导包 因为个人爱好 我喜欢用Gradle所以这 ...

  2. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  3. Java 爬虫学习

    Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能 ...

  4. 半途而废的Java爬虫学习经历

    最近在面试,发现Java爬虫对于小数据量数据的爬取的应用还是比较广,抽空周末学习一手,留下学习笔记 Java网络爬虫 简单介绍 爬虫我相信大家都应该知道什么,有什么用,主要的用途就是通过程序自动的去获 ...

  5. 《java JDK7 学习笔记》之对象封装

    1.构造函数实现对象初始化流程的封装.方法封装了操作对象的流程.java中还可以使用private封装对象私有数据成员.封装的目的主要就是隐藏对象细节,将对象当做黑箱子进行操作. 2.在java命名规 ...

  6. Java反射学习-5 - 反射复制对象

    通过反射方式复制对象: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Fi ...

  7. Java爬虫学习(3)之用对象保存新浪微博博文

    package com.mieba; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.c ...

  8. java web学习总结(十) -------------------HttpServletRequest对象

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  9. java web学习总结(七) -------------------HttpServletResponse对象(一)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

随机推荐

  1. 数据库异常:SQL Error: 0, SQLState: S0022

    问题描述 在本地搭建 mysql + MyEclipse + tomcat,系统跑起来之后,调用自己写的查询接口,报错“SQL Error: 0, SQLState: S0022” 具体报错:  -  ...

  2. windows10 node-gyp安装

    本机环境:win10,已安装vs2017,Node版本 10.13.0 1.安装node-gyp npm install -g node-gyp 2.安装完毕之后node-gyp list看一下 no ...

  3. JavaScript 中的构造函数

    典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念.所谓“类”就是对象的模板,对象就是“类”的实例.但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于 ...

  4. PP: A dual-stage attention-based recurrent neural network for time series prediction

    Problem: time series prediction The nonlinear autoregressive exogenous model: The Nonlinear autoregr ...

  5. linux - 查看 python 版本

    命令 python -V 结果

  6. js中的window.location.search的用法与作用。

    用该属性获取页面 URL 地址: window.location 对象所包含的属性 属性 描述 hash 从井号 (#) 开始的 URL(锚) host 主机名和当前 URL 的端口号 hostnam ...

  7. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  8. 【网页浏览】关键字搜索PIXIV插图

    可以在线搜索Pixiv(P站)的插图 传送链接

  9. js json -> <-object

    1.利用原生JSON对象,将对象转为字符串 var jsObj = {}; jsObj.testArray = [1,2,3,4,5]; jsObj.name = 'CSS3'; jsObj.date ...

  10. (转)java垃圾回收一

    转自:http://jianfulove.iteye.com/blog/1833768 一切都进入了自动化了,但是对于各种内存溢出,内存泄漏问题的出现,我们还是很有必要学习GC的.地球人都知道,Jav ...