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

时间:2022-11-12 10:30:59

上篇记录了一下用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匹配拿到就可以了。