爬虫爬取某菠菜网站结果

查看网站,结果在外边没有,需要用正式用户或者游客身份登录之后才能拿到
登录之后,查看请求内容,发现只有一个get的请求是主要数据,但是整个是页面,不是单独的数据
摘出来链接:/member/dresult?lottery=AULUCKY5&date=*&table=1
写爬虫的时候需要替换这里的日期

用熟悉的语言,java写,因为后续还需要做成服务,做服务的时候,java也比较顺畅

使用原来写的httpUtil爬取,发现从网站拿来的header有的不能用,搜了一下,是http2里可以自定义的key,比如key使用冒号开头
// :method: GET
// :path: /member/dresult?lottery=AULUCKY5&table=1&date=2018-01-01
使用java自带的http请求会无法携带这些自定义的header
查资料,发现jdk8处理http2略微有些麻烦,直接使用支持http2的jdk版本比较方便。到oracle上去下载。下载了16.

下载成功之后,安装,整个环境的参数已经被修改,执行java -version 显示是jdk16了。

使用开发工具idea增加仓库,发现总是报无法识别的仓库地址。想了一下,好像是因为我idea比较老的原因。。。我的idea还是2017版的。。。

没办法,这个方法得放弃了。使用另外一种方式。

修改项目依赖,增加依赖okhttp3,当前环境使用的是jdk8,直接在仓库里找了个比较新的版本

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>


结果依赖的包怎么都引入不进来,根本没法实例化。
弄了半天仍然不行,忽然想到可能也是版本的原因。

去查了一下这个版本包发布的时间,确实是在jdk8之后很久,时间差距有点太大,可能是这个原因,切换一个比较老的版本试试。

找了个距离jdk8发布时间比较接近的版本,

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.11.0</version>
</dependency>


修改这个配置之后,OK了,可以实例化了。
写个公用点的方法,可以动态添加header

public static String getUrlContent(String urlStr, Map<String, String> headers) {
try {
Request.Builder requestBuilder = new Request.Builder().url(urlStr);
headers.forEach(requestBuilder::addHeader);
Request request = requestBuilder.build();
Response response = client.newCall(request).execute();
if (Objects.isNull(response)) {
throw new IOException("Response is null");
}
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
if (Objects.isNull(response.body())) {
throw new IOException("Response body is null");
}
return response.body().string();
}
catch (IOException io) {
System.out.println("获取URL资源异常!,URL :" + urlStr);
throw new RuntimeException("获取URL资源异常!URL " + urlStr);
}
}

把从浏览器里扒出来的header都写到代码里,然后写死一个地址,尝试请求一下
/member/dresult?lottery=AULUCKY5&date=2018-01-01&table=1

请求成功,但是显示的是乱码。从网上找资料,有的说把gzip这个header的这一项去掉,试试。

尝试成功,打印出来了需要的页面内容。

按照之前跟大佬交流时候的提议,建议在爬完一些网页之后,为了避免需要重新摘取里面的数据的时候,网页出现了变化,需要重新解析,所以第一次爬完之后就把所有的爬取下来的网页直接保存成文件,后续需要用的时候,直接拿这些文件用就行了,不需要再重新去爬取,还需要处理各种外部变化问题。

不过这次应对的网站比较简单,感觉不会有这么频繁的变化,先把数据爬下来再说。写入文件也就一步简单的操作,先写数据解析的部分。