开了个新坑《学霸的黑科技系统》

最近项目做的差不多了,虽然还没做完,但是有了一些闲暇时间。在某次找事情做的时候,看到了一个推荐网络小说的问题,里面提到了一个作者 ,晨星LL ,新兴的科技末世流。

长时间没看什么新小说了,就开了这位作者的《学霸的黑科技系统》。

这是第一本我需要在看的过程中还不停的去网上搜索相关资料的小说,包括但不限于数学、物理、化学、科学史等等。。。

是一部让人看了之后很想去学习的小说 哈哈

而且很有一种工科男的浪漫

这是一部让极客和科研工作者可能都挺喜欢的一部小说,在此记录并推荐。

mysql使用问题

前几天采集数据折腾着玩,在服务器上卸载了原来的marialdb,重新安装了新版本的mysql,创建数据库,创建账户,授权,然后本地连接、本地跑数,都挺正常。

程序写好之后,代码在本地跑的效率就不乐观,觉得可能是网络的问题,放到服务器上可能会好一些。把代码放服务器上去跑,发现性能有所提升,但是还是不太对,不应该是本地跑数的速度。

看了一下阿里云的后台监控,发现还有内网消耗,忽然想起来,上传代码的时候,代码里写的数据库连接还是IP地址,不是127.0.0.1或者localhost,导致还是走了部分网络。

重新修改配置,打包代码发布到服务器上,启动。访问首页,结果报错,异常信息:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed,之前没遇到过,但是根据当时自己建库的过程,盲猜是用户配置的问题,当时给用户配置的host是%。

搜索一下网络,发现大家给的解决方案是:

在数据库连接url的后边加上参数: allowPublicKeyRetrieval=true

原因是:如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启

最终改成:

jdbc:mysql://127.0.0.1:3306/lottery_probability?useSSL=false&allowPublicKeyRetrieval=true

再发布,启动,OK,并且执行速度提升了好几倍,这才是应该有的速度。不过即使这样,也需要跑几个小时。。。等着吧

爬虫爬取某菠菜网站的结果

查看网站,结果在外边没有,需要用正式用户或者游客身份登录之后才能拿到
登录之后,查看请求内容,发现只有一个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的这一项去掉,试试。

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

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

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