用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、右击鼠标,单击检查即可(如下图)。
打开后的页面为:
现在我们看看图片链接所在标签:
其中每一个<li>标签就是一个图片,里面包含了图片的链接。
知道图片链接具体在哪个标签下了,现在就写代码提取图片标签,并将图片下载到本地文件(完整代码,经测试)。
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();
}
}
代码执行后的结果可以发现,下载下来的图片并不是网页上所有的图片。这是因为有些链接与我们所要匹配的链接不同,将那些不同的链接在通过正则
或者xpath匹配拿到就可以了。