网络上网站抓取程序,基本都是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;
}
}