webmagic 爬取json中的图片
程序员文章站
2022-05-02 20:48:09
...
主要流程
1、获取json地址 解析json数据找到图片对应的img地址
2、根据img地址 拼接成一个url 去读取图片
3、将根据url将图片下载到本地
json格式(简单写一个)
[
{
“id”:“1”,
“content”:岩体沿节理裂隙向临空面倾斜形成崩塌遗迹。",
“img”:“不整合面.png”}
]
主要代码
package xx.poi.task;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;
import us.codecraft.webmagic.selector.JsonPathSelector;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
//由于是spring来创建和销毁这个类 所以添加注解
@Component
//实现页面解析的功能
public class PoiProcessor implements PageProcessor {
private String url ="http://xx.dzmap.cn/tushuoxiangxi/data/one/20/xxdzgy.json"; //json地址
private String firstUrl="http://xx.dzmap.cn/tushuoxiangxi/images/20qi/zhan/";//图片地址
@Override
public void process(Page page) {
String html= page.getHtml().toString();
List<String> url_list = new ArrayList<>();
//通过jsonpath得到json数据中的id内容,之后再拼凑待爬取链接
List<String> endUrls = new JsonPathSelector("$.*.img").selectList(page.getRawText());
if (CollectionUtils.isNotEmpty(endUrls)) {
for (String endUrl : endUrls) {
//将链接拼接起来 都存储到links集合中
url_list.add(firstUrl + endUrl);
}
}
//遍历links集合中的链接,然后下载
for(int i = 0; i < url_list.size(); i++){
String link = url_list.get(i);
try {
URL url = new URL(link);
//通过URL对象构造URLConnection对象
URLConnection con = url.openConnection();
InputStream 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("d://test//"+i+".png"); //图片下载地址
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();
}
}
}
private Site site=Site.me()
.setCharset("utf8")
.setTimeOut(10000)
.setRetrySleepTime(30000)
.setRetryTimes(3);
@Override
public Site getSite() {
return site;
}
// @Autowired
//initialDelay 当任务启动时候 等待多久执行方法
// private SpringDataPipeline springDataPipeline;
//fixedDelay 每隔多久执行一次
@Scheduled(initialDelay = 1000,fixedDelay = 10000)
public void process(){
Spider.create(new PoiProcessor())
.addUrl(url)
//setDuplicateRemover 去重 有10000条数据
.setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(10000)))//放入内存中
.thread(10)
.run();
}
}
上一篇: 怎么高情商拒绝前任复合
下一篇: 分手一年了还有机会复合吗?