java循环爬取,python循环爬取页面

发布时间:2022-11-21

本文目录一览:

  1. java爬虫抓取指定数据
  2. Java网络爬虫怎么实现?
  3. java怎么循环读取目录下的文件内容

java爬虫抓取指定数据

根据java网络编程相关的内容,使用jdk提供的相关类可以得到url对应网页的html页面代码。 针对得到的html代码,通过使用正则表达式即可得到我们想要的内容。 比如,我们如果想得到一个网页上所有包括“java”关键字的文本内容,就可以逐行对网页代码进行正则表达式的匹配。最后达到去除html标签和不相关的内容,只得到包括“java”这个关键字的内容的效果。 从网页上爬取图片的流程和爬取内容的流程基本相同,但是爬取图片的步骤会多一步。 需要先用img标签的正则表达式匹配获取到img标签,再用src属性的正则表达式获取这个img标签中的src属性的图片url,然后再通过缓冲输入流对象读取到这个图片url的图片信息,配合文件输出流将读到的图片信息写入到本地即可。

Java网络爬虫怎么实现?

网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。对于垂直搜索来说,聚焦爬虫,即有针对性地爬取特定主题网页的爬虫,更为适合。 以下是一个使用java实现的简单爬虫核心代码:

public void crawl() throws Throwable {
    while (continueCrawling()) {
        CrawlerUrl url = getNextUrl(); //获取待爬取队列中的下一个URL
        if (url != null) {
            printCrawlInfo();
            String content = getContent(url); //获取URL的文本信息
            //聚焦爬虫只爬取与主题内容相关的网页,这里采用正则匹配简单处理
            if (isContentRelevant(content, this.regexpSearchPattern)) {
                saveContent(url, content); //保存网页至本地
                //获取网页内容中的链接,并放入待爬取队列中
                Collection urlStrings = extractUrls(content, url);
                addUrlsToUrlQueue(url, urlStrings);
            } else {
                System.out.println(url + " is not relevant ignoring ...");
            }
            //延时防止被对方屏蔽
            Thread.sleep(this.delayBetweenUrls);
        }
    }
    closeOutputStream();
}
private CrawlerUrl getNextUrl() throws Throwable {
    CrawlerUrl nextUrl = null;
    while ((nextUrl == null) && (!urlQueue.isEmpty())) {
        CrawlerUrl crawlerUrl = this.urlQueue.remove();
        //doWeHavePermissionToVisit:是否有权限访问该URL,友好的爬虫会根据网站提供的"Robot.txt"中配置的规则进行爬取
        //isUrlAlreadyVisited:URL是否访问过,大型的搜索引擎往往采用BloomFilter进行排重,这里简单使用HashMap
        //isDepthAcceptable:是否达到指定的深度上限。爬虫一般采取广度优先的方式。一些网站会构建爬虫陷阱(自动生成一些无效链接使爬虫陷入死循环),采用深度限制加以避免
        if (doWeHavePermissionToVisit(crawlerUrl)
                && (!isUrlAlreadyVisited(crawlerUrl))
                && isDepthAcceptable(crawlerUrl)) {
            nextUrl = crawlerUrl;
            // System.out.println("Next url to be visited is " + nextUrl);
        }
    }
    return nextUrl;
}
private String getContent(CrawlerUrl url) throws Throwable {
    //HttpClient4.1的调用与之前的方式不同
    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(url.getUrlString());
    StringBuffer strBuf = new StringBuffer();
    HttpResponse response = client.execute(httpGet);
    if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(entity.getContent(), "UTF-8"));
            String line = null;
            if (entity.getContentLength() > 0) {
                strBuf = new StringBuffer((int) entity.getContentLength());
                while ((line = reader.readLine()) != null) {
                    strBuf.append(line);
                }
            }
        }
        if (entity != null) {
            entity.consumeContent();
        }
    }
    //将url标记为已访问
    markUrlAsVisited(url);
    return strBuf.toString();
}
public static boolean isContentRelevant(String content,
        Pattern regexpPattern) {
    boolean retValue = false;
    if (content != null) {
        //是否符合正则表达式的条件
        Matcher m = regexpPattern.matcher(content.toLowerCase());
        retValue = m.find();
    }
    return retValue;
}
public List extractUrls(String text, CrawlerUrl crawlerUrl) {
    Map urlMap = new HashMap();
    extractHttpUrls(urlMap, text);
    extractRelativeUrls(urlMap, text, crawlerUrl);
    return new ArrayList(urlMap.keySet());
}
private void extractHttpUrls(Map urlMap, String text) {
    Matcher m = (text);
    while (m.find()) {
        String url = m.group();
        String[] terms = url.split("a href=\"");
        for (String term : terms) {
            // System.out.println("Term = " + term);
            if (term.startsWith("http")) {
                int index = term.indexOf("\"");
                if (index > 0) {
                    term = term.substring(0, index);
                }
                urlMap.put(term, term);
                System.out.println("Hyperlink: " + term);
            }
        }
    }
}
private void extractRelativeUrls(Map urlMap, String text,
        CrawlerUrl crawlerUrl) {
    Matcher m = relativeRegexp.matcher(text);
    URL textURL = crawlerUrl.getURL();
    String host = textURL.getHost();
    while (m.find()) {
        String url = m.group();
        String[] terms = url.split("a href=\"");
        for (String term : terms) {
            if (term.startsWith("/")) {
                int index = term.indexOf("\"");
                if (index > 0) {
                    term = term.substring(0, index);
                }
                String s = "http://" + host + term;
                urlMap.put(s, s);
                System.out.println("Relative url: " + s);
            }
        }
    }
}
public static void main(String[] args) {
    try {
        String url = "";
        Queue urlQueue = new LinkedList();
        String regexp = "java";
        urlQueue.add(new CrawlerUrl(url, 0));
        NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L,
                regexp);
        // boolean allowCrawl = crawler.areWeAllowedToVisit(url);
        // System.out.println("Allowed to crawl: " + url + " " +
        // allowCrawl);
        crawler.crawl();
    } catch (Throwable t) {
        System.out.println(t.toString());
        t.printStackTrace();
    }
}

java怎么循环读取目录下的文件内容

JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)

  1. 不使用递归的方法调用。
public void traverseFolder1(String path) {
    int fileNum = 0, folderNum = 0;
    File file = new File(path);
    if (file.exists()) {
        LinkedList<File> list = new LinkedList<File>();
        File[] files = file.listFiles();
        for (File file2 : files) {
            if (file2.isDirectory()) {
                System.out.println("文件夹:" + file2.getAbsolutePath());
                list.add(file2);
                fileNum++;
            } else {
                System.out.println("文件:" + file2.getAbsolutePath());
                folderNum++;
            }
        }
        File temp_file;
        while (!list.isEmpty()) {
            temp_file = list.removeFirst();
            files = temp_file.listFiles();
            for (File file2 : files) {
                if (file2.isDirectory()) {
                    System.out.println("文件夹:" + file2.getAbsolutePath());
                    list.add(file2);
                    fileNum++;
                } else {
                    System.out.println("文件:" + file2.getAbsolutePath());
                    folderNum++;
                }
            }
        }
    } else {
        System.out.println("文件不存在!");
    }
    System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);
}
  1. 使用递归的方法调用
public static List<File> getFileList(String strPath) {
    File dir = new File(strPath);
    File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
    if (files != null) {
        for (int i = 0; i < files.length; i++) {
            String fileName = files[i].getName();
            if (files[i].isDirectory()) { // 判断是文件还是文件夹
                getFileList(files[i].getAbsolutePath()); // 获取文件绝对路径
            } else if (fileName.endsWith("avi")) { // 判断文件名是否以.avi结尾
                String strFileName = files[i].getAbsolutePath();
                System.out.println("---" + strFileName);
                filelist.add(files[i]);
            } else {
                continue;
            }
        }
    }
    return filelist;
}