前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Fiddler + JSoup 爬取现代汉语语料库数据

Fiddler + JSoup 爬取现代汉语语料库数据

原创
作者头像
Star先生
修改于 2017-08-03 09:26:02
修改于 2017-08-03 09:26:02
1.9K00
代码可运行
举报
文章被收录于专栏:Star先生的专栏Star先生的专栏
运行总次数:0
代码可运行

爬虫中常用JSoup处理Html,对于类似百度这样的搜索引擎,则需要配合fiddler使用,步骤如下

Fidder获取链接信息

在IE浏览器中打开http://www.cncorpus.org/CnCindex.aspx,使用fiddler抓取,如下图

双击fidder中的捕获链接,获取整个连接信息

然后在http://www.cncorpus.org/CnCindex.aspx 后加入捕获的链接信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://www.cncorpus.org/CnCindex.aspx?__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUKMTk4MDQ0MTE5OA9kFgICAw9kFgQCKQ8PFgIeB1Zpc2libGVnZBYIAgMPDxYCHgRUZXh0BTrnrKwx5YiwNTAw5p2h77yM5YWx5p%2Bl6K%2Bi5YiwNTI3MjjmnaHnrKblkIjopoHmsYLnmoTkvovlj6UhZGQCBQ8PFgIfAGhkZAIHDw8WAh8AaGRkAg0PDxYCHwBnZGQCLw8PFgIfAGdkFgoCAQ8PFgIfAGhkZAIDDw8WAh8AaGRkAgkPDxYCHwEFATFkZAILDw8WAh8BBQMxMDZkZAINDw8WAh8BBQU1MjcyOGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYKBQtSQmluZGV4d29yZAUKUkJsaWtlbW9kZQUKUkJsaWtlbW9kZQUOUkJmdWxsdGV4dG1vZGUFDlJCZnVsbHRleHRtb2RlBQxSYWRpb0J1dHRvbjMFDFJhZGlvQnV0dG9uMwUMUmFkaW9CdXR0b240BQ5DaGVja0JveENodWNodQUQQ2hlY2tCb3hLV0lDbW9kZeDFB%2FOXKuors7kNSBQvXV5bn9EPHGNvJgT94fUsjIhu&__VIEWSTATEGENERATOR=3A0BE18D&__EVENTVALIDATION=%2FwEWFQKNm9KcBQLYiuv%2FCwLzuO7zDQL3uO7zDQLV%2BYmkCgLZ%2BYmkCgKM54rGBgK8u9naBwKJlM7DBwKAg8rcDgKWzvT1CAKWzuCuBwK2q5qHDgK%2FxfDTAQLxqL%2BhAgLCpJSTBQKKn9X3AwKLlOLCBgLc%2F9LTBQL3t9jyBALZu%2BPjB6rMBlDgd9II8LdS4y%2BzUaXaUcHAjVptZHdcvx89wEPp&TextBoxCCkeywords=%E6%88%91&DropDownListPsize=500&Button1=%E6%A3%80++%E7%B4%A2&1=RBindexword&2=RadioButton4&txtTopage=

同理也可以获取下一页链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://www.cncorpus.org/CnCindex.aspx?__EVENTTARGET=LBnextpage&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUKMTk4MDQ0MTE5OA9kFgICAw9kFgQCKQ8PFgIeB1Zpc2libGVnZBYIAgMPDxYCHgRUZXh0BTrnrKwx5YiwNTAw5p2h77yM5YWx5p%2Bl6K%2Bi5YiwNTI3MjjmnaHnrKblkIjopoHmsYLnmoTkvovlj6UhZGQCBQ8PFgIfAGhkZAIHDw8WAh8AaGRkAg0PDxYCHwBnZGQCLw8PFgIfAGdkFgoCAQ8PFgIfAGhkZAIDDw8WAh8AaGRkAgkPDxYCHwEFATFkZAILDw8WAh8BBQMxMDZkZAINDw8WAh8BBQU1MjcyOGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYKBQtSQmluZGV4d29yZAUKUkJsaWtlbW9kZQUKUkJsaWtlbW9kZQUOUkJmdWxsdGV4dG1vZGUFDlJCZnVsbHRleHRtb2RlBQxSYWRpb0J1dHRvbjMFDFJhZGlvQnV0dG9uMwUMUmFkaW9CdXR0b240BQ5DaGVja0JveENodWNodQUQQ2hlY2tCb3hLV0lDbW9kZeDFB%2FOXKuors7kNSBQvXV5bn9EPHGNvJgT94fUsjIhu&__VIEWSTATEGENERATOR=3A0BE18D&__EVENTVALIDATION=%2FwEWFQKNm9KcBQLYiuv%2FCwLzuO7zDQL3uO7zDQLV%2BYmkCgLZ%2BYmkCgKM54rGBgK8u9naBwKJlM7DBwKAg8rcDgKWzvT1CAKWzuCuBwK2q5qHDgK%2FxfDTAQLxqL%2BhAgLCpJSTBQKKn9X3AwKLlOLCBgLc%2F9LTBQL3t9jyBALZu%2BPjB6rMBlDgd9II8LdS4y%2BzUaXaUcHAjVptZHdcvx89wEPp
&TextBoxCCkeywords=%E6%88%91&DropDownListPsize=500&1=RBindexword&2=RadioButton4&txtTopage=

这里需要注意的是,下一页链接需要填入查询页cookie

代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

    public static String getCookie(final String Url) {
        StringBuffer sb = new StringBuffer();
        try {
            CookieManager manager = new CookieManager();
            manager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
            CookieHandler.setDefault(manager);
            URL url = new URL(Url);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.getHeaderFields();
            CookieStore store = manager.getCookieStore();
            List<HttpCookie> lCookies = store.getCookies();
            for (HttpCookie cookie : lCookies) {
                sb.append(URLDecoder.decode(cookie.getValue(), "UTF8"));
            }

        } catch (Exception e) {

            e.printStackTrace();

        }
        return sb.toString();
    }

使用的时候,调用getCookie(findUrl)即可,其中findUrl是查找页url

JSoup处理

思路是把链接保存到Html中,然后通过JSoup解析 这里需要的包是jsoup-1.8.1.jar

保存需要下边两个工具类

FileUtil.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.star.crawlerweb;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileUtil {
    /* 文件操作类 */
    public static final String SUFFIX = ".dat"; 

    @SuppressWarnings({ "unchecked" })

    public static void extractedOther(String sourcePath, String resultPath)
            throws FileNotFoundException, IOException {
        StringBuilder builder = readSource(sourcePath);
        String pattenAttr = "\\/+[a-zA-Z]+";
        String pattenall = "([\u4e00-\u9fa5]+)\\/+[a-zA-Z]+";
        Map<String, Integer> mapattr = countWord(builder, pattenAttr);
        Map<String, Integer> mapall = countWord(builder, pattenall);

        FileUtil.writefile("=========分割线===========" + "\n", resultPath);
        Iterator<?> iterattr = mapattr.entrySet().iterator();
        while (iterattr.hasNext()) {
            Map.Entry<String, Integer> entry = (Map.Entry<String, Integer>) iterattr
                    .next();
            Object key = entry.getKey();
            Object val = entry.getValue();
            if (Integer.parseInt(val.toString()) >= 5) {
                FileUtil.writefile(key.toString().replace("/", "") + " " + val
                        + "\n", resultPath);
            }
        }

        FileUtil.writefile("=========分割线===========" + "\n", resultPath);
        Iterator<?> iterall = mapall.entrySet().iterator();
        while (iterall.hasNext()) {
            Map.Entry<String, Integer> entry = (Map.Entry<String, Integer>) iterall
                    .next();
            Object key = entry.getKey();
            Object val = entry.getValue();
            if (Integer.parseInt(val.toString()) >= 5) {
                FileUtil.writefile(key.toString().replaceAll("/", " ") + " "
                        + val + "\n", resultPath);
            }
        }
    }


    public static final int BUFSIZE = 1024 * 8;

    public static void mergeFiles(String outFile, String[] files) {

        FileChannel outChannel = null;
        System.out.println("Merge " + Arrays.toString(files) + " into "
                + outFile);
        try {
            outChannel = new FileOutputStream(outFile).getChannel();
            for (String f : files) {
                @SuppressWarnings("resource")
                FileChannel fc = new FileInputStream(f).getChannel();
                ByteBuffer bb = ByteBuffer.allocate(BUFSIZE);
                while (fc.read(bb) != -1) {
                    bb.flip();
                    outChannel.write(bb);
                    bb.clear();
                }
                fc.close();
            }
            System.out.println("合并成功 ");
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            try {
                if (outChannel != null) {
                    outChannel.close();
                }
            } catch (IOException ignore) {
            }
        }
    }

    public static void resultCut() throws Exception {


        String path = "resultAll.txt";
        File file = new File(path);


        if (file.exists()&&file.isFile()) {
            file.delete();
        } 
        bigFileCut("resultcrawler.txt");
        System.out.println("去重结果保存在resultAll.txt中" + "\n");
        System.out.println("词数统计成功,结果保存在" + "resultcount.txt" + "中");
        FileUtil.deleteDirectory("htmlfind");
        FileUtil.deleteDirectory("htmlnext");

        FileUtil.deleteHtml("./");
        @SuppressWarnings("resource")
        Scanner scan = new Scanner(System.in);
        System.out.println("是否统计词性出现次数?是:1 否:0\n");
        int flag = scan.nextInt();
        if (flag == 1) {
            FileUtil.extractedOther("resultAll.txt", "resultcount.txt");

            System.out.println("词数统计成功,结果保存在" + "resultcount.txt" + "中");
        }
    }


    private static void bigFileCut(String path) throws Exception, IOException,
            UnsupportedEncodingException {
        Set<String> set = new HashSet<String>();
        long maxsize = 1024 * 1024 * 50;
        long size = 1024 * 1024 * 10; 
        File file = new File(path);
        long fileLength = file.length();
        if (size <= 0) {
            size = fileLength / 2;
        }

        int num = (fileLength % size != 0) ? (int) (fileLength / size + 1)
                : (int) (fileLength / size);
        if (file.length() >= maxsize) {
            FileUtil.divide(path, size);
            for (int m = 0; m < num; m++) {
                String pathdived = "./htmlfind/text" + m + ".dat";
                System.out.println("开始提取第" + (m + 1) + "个文件……");
                set.addAll(FileUtil.RemoveDuplicate(pathdived));
            }
        } else {
            set.addAll(FileUtil.RemoveDuplicate(path));
        }
        for (String i : set) {
            System.out.println("正在写入" + URLDecoder.decode(i, "utf-8") + "\n");
            FileUtil.writefile(URLDecoder.decode(i, "utf-8") + "\n",
                    "resultAll.txt");
        }
    }

    public static void deleteHtml(String path) {
        File file = new File(path);
        File temp = null;
        File[] filelist = file.listFiles();
        for (int i = 0; i < filelist.length; i++) {
            temp = filelist[i];
            if (temp.getName().endsWith("html")) {
                temp.delete();}
            }
        }
    }


    @SuppressWarnings({ "unchecked" })
    public static void extractedWord(String first, String sourcePath,
            String resultPath) throws IOException {
        StringBuilder builder = readSource(sourcePath);
        String pattenWord = "([\u4e00-\u9fa5]+)";
        Map<String, Integer> mapword = countWord(builder, pattenWord);

        Iterator<?> iterword = mapword.entrySet().iterator();
        while (iterword.hasNext()) {
            Map.Entry<String, Integer> entry = (Map.Entry<String, Integer>) iterword
                    .next();
            Object key = entry.getKey();
            Object val = entry.getValue();
            if (Integer.parseInt(val.toString()) >= 5) {
                if (isKey(first, pattenWord, key) == false) {
                    FileUtil.writefile(first + "@" + key + ": " + val + "\n",
                            resultPath);
                }
            }

        }
    }

    public static StringBuilder readSource(String sourcePath)
            throws FileNotFoundException, IOException {
        File file = new File(sourcePath);
        FileReader fileReader = new FileReader(file);
        BufferedReader reader = new BufferedReader(fileReader);
        StringBuilder builder = new StringBuilder();
        String line = "";
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
        return builder;
    }


    public static boolean isKey(String first, String pattenWord, Object key) {
        Pattern pattern = Pattern.compile(pattenWord);
        Matcher matcher = pattern.matcher(key.toString());
        Matcher matchers = pattern.matcher(first.toString());
        while (matcher.find() && matchers.find()) {
            String keymatch = matcher.group();
            String firstmathc = matchers.group();
            if (keymatch.equals(firstmathc)) {
                return true;
            }
        }
        return false;
    }

    public static Map<String, Integer> countWord(StringBuilder builder,
            String patten) {
        Pattern pattern = Pattern.compile(patten);
        String content = builder.toString();
        Matcher matcher = pattern.matcher(content);
        Map<String, Integer> map = new HashMap<String, Integer>();
        String word = "";
        Integer times = 0;
        while (matcher.find()) {
            word = matcher.group();
            if (map.containsKey(word)) {
                times = map.get(word);
                map.put(word, times + 1);
            } else {
                map.put(word, 1);
            }
        }
        return map;

    }


    public static Set<String> RemoveDuplicate(String path) throws IOException,
            UnsupportedEncodingException {
        Set<String> set = new HashSet<String>();
        List<String> resultall = FileUtil.readfile(path);
        List<String> listTemp = new ArrayList<String>();
        Iterator<String> it = resultall.iterator();
        while (it.hasNext()) {
            String i = it.next();
            if (listTemp.contains(i)) {
                it.remove();
            } else {
                listTemp.add(i);
            }
        }

        for (String i : listTemp) {
            set.add(i);

        }
        return set;

    }


    public static void divide(String name, long size) throws Exception {
        File file = new File(name);
        if (!file.exists() || (!file.isFile())) {
            throw new Exception("指定文件不存在!");
        }

        long fileLength = file.length();
        if (size <= 0) {
            size = fileLength / 2;
        }

        int num = (fileLength % size != 0) ? (int) (fileLength / size + 1)
                : (int) (fileLength / size);

        String[] fileNames = new String[num];

        FileInputStream in = new FileInputStream(file);

        long end = 0;
        int begin = 0;

        for (int i = 0; i < num; i++) {

            File outFile = new File("./htmlfind", "text" + i + SUFFIX);

            FileOutputStream out = new FileOutputStream(outFile);

            end += size;
            end = (end > fileLength) ? fileLength : end;

            for (; begin < end; begin++) {
                out.write(in.read());
            }
            out.close();
            fileNames[i] = outFile.getAbsolutePath();
            System.out.println("第" + (i + 1) + "个子文件生成……");

        }
        in.close();
    }


    public static List<String> readfile(String path) throws IOException {
        List<String> list = new ArrayList<String>();
        File file = new File(path);
        FileInputStream s = new FileInputStream(file);

        @SuppressWarnings("resource")
        BufferedReader reader = new BufferedReader(new InputStreamReader(s,
                "utf-8"), 5 * 1024 * 1024);
        String tempString = null;


        while ((tempString = reader.readLine()) != null) {



            String word = java.net.URLEncoder.encode(tempString, "utf-8");
            list.add(word);

        }
        return list;
    }



    public static void writefile(String m, String path) {

        try {
            File file = new File(path);
            if (!file.exists()) {
                file.createNewFile();
            }
            FileWriter fileWritter = new FileWriter(file.getName(), true);
            BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
            bufferWritter.write(m);
            bufferWritter.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static boolean createDir(String destDirName) {
        File dir = new File(destDirName);
        if (dir.exists()) {


            return false;
        }
        if (!destDirName.endsWith(File.separator)) {
            destDirName = destDirName + File.separator;
        }
        if (dir.mkdirs()) {

            return true;
        } else {

            return false;
        }
    }


    public static boolean deleteDirectory(String sPath) {

        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);

        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;

        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {

            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            } 
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag)
            return false;

        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }

    public static boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = new File(sPath);

        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    public static void clearFile() {
        deleteDirectory("htmlfind");
        deleteDirectory("htmlnext");
        createDir("htmlfind");
        createDir("htmlnext");
    }
}

HtmUtil.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.star.crawlerweb;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/*抓取html保存到本地 */

public class HtmlUtil {

    public static void urlToHtm(String word, String findurl, String path) {

        URL url = null;
        try {
            url = new URL(findurl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        String charset = "utf-8";
        int sec_cont = 1000;
        try {
            URLConnection url_con = url.openConnection();
            url_con.setDoOutput(true);
            url_con.setReadTimeout(10 * sec_cont);
            url_con.setRequestProperty("User-Agent",
                    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
            InputStream htm_in = url_con.getInputStream();

            String htm_str = InputStream2String(htm_in, charset);
            saveHtml(path, htm_str);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void saveHtml(String filepath, String str) {

        try {
            OutputStreamWriter outs = new OutputStreamWriter(
                    new FileOutputStream(filepath, true), "utf-8");
            outs.write(str);
            outs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String InputStream2String(InputStream in_st, String charset)
            throws IOException {
        BufferedReader buff = new BufferedReader(new InputStreamReader(in_st,
                charset));
        StringBuffer res = new StringBuffer();
        String line = "";
        while ((line = buff.readLine()) != null) {
            res.append(line);
        }
        return res.toString();
    }

}

主程序如下,由于网址限制短时间访问次数,写一个定时器,每隔20s爬取一次,代码如下

WordSpider.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.star.crawlerweb;

import java.io.File;
import java.io.IOException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/*Jsoup使用方法:http://www.cnblogs.com/xiaoMzjm/p/3899366.html */

public class WordSpider {
    public static String savehtml = ".html";
    public static int count = 1;

    public static void main(String[] args) throws IOException {

        FileUtil.clearFile();

        TimerTask task = new TimerTask() {
            int number = 0;
            List<String> result = FileUtil.readfile("word.txt");

            @Override
            public void run() {

                try {
                    synchronized (this) {
                        if (number <= result.size() - 1) {
                            getNativeWord(result.get(number));
                            number++;
                        } else {
                            cancel();
                            FileUtil.resultCut();
                        }
                    }

                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        };
        Timer timer = new Timer();
        long delay = 0;

        long intevalPeriod = 1 * 20000 * 300;
        System.out.println("每隔" + intevalPeriod / (1000 * 60) + "分钟爬取下一个词"
                + "\n");
        timer.scheduleAtFixedRate(task, delay, intevalPeriod);

    }


    public static String getCookie(final String Url) {
        StringBuffer sb = new StringBuffer();
        try {
            CookieManager manager = new CookieManager();
            manager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
            CookieHandler.setDefault(manager);
            URL url = new URL(Url);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.getHeaderFields();
            CookieStore store = manager.getCookieStore();
            List<HttpCookie> lCookies = store.getCookies();
            for (HttpCookie cookie : lCookies) {
                sb.append(URLDecoder.decode(cookie.getValue(), "UTF8"));
            }

        } catch (Exception e) {

            e.printStackTrace();

        }
        return sb.toString();
    }



    private static synchronized void getNativeWord(final String word)
            throws IOException {

        final String encondeword = java.net.URLDecoder.decode(word, "utf-8");
        final String resultPath = "resultcrawler.html";
        final String logpath = encondeword + ".html";

        final String filefind = "./htmlfind/" + encondeword + savehtml;

        final String findUrl = "http://www.cncorpus.org/CnCindex.aspx?"
                + "__VIEWSTATE=%2FwEPDwUKMTk4MDQ0MTE5OA9kFgICAw9kFgQCKQ8PFgIeB1Zpc2libGVoZBYIAgMPDxYCHgRUZXh0BTrnrKwx5YiwMTAw5p2h77yM5YWx5p%2Bl6K%2Bi5YiwNTI3MjjmnaHnrKblkIjopoHmsYLnmoTkvovlj6UhZGQCBQ8PFgIfAGhkZAIHDw8WAh8AaGRkAg0PDxYCHwBnZGQCLw8PFgIfAGhkFgoCAQ8PFgIfAGhkZAIDDw8WAh8AaGRkAgkPDxYCHwEFATFkZAILDw8WAh8BBQM1MjhkZAINDw8WAh8BBQU1MjcyOGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYKBQtSQmluZGV4d29yZAUKUkJsaWtlbW9kZQUKUkJsaWtlbW9kZQUOUkJmdWxsdGV4dG1vZGUFDlJCZnVsbHRleHRtb2RlBQxSYWRpb0J1dHRvbjMFDFJhZGlvQnV0dG9uMwUMUmFkaW9CdXR0b240BQ5DaGVja0JveENodWNodQUQQ2hlY2tCb3hLV0lDbW9kZf9jlvtMb1%2FyXrpEQQLtIFyLoPLGND86N0hSq0CED%2Brk"
                + "&__VIEWSTATEGENERATOR=3A0BE18D"
                + "&__EVENTVALIDATION=%2FwEWDgK3wKfCCgLYiuv%2FCwLzuO7zDQL3uO7zDQLV%2BYmkCgLZ%2BYmkCgKM54rGBgK8u9naBwKJlM7DBwKAg8rcDgKWzvT1CAKWzuCuBwK2q5qHDgK%2FxfDTAXWmVvcYknI3MwjcfE48IiMijAq3WW044PF7g9pBhtfu"
                + "&TextBoxCCkeywords="
                + word
                + "&DropDownListPsize=500&Button1=%E6%A3%80++%E7%B4%A2&1=RBindexword&2=RadioButton4";
        System.out
                .println("正在爬取" + "词:[" + encondeword + "]" + "首页数据⋯⋯" + "\n");

        HtmlUtil.urlToHtm(encondeword, findUrl, filefind);
        File in = new File(filefind);
        Document doc = Jsoup.parse(in, "UTF-8", "");
        Elements spanPoint = doc
                .select("span[style=display:inline-block;font-family:宋体;font-size:11pt;width:1080px;]");


        final Elements pageNumber = doc.select("span[id=LabelPageCount]");
        final int number;

        if (pageNumber.text().toString().equals("")) {

            number = 0;
            System.out.println("对不起,关键词:[" + encondeword + "]"
                    + "未被索引,请使用模糊检索方式查询" + "\n");
        } else {
            number = Integer.parseInt(pageNumber.text().toString());
            for (Element e : spanPoint) {
                FileUtil.writefile(e.text() + "\n", resultPath);
                FileUtil.writefile(e.text() + "\n", logpath);
            }
            System.out.println("词:[" + encondeword + "]" + "首页数据爬取成功" + "\n");
        }

        final String nextUrl = "http://www.cncorpus.org/CnCindex.aspx?__EVENTTARGET=LBnextpage&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUKMTk4MDQ0MTE5OA9kFgICAw9kFgQCKQ8PFgIeB1Zpc2libGVnZBYIAgMPDxYCHgRUZXh0BTrnrKwx5YiwNTAw5p2h77yM5YWx5p%2Bl6K%2Bi5YiwNTI3MjjmnaHnrKblkIjopoHmsYLnmoTkvovlj6UhZGQCBQ8PFgIfAGhkZAIHDw8WAh8AaGRkAg0PDxYCHwBnZGQCLw8PFgIfAGdkFgoCAQ8PFgIfAGhkZAIDDw8WAh8AaGRkAgkPDxYCHwEFATFkZAILDw8WAh8BBQMxMDZkZAINDw8WAh8BBQU1MjcyOGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYKBQtSQmluZGV4d29yZAUKUkJsaWtlbW9kZQUKUkJsaWtlbW9kZQUOUkJmdWxsdGV4dG1vZGUFDlJCZnVsbHRleHRtb2RlBQxSYWRpb0J1dHRvbjMFDFJhZGlvQnV0dG9uMwUMUmFkaW9CdXR0b240BQ5DaGVja0JveENodWNodQUQQ2hlY2tCb3hLV0lDbW9kZeDFB%2FOXKuors7kNSBQvXV5bn9EPHGNvJgT94fUsjIhu&__VIEWSTATEGENERATOR=3A0BE18D&__EVENTVALIDATION=%2FwEWFQKNm9KcBQLYiuv%2FCwLzuO7zDQL3uO7zDQLV%2BYmkCgLZ%2BYmkCgKM54rGBgK8u9naBwKJlM7DBwKAg8rcDgKWzvT1CAKWzuCuBwK2q5qHDgK%2FxfDTAQLxqL%2BhAgLCpJSTBQKKn9X3AwKLlOLCBgLc%2F9LTBQL3t9jyBALZu%2BPjB6rMBlDgd9II8LdS4y%2BzUaXaUcHAjVptZHdcvx89wEPp"
                + "&TextBoxCCkeywords="
                + word
                + "&DropDownListPsize=500&1=RBindexword&2=RadioButton4&txtTopage=";

        getCookie(findUrl);
        TimerTask task = new TimerTask() {
            @Override
            public void run() {

                try {

                    ++count;
                    if (count <= number) {

                        System.out.println("正在爬取" + "词:[" + encondeword + "]"
                                + "第" + count + "页数据⋯⋯" + "\n");

                        String filenext = "./htmlnext/" + encondeword + count
                                + savehtml;

                        HtmlUtil.urlToHtm(encondeword, nextUrl, filenext);
                        File innext = new File(filenext);
                        Document docnext = Jsoup.parse(innext, "UTF-8", "");
                        Elements spannext = docnext
                                .select("span[style=display:inline-block;font-family:宋体;font-size:11pt;width:1080px;]");
                        System.out.println("词:[" + encondeword + "]" + "第"
                                + count + "页据爬取成功" + "\n");
                        for (Element e : spannext) {
                            FileUtil.writefile(e.text() + "\n", resultPath);
                            FileUtil.writefile(e.text() + "\n", logpath);
                        }
                    } else if (count > number) {
                        count = 1;
                        if (number != 0) {
                            System.out.println("词:[" + encondeword + "]"
                                    + "标注语料已经抓取完成,结果保存在resultcrawler.html中"
                                    + "\n");
                            FileUtil.extractedWord(encondeword, logpath,
                                    "resultcount.txt");
                        }
                        cancel();
                    }

                } catch (IOException e) {

                    e.printStackTrace();
                }

            }
        };
        Timer timer = new Timer();
        long delay = 0;
        long intevalPeriod = 1 * 20000;
        timer.scheduleAtFixedRate(task, delay, intevalPeriod);

    }
}

运行结果

抓取的html在htmlfind和htmlnext文件夹下,结果保存在result.txt中

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《Android Studio开发实战 从零基础到App上线(第2版)》资源下载和内容勘误[通俗易懂]
下面是《Android Studio开发实战 从零基础到App上线(第2版)》一书用到的工具和代码资源: 1、本书使用的Android Studio版本为3.2,最新的安装包可前往Android官网页面下载。 2、本书使用的Android NDK版本为r17,最新的安装包可前往Android官网页面下载。 3、本书提供所有示例源码的demo工程下载,源码(适配Android4.1到9.0和Android Studio 3.2到3.4)的下载页面为https://pan.baidu.com/s/14NE2DD-frXxuDXUAlTfRaw。最新的源码也可访问我的github获取,github地址是https://github.com/aqi00/android2,服务端的github地址是https://github.com/aqi00/net_server。(部分地区如新疆既访问不了百度网盘也访问不了github,此时可访问csdn的下载页面获取源码https://download.csdn.net/download/aqi00/11223223)。另外,AS3.4之后默认开了androidx,如需获取适配了androidx的本书源码,可访问这个github页面https://github.com/aqi00/androidx。 有的读者反映从github下载本书源码很慢,或者下载不完整,这是国外服务器连接不稳定造成的。建议访问这个代下载网站https://d.serctl.com/,按照网站左上角的“如何下载教程”,找到本书源码的github下载地址并提交,等待几秒后就能在该网站下载完整的源码了。 源码与各章的对应关系表见下图:
全栈程序员站长
2022/09/02
1.7K0
《Android Studio开发实战 从零基础到App上线(第2版)》资源下载和内容勘误[通俗易懂]
《Android Studio开发实战 从零基础到App上线(第2版)》资源下载和内容勘误
下面是《Android Studio开发实战 从零基础到App上线(第2版)》一书用到的工具和代码资源: 1、本书使用的Android Studio版本为3.2,最新的安装包可前往Android官网页面下载。 2、本书使用的Android NDK版本为r17,最新的安装包可前往Android官网页面下载。 3、本书提供所有示例源码的demo工程下载,源码(适配Android9.0和Android Studio 3.2)的下载页面为https://pan.baidu.com/s/14NE2DD-frXxuDXUAlTfRaw。最新的源码也可访问我的github获取,github地址是https://github.com/aqi00/android2,服务端的github地址是https://github.com/aqi00/net_server。 源码与各章的对应关系表见下图:
aqi00
2019/01/18
11.1K1
《Kotlin从零到精通Android开发》资源下载和内容勘误
下面是《Android Studio开发实战 从零基础到App上线》一书用到的工具和代码资源: 1、本书使用的Android Studio版本为3.0.1,Kotlin版本为1.2.0,最新的Android Studio安装包可前往Android官网页面下载。 2、本书提供所有示例源码的demo工程下载,源码的下载页面为https://pan.baidu.com/s/1iVUtJcgX7Fylx-1zRCVjug,也可在作者的github主页下载最新的源码,github地址是https://github.com/aqi00/kotlin。 源码与各章的对应关系表见下图:
aqi00
2019/01/18
1.5K0
《Android App开发进阶与项目实战》资源下载和内容勘误
下面是《Android App开发进阶与项目实战》一书用到的工具和代码资源: 1、本书使用的Android Studio版本为4.2,最新的安装包可前往Android官网页面下载。 2、本书提供所有示例源码的demo工程下载,源码(适配Android4.4到Android11)的下载方式见该书前言末尾的二维码,获取ppt课件同样扫描前言末尾的二维码。最新的源码也可访问我的github获取,github地址是https://github.com/aqi00/advanceapp,服务端的github地址是https://github.com/aqi00/net_server。
aqi00
2022/12/13
4200
《Android Studio开发实战 从零基础到App上线》源码运行问题解答
本书提供了所有章节的完整源码下载,自上市以来陆续收到读者的意见反馈,现将与源码有关的问题汇总归类如下,方便更多的朋友解决源码运行过程中发现的问题: 一、打开本书源码时,出现“Plugin with id 'com.android.application' not found.”的错误。 问题原因:本书源码以module形式提供,所以不能当作工程打开,而要以模块的形式来导入。 解决办法: 按以下步骤重新导入本书源码: 1、依次选择菜单“File”——“New”——“New Project”,按提示新建一个项目(即Project);
aqi00
2019/01/18
1.6K0
《Android Studio开发实战 从零基础到App上线(第2版)》常见问题解答
问题:第17页“1.5.2 安装SVN工具”这节里面提到的SVN仓库地址要填什么? 回答:SVN仓库地址指的是SVN服务器地址,如果你们单位有专人负责svn代码管理,可向他(svn管理员)咨询这个svn地址。如果你的代码只在自己电脑运行,不需要提交给服务器备份,那么建议略过svn这部分。
aqi00
2019/03/04
9780
《Android Studio开发实战 从零基础到App上线》本书内容问题答疑
问题:看安卓开发教程书需要很扎实的java基础吗? 回答:本书的零基础指的是安卓零基础,不是Java零基础,所以看本书之前需要一定的Java基础,基本的变量声明、控制语句、类和对象这三块是必需的;另外最好还掌握字符串模板、容器、接口这三块;如果能了解静态、异常、反射这三种概念对看懂代码很有帮助。 学会以上九项Java基础技术再看本书就会比较轻松了。其它的Java高级技术在本书里面用到的时候会另外介绍,比如: 文件IO,参见本书第4章的“4.3.2 文本文件读写”和“4.3.3 图片文件读写”; 任务,参见本书第6章的“6.2.1 任务Runnable”; 加密算法,参见本书第8章的“8.2.3 数据加密”; 线程,参见本书第10章的“10.1.1 消息传递Message”; HTTP调用,参见本书第10章的“10.2.3 HTTP接口调用”; 文件上传,参见本书第10章的“10.3.3 文件上传”; Socket,参见本书第10章的“10.4.2 Socket通信”; 线程池,参见本书第16章的“16.3 线程池管理”;
aqi00
2019/01/18
1.3K0
Android 开发基础常识
可以通过bindService的方式,先在Activity里实现一个ServiceConnection接口,并将该接口传递给bindService()方法,在ServiceConnection接口的onServiceConnected()方法 里执行相关操作。
zhangjiqun
2024/12/16
1240
Android 开发基础常识
Android App性能优化全方面解析
为了让各位读者过好本次国庆节和中秋节,假日期间我将会推送一些非技术类文章,让你的假日不在孤单迷茫!
开发者技术前线
2020/11/23
7060
Android App性能优化全方面解析
备战金九银十:BAT大厂最爱问的Android核心面试百题详细解析!
Android会同一系列核心应用程序包一起发布,该应用程序包包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
Android技术干货分享
2019/08/02
1.3K0
Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
  最近发现这个项目好似迎来了第二春,GitHub上的Start和Fork增加的很快,我的猜测是学生在通过这个项目来学习和完成自己的作业。随着Android版本的更新,Android Studio的更新,项目中一些内容不能在新版本中很好的使用,甚至出现编译不了的情况,这对我来说没啥,但是对于拿到项目满心欢喜的学生来说,运行不了,无疑是致命的,而我写在项目Readme下面我将演示一下怎么在本地运行这个项目的代码。
晨曦_LLW
2022/11/14
1.5K0
Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
Android面试题含答案「建议收藏」
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
Java架构师必看
2022/04/11
1.6K0
Android面试题含答案「建议收藏」
【谷歌官方文档】1.1 建立第一个APP
本小节介绍如何使用Android Studio或者是SDK Tools中的命令行来创建一个新的项目。
吴延宝
2019/08/09
2.6K0
【谷歌官方文档】1.1 建立第一个APP
Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(一)
Android Studio是Android开发的最理想工具,但是由于版本的更新和配置的差异,会出现很多问题,下面是常遇见的一些问题的总结。
cutercorley
2020/07/23
2.8K0
Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(一)
Android性能优化(一)
一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。
xiangzhihong
2021/01/22
2.7K0
Android程序中,内嵌ELF可执行文件--Android开发C语言混合编程总结
都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统。跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL硬件抽象层。
俺踏月色而来
2019/06/14
2K0
从HelloWorld开始了解Android
我相信任何学习编程的人,刚开始都会接触一个项目,那就是 HelloWorld 。一般来说,这是每一种计算机编程语言中最基本、最简单的程序,亦通常是初学者所编写的第一个程序。它还可以用来确定(测试)该语言的编译器、程序开发环境,以及运行环境是否已经安装妥当,将输出字符串“Hello World”作为第一个示范程序,现在已经成为编程语言学习的传统,接下来让我们来创建第一个程序Hello World。
晨曦_LLW
2020/09/25
1.2K0
Android 面试之必问高级知识点
在Android早期的版本中,应用程序的运行环境是需要依赖Dalvik虚拟机的。不过,在后来的版本(大概是4.x版本),Android的运行环境却换到了 Android Runtime,其处理应用程序执行的方式完全不同于 Dalvik,Dalvik 是依靠一个 Just-In-Time (JIT) 编译器去解释字节码。
xiangzhihong
2021/07/21
6560
Android开发笔记(一百一十九)工具栏ToolBar
在前面的博文《Android开发笔记(二十)顶部导航栏》中,我们学习了ActionBar的用法,可是ActionBar着实是不怎么好用,比如文字风格不能定制、图标不能定制,而且还存在低版本的兼容性问题,所以实际开发中大家还是不倾向使用ActionBar。为此,Android提供了加强版的工具栏控件即Toolbar,因为Toolbar继承自ViewGroup,而且可在布局文件中像其它布局视图一样使用,所以灵活性大大的提高了。既然Android都与时俱进了,那我们也不能落后,现在就来好好学学Toolbar的用法。
aqi00
2019/01/18
2K0
零基础学开发,她做了款「仿知乎」小程序 | 实战教程
有多少人是零基础,又想学小程序开发呢? 今天,知晓程序(微信号 zxcx0101)给大家分享一个励志案例:一个读大气科学、自学前端开发的妹子,因为喜欢逛知乎,自己做出了一款「仿知乎」小程序。 希望她
知晓君
2018/06/28
9640
推荐阅读
相关推荐
《Android Studio开发实战 从零基础到App上线(第2版)》资源下载和内容勘误[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验