前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >又省了一千多块钱

又省了一千多块钱

作者头像
崔庆才
发布2020-02-21 15:29:36
1.2K0
发布2020-02-21 15:29:36
举报
文章被收录于专栏:进击的Coder进击的Coder

“ 阅读本文大概需要 5 分钟。 ”

现在爬虫的文章,面临的一个很大的问题就是网站改版问题。本来好好地写了一篇文章,结果过了几天网站改版了,案例就跑不通了,文章就没有意义了。

我也为此深感头痛,之前我的书《Python3网络爬虫开发实战》里面的很多案例已经失效了,大部分的原因都是选取的案例网站改版了,要么是不能访问了,要么是改样式了,要么是改逻辑了,要么是加反爬虫了。这一变,导致代码、文章内容都完全没法用了,但书已经印刷了,内容又不好改,顶多在 GitHub 上面改过来,但大部分读者看书的时候发现又发现对应不起来,频繁的变动和改版实在是让我焦头烂额。

解决方案

所以,怎么解决呢?那就是自建爬虫练习平台。

首先,自建练习平台,这样我的平台是完全受我控制的,就不会再出现网站改版或案例失效的问题了;另外自建平台还有个好处就是避免了很多不必要的麻烦,之前很多人写爬某多多、某宝、搞某验、搞某云,收到过警告甚至律师函,所以接下来我不会再写具体爬某个网站了,所有的案例包含的知识点全部迁移到自建平台上面,这样也规避了很多风险。练习平台的案例都把想要讲解的知识点融进去,比如讲验证码,就对接验证码的案例;讲代理,就做一个能检测 IP 频率并反爬的案例;讲 JavaScript 逆向的,就专门做 JavaScript 混淆的案例。接下来《Python3网络爬虫开发实战(第二版)》的案例将会全部迁移到自建平台上面,现在已经完成了一部分了。

案例的代码全部公开:https://github.com/Germey/Scrape,大家可以到这里体验下或者来监控我的进度。

话说回来

不过,这节文章内容并不是为了说这个的,是说着省了 1000 多块钱的事的。

咋回事呢?因为要做练习平台嘛,所以一定需要一个域名的,我自己常用的域名就是 cuiqingcai.com,就是我的名字加上 .com,所以这个练习平台我自己想了一个二级域名,就叫做 scrape.cuiqingcai.com,然后每个案例都用它的子域名,比如 xxx.scrape.cuiqingcai.com,其中前面的 xxx 就是案例的名字,比如现在已经成功搭建的有 static1.scrape.cuiqingcai.com,就是一个简易的静态网站,可以供静态网站爬取。

截图如下:

样例

在这里有人要说,为什么不用子路径呢?比如 scrape.cuiqingcai.com/static1,之前试过了,每个案例都是独立的,会造成很多路由冲突的问题,不如用三级域名。

问题

好,那么问题来了,现在很多网站都需要 HTTPS 化,非 HTTPS 的网站都会提示不安全,所以我需要为每个三级站点申请一个 HTTPS 证书。现在每个案例都对应一个三级域名,随着案例的变多,我不能每次都单独申请个 HTTPS 证书吧,这太麻烦了。我现在用的是腾讯云,现在证书都是从 TrustAsia 来申请的,现在还有单域名 20 个的限制。这肯定不行啊,所以我肯定要申请一个通配符三级域名证书,那就是 *.scrape.cuiqingcai.com,这样它可以适用于平台的每个案例,因为每个案例都是符合这个域名规则的,如 static1.cuiqingcai.com 是能够使用 *.scrape.cuiqingcai.com 这个证书的。

好,那么这证书咋搞呢?腾讯云官方是不支持直接申请免费的泛域名证书的,得买。

多少钱呢?分了好多种吧,有企业级 OV、增强型 EV、域名型 DV 等等,看看价格。

企业型

企业型就算了,好几万呢,不了不了。

域名型

最便宜的,域名型 DV,一年 1699,说贵倒不是很贵。

但是我这平台可能得一直维护好多年呢,一年为了个证书单独搞个 1699,想了想是有点那啥。

寻路

然后我就去找有没有免费的,找到了这么个网站:https://freessl.cn/,它可以申请免费的 SSL 证书,甚至泛域名的也可以,这个是 Let's Encrypt V2 颁发的,可以可以。

为此,我兴致勃勃去试了试,但试了好几种方法要么是在颁发的时候卡壳,要么是在 DNS 解析的时候卡壳,算了不用了,你们可以试试。

使用截图

然后看了看控制台,发现这个网站它有这么个收费项目「证书自动化」,用的是 acme.sh 自动化,还收费一块钱。

证书自动化

得了,开源项目封装了一下,就能收费了。

算了我还是自己搞搞吧。

然后我就找到了 acme.sh 这个项目,GitHub 地址是:https://github.com/acmesh-official/acme.sh。

好,下面一段贴一下 acme.sh 的官方介绍和使用方法吧,不是我写的,直接拿来了。

注意:下面这个「acme.sh 介绍」这一段是来自官方介绍,不想看的可以跳过。

acme.sh 介绍

acme.sh 实现了 acme 协议, 可以从 Let's Encrypt 生成免费的证书.

主要步骤

1.安装 acme.sh2.生成证书3.copy 证书到 nginx/apache 或者其他服务4.更新证书5.更新 acme.sh6.出错怎么办, 如何调试

下面详细介绍。

安装 acme.sh

安装很简单, 一个命令:

代码语言:javascript
复制
curl  https://get.acme.sh | sh

普通用户和 root 用户都可以安装使用。

安装过程进行了以下几步:

1) 把 acme.sh 安装到你的 home 目录下:

代码语言:javascript
复制
~/.acme.sh/

并创建 一个 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

2) 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中: ~/.acme.sh/

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议。

一般有两种方式验证:http 和 dns 验证。

1.http 方式需要在你的网站根目录下放置一个文件,来验证你的域名所有权,完成验证. 然后就可以生成证书了。

代码语言:javascript
复制
acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

只需要指定域名,并指定域名所在的网站根目录。acme.sh 会全自动的生成验证文件,并放到网站的根目录,然后自动完成验证。最后会聪明的删除验证文件,整个过程没有任何副作用。

如果你用的 apache 服务器, acme.sh 还可以智能的从 apache 的配置中自动完成验证,你不需要指定网站根目录:

代码语言:javascript
复制
acme.sh --issue  -d mydomain.com   --apache

如果你用的 nginx 服务器或者反代,acme.sh 还可以智能地从 *

nginx *

的配置中自动完成验证,你不需要指定网站根目录:

代码语言:javascript
复制
acme.sh --issue  -d mydomain.com   --nginx

注意:无论是 apache 还是 nginx 模式, acme.sh 在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置。好处是你不用担心配置被搞坏,也有一个缺点,你需要自己配置 ssl 的配置,否则只能成功生成证书,你的网站还是无法访问 https。但是为了安全, 你还是自己手动改配置吧。

如果你还没有运行任何 web 服务,80 端口是空闲的,那么 acme.sh 还能假装自己是一个 webserver,临时听在 80 端口,完成验证:

代码语言:javascript
复制
acme.sh  --issue -d mydomain.com   --standalone

更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert

1.手动 dns 方式,手动在域名上添加一条 txt 解析记录, 验证域名所有权。

这种方式的好处是:你不需要任何服务器, 不需要任何公网 ip,只需要 dns 的解析记录即可完成验证。坏处是:如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

代码语言:javascript
复制
acme.sh  --issue  --dns   -d mydomain.com

然后 acme.sh 会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 txt 记录即可。

等待解析完成之后, 重新生成证书:

代码语言:javascript
复制
acme.sh  --renew   -d mydomain.com

注意第二次这里用的是 --renew

dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证。

acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。

以 dnspod 为例,你需要先登录到 dnspod 账号, 生成你的 api id 和 api key,都是免费的。

然后:

代码语言:javascript
复制
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh   --issue   --dns dns_dp   -d aa.com  -d www.aa.com

证书就会自动生成了。这里给出的 api id 和 api key 会被自动记录下来,将来你在使用 dnspod api 的时候, 就不需要再次指定了。

直接生成就好了:

代码语言:javascript
复制
acme.sh  --issue   -d  mydomain2.com   --dns  dns_dp

更详细的 api 用法: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

最后,本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面:https://github.com/Neilpang/acme.sh/wiki。

我的操作

嗯,上面的文档读起来有点别扭,感觉像是机器翻译,就在这里做一下记录了,看不懂也没啥关系。

通过看 acme.sh 文档的内容,大体了解到这么几件事:

•acme.sh 支持刚才所说的 Let's Encrypt 机构,而且是默认使用 Let's Encrypt,因此可以用它来颁发我的三级域名证书。•acme.sh 支持自动化 DNS 验证。•acme.sh 可以实现自动化,可以配置定时更新。

舒服了,开搞!

这里我的域名解析用的腾讯云,也就是 DNSPod,怎么实现自动化 DNS 验证呢?当然是 API 了,在 https://console.dnspod.cn/account/token 申请一个 API Token 就行了:

DNSPod Token 申请

然后照着文档说的,设置下环境变量:

代码语言:javascript
复制
export DP_Id='135818'
export DP_Key='c6135f12abd2xxxxxxx98395a5326905'

这里换成你自己的。

然后调用 acme.sh 的命令,指定域名,还有 dns 的类型为 DNSPod。

最重要的,生成命令:

代码语言:javascript
复制
acme.sh --issue -d '*.scrape.cuiqingcai.com' --dns dns_dp

运行结果类似如下:

运行结果

运行完就 OK 了。

证书的路径在最后它会告诉我们。

我的服务器是 Nginx,所以我需要用现在生成的证书转成 Nginx 专用的证书格式,命令如下:

代码语言:javascript
复制
acme.sh --installcert -d '*.scrape.cuiqingcai.com' --key-file './*.scrape.cuiqingcai.com.key' --fullchain-file './*.scrape.cuiqingcai.com.crt'

这样本地就会生成 Nginx 专用的证书,直接使用即可。

要用的话,配置类似如下:

代码语言:javascript
复制
http {
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    server {
        listen 80;
        server_name <mydomain>.com;
        return 301 https://<mydomain>.com;
    }
    server {
        listen 443 ssl;
        ssl_certificate  /etc/nginx/ssl/<domain>.crt;
        ssl_certificate_key  /etc/nginx/ssl/<domain>.key;
    }
}

我们也可以使用 acme.sh 的 installcert 命令来实现自动安装,具体可以参考:https://www.jianshu.com/p/b6b172f69c14,我这里是用的 Kubernetes,就不直接这么配置了。

最后,自动化的话,大家看自己具体怎么弄了,我是用的 Kubernetes,只需要用 kubectl 创建一个 tls 类型的 secret 就行了,样例命令如下:

代码语言:javascript
复制
kubectl create secret tls tls-scrape-cuiqingcai-com -n scrape --cert '*.scrape.cuiqingcai.com.crt' --key '*.scrape.cuiqingcai.com.key' 

Let's Encrypt 的证书有效期是 90 天,为了实现自动化更新,我们可以上面的几步命令写到一个脚本,然后使用 crontab 直接运行就好了。

最后部署成功,打开网站 https://static1.scrape.cuiqingcai.com/,验证下,看看证书:

证书

没问题,三级泛域名证书配置成功!过期时间是 90 天,到时候自动 crontab 更新即可。

嗯,就这么省了一千多块钱。

踩坑

在中间曾经遇到过这么一个错误:

代码语言:javascript
复制
Verify error:CAA record for *.scrape.cuiqingcai.com prevents issuance.

本来怀疑是 DNSPod 不支持 CAA 记录解析,结果发现不是的,是因为我给 scrape.cuiqingcai.com 配置了 CNAME,如果设置了 CNAME,请求 CAA 记录但是没有设置就会返回 CNAME,然后去查找 CNAME 域名的 CAA 记录。所以可以先把 CNAME 的解析禁用,再执行即可。

踩坑参考来源:https://www.v2ex.com/t/511217,感谢 V2EX。

检测

最后,大家的 SSL 证书情况可以到 https://www.ssllabs.com/ssltest/analyze.html 来检查下,检查一些配置的安全程度,介绍如下:

This free online service performs a deep analysis of the configuration of any SSL web server on the public Internet. Please note that the information you submit here is used only to provide you the service. We don't use the domain names or the test results, and we never will.

比如我这个配置完了,检查级别为 A+,还不错!

检查结果

本文参考

•https://www.zybuluo.com/xiaoyixy/note/1055898#c3•https://cloud.tencent.com/developer/article/1140719•https://www.jianshu.com/p/b6b172f69c14•https://www.ssllabs.com/ssltest/analyze.html•https://github.com/Germey/Scrape•https://www.v2ex.com/t/511217

崔庆才丨静觅

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击的Coder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
  • 话说回来
  • 问题
  • 寻路
  • acme.sh 介绍
    • 主要步骤
      • 安装 acme.sh
        • 生成证书
        • 我的操作
        • 踩坑
        • 检测
        • 本文参考
        相关产品与服务
        SSL 证书
        腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档