java 파충류 사이트 이미지 구현 실례 코드
9270 단어 java파충류인터넷 사이트에 접속하다
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class LinkQueue {
// url
private static Set<String> visitedUrl = Collections.synchronizedSet(new HashSet<String>());
// url
private static List<String> unVisitedUrl = Collections.synchronizedList(new ArrayList<String>());
// URL
public static String unVisitedUrlDeQueue() {
if (unVisitedUrl.size() > 0) {
String url = unVisitedUrl.remove(0);
visitedUrl.add(url);
return url;
}
return null;
}
// url ,
public static void addUnvisitedUrl(String url) {
if (url != null && !url.trim().equals("") && !visitedUrl.contains(url)
&& !unVisitedUrl.contains(url))
unVisitedUrl.add(url);
}
// URL
public static boolean unVisitedUrlsEmpty() {
return unVisitedUrl.isEmpty();
}
}
두 번째 단계, 모든 URL 아래의 링크를 수집하여 필터링하여 새로운 링크를 생성합니다
import java.util.HashSet;
import java.util.Set;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
* http url, url
* @author Administrator
*
*/
public class ParserHttpUrl {
// ,filter
public static Set<String> extracLinks(String url, LinkFilter filter) {
Set<String> links = new HashSet<String>();
try {
Parser parser = new Parser(url);
// <frame > filter, frame src
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().startsWith("frame src=")) {
return true;
} else {
return false;
}
}
};
// OrFilter <a> , <frame>
OrFilter linkFilter = new OrFilter(new NodeClassFilter(
LinkTag.class), frameFilter);
//
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)// <a>
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();// url
if (filter.accept(linkUrl))
links.add(linkUrl);
} else// <frame>
{
// frame src <frame src="test.html"/>
String frame = tag.getText();
int start = frame.indexOf("src=");
frame = frame.substring(start);
int end = frame.indexOf(" ");
if (end == -1)
end = frame.indexOf(">");
String frameUrl = frame.substring(5, end - 1);
if (filter.accept(frameUrl))
links.add(frameUrl);
}
}
} catch (ParserException e) {
e.printStackTrace();
}
return links;
}
}
3단계, 사진 다운로드 기능 구현
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/***
* java
*
* @author swinglife
*
*/
public class DownLoadPic {
//
private static final String ECODING = "UTF-8";
// img
private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
// src
private static final String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+)";
public static void downloadPic(String url) {
// html
String HTML = null;
try {
HTML = DownLoadPic.getHTML(url);
} catch (Exception e) {
e.printStackTrace();
}
if (null != HTML && !"".equals(HTML)) {
//
List<String> imgUrl = DownLoadPic.getImageUrl(HTML);
// src
List<String> imgSrc = DownLoadPic.getImageSrc(imgUrl);
//
DownLoadPic.download(imgSrc);
}
}
/***
* HTML
*
* @param url
* @return
* @throws Exception
*/
private static String getHTML(String url) throws Exception {
URL uri = new URL(url);
URLConnection connection = uri.openConnection();
InputStream in = connection.getInputStream();
byte[] buf = new byte[1024];
int length = 0;
StringBuffer sb = new StringBuffer();
while ((length = in.read(buf, 0, buf.length)) > 0) {
sb.append(new String(buf, ECODING));
}
in.close();
return sb.toString();
}
/***
* ImageUrl
*
* @param HTML
* @return
*/
private static List<String> getImageUrl(String HTML) {
Matcher matcher = Pattern.compile(IMGURL_REG).matcher(HTML);
List<String> listImgUrl = new ArrayList<String>();
while (matcher.find()) {
listImgUrl.add(matcher.group());
}
return listImgUrl;
}
/***
* ImageSrc
*
* @param listImageUrl
* @return
*/
private static List<String> getImageSrc(List<String> listImageUrl) {
List<String> listImgSrc = new ArrayList<String>();
for (String image : listImageUrl) {
Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(image);
while (matcher.find()) {
listImgSrc.add(matcher.group().substring(0,
matcher.group().length() - 1));
}
}
return listImgSrc;
}
/***
*
*
* @param listImgSrc
*/
private static void download(List<String> listImgSrc) {
for (String url : listImgSrc) {
try {
String imageName = url.substring(url.lastIndexOf("/") + 1,
url.length());
URL uri = new URL(url);
InputStream in = uri.openStream();
FileOutputStream fo = new FileOutputStream(new File(imageName));
byte[] buf = new byte[1024];
int length = 0;
while ((length = in.read(buf, 0, buf.length)) != -1) {
fo.write(buf, 0, length);
}
in.close();
fo.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
실제 Filter 인터페이스, 필터 인터페이스 정의:
public interface Filter {
public boolean accept(String url);
}
네 번째 단계, 필터 규칙의 실현:
public class Crawler {
/**
*
*
* @return
* @param seeds
*/
public void crawling(String url) { //
Filter filter = new Filter() {
public boolean accept(String url) {
// , ,
if(url.indexOf("douban.com/group/topic") != -1 || url.indexOf("douban.com/group/haixiuzu/discussion?start") != -1 )
return true;
else
return false;
}
};
// URL
LinkQueue.addUnvisitedUrl(url);
// ,
while (!LinkQueue.unVisitedUrlsEmpty()) {
// URL
String visitUrl = (String) LinkQueue.unVisitedUrlDeQueue();
if (visitUrl == null)
continue;
DownLoadPic.downloadPic(visitUrl);
// URL
Set<String> links = ParserHttpUrl.extracLinks(visitUrl, filter);
// URL
for (String link : links) {
LinkQueue.addUnvisitedUrl(link);
}
}
}
// main
public static void main(String[] args) {
Crawler crawler = new Crawler();
crawler.crawling("http://www.douban.com/group/haixiuzu/discussion?start=0");
}
}
총결산상기 서술한 것은 여러분께 소개해 드린 자바 실현 파충류 사이트 사진의 실례 코드입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.