Java爬虫学习(2)之用对象保存文件demo(1)
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)的更多相关文章
- Java爬虫一键爬取结果并保存为Excel
Java爬虫一键爬取结果并保存为Excel 将爬取结果保存为一个Excel表格 官方没有给出导出Excel 的教程 这里我就发一个导出为Excel的教程 导包 因为个人爱好 我喜欢用Gradle所以这 ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java 爬虫学习
Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能 ...
- 半途而废的Java爬虫学习经历
最近在面试,发现Java爬虫对于小数据量数据的爬取的应用还是比较广,抽空周末学习一手,留下学习笔记 Java网络爬虫 简单介绍 爬虫我相信大家都应该知道什么,有什么用,主要的用途就是通过程序自动的去获 ...
- 《java JDK7 学习笔记》之对象封装
1.构造函数实现对象初始化流程的封装.方法封装了操作对象的流程.java中还可以使用private封装对象私有数据成员.封装的目的主要就是隐藏对象细节,将对象当做黑箱子进行操作. 2.在java命名规 ...
- Java反射学习-5 - 反射复制对象
通过反射方式复制对象: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Fi ...
- Java爬虫学习(3)之用对象保存新浪微博博文
package com.mieba; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.c ...
- java web学习总结(十) -------------------HttpServletRequest对象
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- java web学习总结(七) -------------------HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
随机推荐
- UVA10791-Minimum Sum LCM(唯一分解定理基本应用)
原题:https://vjudge.net/problem/UVA-10791 基本思路:1.借助唯一分解定理分解数据.2.求和输出 知识点:1.筛法得素数 2.唯一分解定理模板代码 3.数论分析-唯 ...
- 关于学习java虚拟机的知识整理一:jvm内存区域
之前由于考研,对于虚拟机的认识疏忽了太多,现在重新整理回顾一下. 如上图所示,jvm的内存区域(运行时数据区)共分为5处:方法区(Method Area).虚拟机栈(vm Stack).本地方法栈(N ...
- golang channel 的一次内存错误
起因 原因调查 原因分析 问题解决 总结 起因 今天在做数据库数据读取时, 首先通过多个 goroutine 将从数据库读取的数据写入 channel, 同时通过另一个 goroutine 从 cha ...
- Ajax基础原理与应用
Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var handleResponse = func ...
- Go-结构体,结构体指针和方法
https://cloud.tencent.com/developer/article/1482382 4.1.结构体 结构体:讲一个或多个变量组合到一起形成新的类型,这个类型就是结构体,结构体是值类 ...
- Leetcode Week3 Merge Two(k) Sorted Lists
Question Q1.Merge two sorted linked lists and return it as a new list. The new list should be made b ...
- maven配置文件pom.xml小记
1.pom.xml主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素 2.基础设置: <modelV ...
- 搜索字母a或A
Amy觉得英语课实在是无聊至极,他不喜欢听老师讲课. 但是闲着也是闲着,不如做点什么吧?于是他开始数英语书里的字母a和A共出现了多少次. 费了九牛二虎之力终于数完了. 作为一名软件工程专业大学生,他觉 ...
- 记录 Docker 的学习过程 (数据挂载)
docker 存储篇 容器中的存储是分层的, 在容器中,如果我们要创建一个文件,会在文件的最上层(可写层)创建 容器中内置的文件,默认来讲是只读的,只有自己创建的文件才是可写状态 比如说 /etc/p ...
- Postgresql Json Sql
a detailed website about json sql query; official website: here, chinese version: here Json query: - ...