FunTester 接口爬虫之网页表单数据提取

FunTester · 2020年03月29日 · 804 次阅读

本人最近接到一项任务,要爬一项数据,这个数据在某个网页的表格里面,数据量几百。打开调试模式发现接口返回的就是一个 html 页面,只要当做 string 处理。(解析 html 文件用 xpath 爬虫有些麻烦)方案采用了正则匹配所有的单元行,然后提取单元格内容,这里面遇到了一些其他问题:

  1. 本来采用直接提取内容,发现内容涉及各国语言文字,有点坑,不搞了。

  2. 截取完单元行之后,发现两个字段内容之间有空格,且数量不确定,使用了 spit 方法限制数组大小

  3. 编码格式不正确导致乱码

分享代码供大家参考:

public static void main(String[] args) {

        String url = "https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html";
        HttpGet httpGet = getHttpGet(url);
        JSONObject httpResponse = getHttpResponse(httpGet);
        String content = httpResponse.getString("content");
        List<String> strings = regexAll(content, "<tr.+</a>" + LINE + ".+" + LINE + ".+" + LINE + ".+" + LINE + ".+" + LINE + ".+" + LINE + "</div>");
        int size = strings.size();
        for (int i = 0; i < size; i++) {
            String s = strings.get(i).replaceAll("<.+>", EMPTY).replaceAll(LINE, EMPTY);
            String[] split = s.split(" ", 2);
            String sql = "INSERT country_code (country,code) VALUES (\"%s\",\"%s\");";
            output(String.format(sql, split[0].replace(SPACE_1, EMPTY), split[1].replace(SPACE_1, EMPTY)));
        }
        testOver();
    }

其中的一些封装方法如下:

/**
     * 返回所有匹配项
     *
     * @param text  需要匹配的文本
     * @param regex 正则表达式
     * @return
     */
    public static List<String> regexAll(String text, String regex) {
        List<String> result = new ArrayList<>();
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);
        while (matcher.find()) {
            result.add(matcher.group());
        }
        return result;
    }

最终拼接的 sql 部分结果为:

INSERT country_code (country,code) VALUES ("German","de");
INSERT country_code (country,code) VALUES ("Greek","el");
INSERT country_code (country,code) VALUES ("Greenlandic","kl");
INSERT country_code (country,code) VALUES ("Guarani","gn");
INSERT country_code (country,code) VALUES ("Gujarati","gu");
INSERT country_code (country,code) VALUES ("Hausa","ha");
INSERT country_code (country,code) VALUES ("Hebrew","he");
INSERT country_code (country,code) VALUES ("Hindi","hi");
INSERT country_code (country,code) VALUES ("Hungarian","hu");
INSERT country_code (country,code) VALUES ("Icelandic","is");
INSERT country_code (country,code) VALUES ("Indonesian","id");
INSERT country_code (country,code) VALUES ("Interlingua","ia");
INSERT country_code (country,code) VALUES ("Interlingue","ie");
INSERT country_code (country,code) VALUES ("Inuktitut","iu");
INSERT country_code (country,code) VALUES ("Inupiak","ik");
INSERT country_code (country,code) VALUES ("Irish","ga");
INSERT country_code (country,code) VALUES ("Italian","it");
INSERT country_code (country,code) VALUES ("Japanese","ja");

技术类文章精选

  1. java 一行代码打印心形
  2. Linux 性能监控软件 netdata 中文汉化版
  3. 接口测试代码覆盖率(jacoco)方案分享
  4. 性能测试框架
  5. 如何在 Linux 命令行界面愉快进行性能测试
  6. 图解 HTTP 脑图
  7. 如何测试概率型业务接口
  8. httpclient 处理多用户同时在线
  9. 将 swagger 文档自动变成测试代码
  10. 五行代码构建静态博客
  11. httpclient 如何处理 302 重定向
  12. 基于 java 的直线型接口测试框架初探
  13. Tcloud 云测平台 -- 集大成者

非技术文章精选

  1. 为什么选择软件测试作为职业道路?
  2. 成为杰出 Java 开发人员的 10 个步骤
  3. 写给所有人的编程思维
  4. 自动化测试的障碍
  5. 自动化测试的问题所在
  6. 测试之《代码不朽》脑图
  7. 成为优秀自动化测试工程师的 7 个步骤
  8. 优秀软件开发人员的态度

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册