如何使用JAVA快速构建一个网络抓取程序

网络上网站抓取程序,基本都是python写的,且部分场景中,只需要抓取制定页面的数据,如何快速写个小程序,快速实现目的。本文适用于喜欢使用java语言的。

1、快速组建maven工程,下面是相关依赖包,见POM

核心依赖包:hutool用于发起HTTP请求,lombok用于快速注解,为POJO增加getter,setter

       <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.32</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.27</version>
        </dependency>

附属包:

fastjson用于解析返回的json数据,及向POJO进行对象转换

logback,用于简单的调试输出,如果不想使用System.out的。

      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.49</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.5.6</version>
        </dependency>

2、不带会话的抓取

get方法:


        URI uri  = new URI("https://www.xxxxx.xxx/xx?id=xxxx")       
        String res = HttpUtil.get(uri.toString());

post方法:

    HashMap<String, Object> params = new  HashMap<String, Object> ();
       params.put("xx","xx");
       params.put("xx","xx");
       String res = HttpUtil.post("https://www.xxx.xxx", params);
    

2、带会话的抓取

关键点:session信息,不论是否登录,部分网站都在控制会话

第一次打开时,网站会发送Set-Cookie给客户端,这点非常重要,需要记录下来,用于后续的SESSION中,另外,需要注意设置Header中,Referer:上一个页面的路径,Host:访问的主机名。

//获取Set-Cookie,第一次打开页面或登录认证通过后
//这里用uri1来代表第一次页面
HttpRequest request1 = HttpUtil.createGet(uri1.toString());
        HttpResponse response = request1.execute();
        Map<String, List<String>> headers = response.headers();
        String cookies = headers.get("Set-Cookie").toString();

//设置请求的cookie
//这里用uri2来代表第二次页面
  HttpRequest request2 = HttpUtil.createGet(uri2.toString());
        request2.header("Cookie", cookies );
        request2.header("Referer", uri1.getString());
        request2.header("Host", uri2.getHost());
        String res = request2.execute().body();

3、如何将抓取的str转对象

常用转LIST

//Investee为一个POJO
List<Investee> investees = JSON.parseArray(jsonListStr, Investee.class);

不常用转MAP
 

Map<String, Investee> allInvestess = JSON.parseObject(str, new TypeReference<Map<String, Investee>>() {});

4、类的属性如何解析时进行识别转换

比如抓回的数据值为10000万(元),但类属性是个Double,只需要为POJO类相应属性增加的set方法,参数类型为String

    public void setRegCapital(String value) {
        try {
            regCapital = Double.parseDouble(value.replace("万(元)", "").replace(",", ""));
        } catch (Exception e) {
            log.error("parse regRate to double failed.{} regCapital {}", this, value);
            regCapital = 0.0d;
        }
    }

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值