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

本人最近接到一项任务,要爬一项数据,这个数据在某个网页的表格里面,数据量几百。打开调试模式发现接口返回的就是一个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的直线型接口测试框架初探

非技术文章精选

  1. 为什么选择软件测试作为职业道路?
  2. 成为杰出Java开发人员的10个步骤
  3. 写给所有人的编程思维
  4. 自动化测试的障碍

原文发布于微信公众号 - FunTester(NuclearTester)

原文发表时间:2019-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券