欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用Java和webmagic爬取图片并下载到本地(动态网页)

程序员文章站 2022-05-17 10:36:16
...

上篇记录了一下用java代码爬取图片并下载到本地的代码,但是那只是对于一张图片。如果要很多图片的话,

就需要把代码改一下。如果是静态页面,可以不用webmagic(不过用webmagic更加方便);动态的话,需要

用到selenium。在这里就直接使用webmagic了,因为webmagic将爬虫需要用到的方法封装好了,而且也可以

模拟启动浏览器来爬取动态页面。

这次爬取的图片链接是:http://pic.sogou.com/pics?query=%CD%BC%C6%AC&p=40230500&st=255&mode=255

进入网页并右键查看网页源代码可以看到每一张图片的信息都在<script>标签中写着,源代码中并没有很明确的

图片地址,说明是动态网页。那么先使用开发者工具查看网页源码。

打开开发者工具方式:

1、进入网页,然后敲键盘上的F12键即可;

2、右击鼠标,单击检查即可(如下图)。

用Java和webmagic爬取图片并下载到本地(动态网页)

打开后的页面为:

用Java和webmagic爬取图片并下载到本地(动态网页)

现在我们看看图片链接所在标签:

用Java和webmagic爬取图片并下载到本地(动态网页)

其中每一个<li>标签就是一个图片,里面包含了图片的链接。

用Java和webmagic爬取图片并下载到本地(动态网页)

知道图片链接具体在哪个标签下了,现在就写代码提取图片标签,并将图片下载到本地文件(完整代码,经测试)。

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.downloader.selenium.SeleniumDownloader;
import us.codecraft.webmagic.processor.PageProcessor;

public class Test2 implements PageProcessor{

	public static InputStream inStream = null;
	Site site = Site.me().setRetryTimes(3).setSleepTime(3000);
	
	public Site getSite() {
		// TODO Auto-generated method stub
		return site;
	}

	public void process(Page page) {
		// TODO Auto-generated method stub
		//将匹配到的链接都存储到links集合中
		List<String> links = page.getHtml().regex("http://img\\d+\\.sogoucdn\\.com/app/a/\\S+\\.jpg").all();
		//遍历links集合中的链接,然后下载
		for(int i = 0; i < links.size(); i++){
			String link = links.get(i);
			try {
				URL url = new URL(link);
				URLConnection con = url.openConnection();
				inStream = con.getInputStream();
				ByteArrayOutputStream outStream = new ByteArrayOutputStream();
				byte[] buf = new byte[1024];
				int len = 0;
				while((len = inStream.read(buf)) != -1){
					outStream.write(buf,0,len);
				}
				inStream.close();
				outStream.close();
				File file = new File("f://test//"+i+".jpg");	//图片下载地址
				FileOutputStream op = new FileOutputStream(file);
				op.write(outStream.toByteArray());
				op.close();
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args){
		//系统配置文件
		System.setProperty("selenuim_config", "D:\\jse-workspace\\WebMagicTest\\NovelSpider\\TuPian\\First\\config.ini");	
		Spider.create(new Test2())
		.addUrl("http://pic.sogou.com/pics?query=%CD%BC%C6%AC&p=40230500&st=255&mode=255")	//要爬取的总链接
		.setDownloader(new SeleniumDownloader("D:\\ChromeDriver\\chromedriver_win32(2)\\chromedriver.exe"))	//模拟启动浏览器
		.thread(2)	//线程
		.run();
	}
}
代码执行后的结果
用Java和webmagic爬取图片并下载到本地(动态网页)

可以发现,下载下来的图片并不是网页上所有的图片。这是因为有些链接与我们所要匹配的链接不同,将那些不同的链接在通过正则

或者xpath匹配拿到就可以了。