有时需要抓取网页的图片。 一般有几种方式:
1、python是最方便的,但是有学习成本。
2、图片批量下载软件,这个可用,但是不支持多页面,抓取规则也不太灵活。
3、java来抓取,讲真不是最高效的,但是职业就是java,不用学习成本。
pom.xml中引入jsoup
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.9.1</version>
</dependency>
代码
/**
* 1、STORE_LOCATION 是图片存储路径,这个根据需要自定义
* 2、抓取图片的需求不同,规则自定义下
* 3、多网页抓取,用个for循环即可。
*/
public class DownloadImageUtils {
private static Logger logger = LoggerFactory.getLogger(DownloadImageUtils.class);
public static String STORE_LOCATION="F:\\pic\\";
public static List<Image> images =new ArrayList<Image>();
public static void main(String[] args) {
String netUrl = "http://www.baidu.com"; //要爬的网页
new DownloadImageUtils().start(netUrl);
}
public void start(String pageUrl){
List<Image> images = parsePage(pageUrl);
downloadImage(images);
}
public List<Image> parsePage(String pageUrl){
List<Image> images =new ArrayList<Image>();
Connection connect = Jsoup.connect(pageUrl);
Document document = null;
try {
document = connect.get();
/* 自定义规则 */
Elements elements = document.getElementsByTag("img"); // 找到所有img标签
for (Element element : elements) {
String alt = element.attr("alt");
String src = element.attr("src");
Image image = new Image();
if(!StringUtils.isEmpty(alt) && src.contains("imgs") && !src.contains("imgs2")){
System.out.println(element.html());
System.out.println(element.attr("src"));
image.setAlt(alt.replace("-FHD",""));
image.setSrc(src);
images.add(image);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return images;
}
//下载该图片!
public void downloadImage(List<Image> images){
for (Image image:images) {
InputStream in = null;
BufferedOutputStream os = null;
try {
URL url = new URL(image.getSrc());
File file = new File(STORE_LOCATION + image.getAlt() + ".jpg");
logger.info("filename:{}",file.getAbsoluteFile());
if(file.exists()){ //
return;
}
URLConnection conn = url.openConnection();
in = conn.getInputStream();
os = new BufferedOutputStream(new FileOutputStream(file.getAbsoluteFile()));
byte[] buff = new byte[1024];
int num = 0;
while((num = in.read(buff))!= -1)
{
os.write(buff, 0, num);
os.flush();
}
} catch (MalformedURLException e) {
logger.error("获取图片url异常");
e.printStackTrace();
} catch (IOException e) {
logger.error("下载图片url连接异常");
e.printStackTrace();
}
finally{
if( in != null){
try {
in.close();
} catch (IOException e) {
logger.error("读入流关闭异常");
}
}
if( os != null){
try {
os.close();
} catch (IOException e) {
logger.error("输出流关闭异常");
}
}
}
}
}
static class Image {
private String alt;
private String src;
public String getAlt() {
return alt;
}
public void setAlt(String alt) {
this.alt = alt;
}
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
}
}
jsoup的一些方法
jsoup 获取元素的方法不只一种,代码:
// 根据标签获取元素
document.getElementsByTag("img");
// 根据css样式获取元素
document.query(".red");
URLConnection 和 jsoup
使用URLConnection,来读取网页内容也是可以的。 但是解析的时候只能硬拼字符串了,还是比较头疼。 jsoup方便很多。
URL myurl = new URL(netUrl);
URLConnection myconn = myurl.openConnection();
InputStream myin = myconn.getInputStream();
mybr = new BufferedReader(new InputStreamReader(myin,"UTF-8"));
String line;
while((line = mybr.readLine())!= null)
{
getImageUrl(line,netUrl);//判断网页中的jpg图片
}