Busby 的小窝

Always Try My Best!

Python 多进程爬虫初体验[2018.04.14]

最前

近期根据助教的推荐,在莫烦Python上学习了Python爬虫的新操作,主要是多进程和多线程。本次结合课程作业,体验了一把多进程的速度。

要求

输入一座城市的名称,获取其百度百科的基本介绍。如输入北京,访问 https://baike.baidu.com/item/北京 ,获得如下表格数据:

表格数据
将其中的数据提取出来,写入一个.txt文本,如下图所示:

文本数据

基本作业思路及代码

使用requests库访问页面,比原先使用urllib库更加方便,不再需要解决中文的问题。然后再利用beautifulsoup库进行提取,并写入文件。

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 30 09:52:02 2018

@author: busby
"""
import re
import requests
import bs4

def open_url(url):
    # 使用headers解决百科反爬虫的问题
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'}
    res = requests.get(url, headers = headers).content.decode('utf-8')
    soup = bs4.BeautifulSoup(res, 'lxml')
    # print(soup)
    return (soup)

def get_details(soup):
    try: #分别获取整张表、keys、values和注释符号
        table = soup.find('div', class_="basic-info cmn-clearfix")
        table_dts = table.find_all('dt', class_="basicInfo-item name")
        table_dds = table.find_all('dd', class_="basicInfo-item value")
        table_zs = table.find_all('sup', class_="sup--normal")
    except:
        print("请重新输入正确的城市名!")
        main()

    i = 0
    max_i = len(table_dts) #获取循环次数
    keys = []
    values = []
    zss = []
    for each in table_zs: #将注释符号汇总为一个列表
        zss.append(each.text.strip().replace(" ", ""))
    while i < max_i:
        key = table_dts[i].text.strip().replace(" ", "") #先去除空格和换行符
        value = table_dds[i].text.strip().replace(" ", "") #同上
        for each in zss: #通过循环迭代,去除掉注释符号,如果没有则不会去除任何字符
            key = key.replace(each, "").strip()
            value = value.replace(each, "").strip()
        keys.append(key)   
        values.append(value)
        i += 1

    details = [keys, values, max_i] #组成列表,传参
    return(details)

def show_details(details):
    max_i = details[2]
    i = 0
    while i < max_i: #输出完整信息
        print(details[0][i]+":"+details[1][i])
        i += 1

    print('\n\n\n')
    i = 0

    r = re.compile('(\d+(\.\d+)?)') #表示小数或整数
    while i < max_i: #仅输出需要的城市面积和人口信息
        # print(details[0][i])
        if details[0][i] == '面\xa0\xa0\xa0\xa0积':
            area = r.search(details[1][i])[0]
            print("面积:" + str(area))
        if details[0][i] == '人\xa0\xa0\xa0\xa0口':
            pop = r.search(details[1][i])[0]
            print("人口:" + str(pop))
        i += 1

def main():
    while True:
        city_name = input("请输入城市名称(默认为上海,输入exit为退出):")
        if city_name == '':
            city_name = "上海"
        elif city_name == 'exit':
            print("已退出")
            break
        url = "https://baike.baidu.com/item/" + city_name
        # print(url)
        soup = open_url(url)
        details = get_details(soup)
        show_details(details)

if __name__ == '__main__':
    main()

尝试:获取中国所有县级以上城市的信息

1. 获取中国县级以上城市列表

经过多个来源尝试,最终从民政部官网上找到一份
2018年1月中华人民共和国县以上行政区划代码,利用爬虫进行爬取,整合省份信息,代码如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 11 11:53:39 2018

@author: busby
"""

import requests
import bs4

def get_res(url):
    res = requests.get(url).content.decode('utf-8')
    soup = bs4.BeautifulSoup(res, 'lxml')
    content = soup.find_all('td',class_="xl7012452") # 获取有用的列表信息
    id_ =[]
    name_ = []
    i = 0
    new_content = []
    for each in content:
        if each.text != "":
            new_content.append(each)

    while i < len(new_content):
        if i % 2 == 0:
            id_.append(new_content[i].text)
        else:
            name_.append(new_content[i].text)
        i += 1

    provinces = []
    cities = []
    i = 0
    while i < len(id_):
        if id_[i] == 0:
            cities.append(name_[i])
        elif id_[i][0:2] == id_[i-1][0:2]: # 切换不用的省份
            cities.append(name_[i])
        else:
            # print(cities)
            provinces.append(cities)
            cities = []
            cities.append(name_[i])
        i += 1
    return(provinces)

def write_list(provinces):
    # print(provinces)
    file = open("中华人民共和国县以上行政区划代码.txt", 'a', encoding = 'utf-8')
    for province in provinces:
        for city in province:
            file.write(city + "\n")
        file.write("\n")
    file.close

def main():
    url = 'http://www.mca.gov.cn/article/sj/tjbz/a/2018/201803/201803191002.html'
    provinces = get_res(url)
    write_list(provinces)

if __name__ == '__main__':
    main()

大致一共获取到了3200多座县级以上城市。

2.1 尝试简单循环获取所有县级以上城市的百科信息

第一次没有使用多进程,简单利用循环进行获取,结果花了半个小时才获取到所有城市的信息,基本没有丢失城市,代码如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 11 16:11:47 2018

@author: busby
"""

import time
import requests
import bs4

def open_url(url):
    # 使用headers解决百科反爬虫的问题
    headers = {
            'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
            'Referer': 'https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin&fromid=126069&fromtitle=%E5%8C%97%E4%BA%AC%E5%B8%82'
            }

    res = requests.get(url, headers = headers).content.decode('utf-8')
    soup = bs4.BeautifulSoup(res, 'lxml')
    # print(soup)
    return (soup)

def get_details(soup):
    try: #分别获取整张表、keys、values和注释符号
        table = soup.find('div', class_="basic-info cmn-clearfix")
        table_dts = table.find_all('dt', class_="basicInfo-item name")
        table_dds = table.find_all('dd', class_="basicInfo-item value")
        table_zs = table.find_all('sup', class_="sup--normal")
    except:
        print("请重新输入正确的城市名!")
        main()

    i = 0
    max_i = len(table_dts) #获取循环次数
    keys = []
    values = []
    zss = []
    for each in table_zs: #将注释符号汇总为一个列表
        zss.append(each.text.strip().replace(" ", ""))
    while i < max_i:
        key = table_dts[i].text.strip().replace(" ", "") #先去除空格和换行符
        value = table_dds[i].text.strip().replace(" ", "") #同上
        for each in zss: #通过循环迭代,去除掉注释符号,如果没有则不会去除任何字符
            key = key.replace(each, "").strip()
            value = value.replace(each, "").strip()
        keys.append(key)   
        values.append(value)
        i += 1

    details = [keys, values, max_i] #组成列表,传参
    return(details)

def save_details(details):
    max_i = details[2]
    i = 0
    file = open('中国县级以上城市信息简表.txt', 'a', encoding = 'utf-8')
    while i < max_i: #输出完整信息
        file.write(details[0][i]+":"+details[1][i]+"\n")
        # print(details[0][i]+":"+details[1][i])
        i += 1
    file.write('\n\n')
    file.close

def get_list():
    file = open("中华人民共和国县以上行政区划代码.txt", "r", encoding = "utf-8")
    all_lines = file.readlines()
    details = []
    provinces = []
    cities = []

    for line in all_lines:
        details.append(line.split())

    i = 0
    while i < len(details):
        if len(details[i]) != 0:
            cities.append(details[i])
        else:
            #print(cities)
            provinces.append(cities)
            cities = []
        i += 1
    return (provinces)

def main():
    st = time.time()
    num = 1
    city_lists = get_list()
    #print(city_lists)
    for province in city_lists:
        for city in province:
            #print(city[0])
            time.sleep(0.1)
            url = ("https://baike.baidu.com/item/" + city[0][:-1])
            print(url)
            soup = open_url(url)
            details = get_details(soup)
            save_details(details)
            print("已完成", city[0], "共", num, "座城市的信息获取")
            num += 1

        file = open('中国县级以上城市信息简表.txt', 'a', encoding = 'utf-8')
        file.write('\n\n\n\n\n\n\n\n\n\n')
        file.close
    print("用时:", time.time()-st)

if __name__ == '__main__':
    main()

2.2 尝试多进程循环获取所有县级以上城市的百科信息

由于简单循环实在太慢,结合新学的多进程技术,尝试修改了新代码,由于新手原因,折腾了很久都没成功,最后发现pool.map传入的参数本身需要的就是一个列表,才解决了问题,也是没有认真看视频教程好好记笔记的问题,代码如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 11 16:11:47 2018

@author: busby
"""

import time
import requests
import bs4
from multiprocessing import Pool

def get_details(soup):
    try: #分别获取整张表、keys、values和注释符号
        table = soup.find('div', class_="basic-info cmn-clearfix")
        table_dts = table.find_all('dt', class_="basicInfo-item name")
        table_dds = table.find_all('dd', class_="basicInfo-item value")
        table_zs = table.find_all('sup', class_="sup--normal")
    except:
        return(None)

    i = 0
    max_i = len(table_dts) #获取循环次数
    keys = []
    values = []
    zss = []
    for each in table_zs: #将注释符号汇总为一个列表
        zss.append(each.text.strip().replace(" ", ""))
    while i < max_i:
        key = table_dts[i].text.strip().replace(" ", "") #先去除空格和换行符
        value = table_dds[i].text.strip().replace(" ", "") #同上
        for each in zss: #通过循环迭代,去除掉注释符号,如果没有则不会去除任何字符
            key = key.replace(each, "").strip()
            value = value.replace(each, "").strip()
        keys.append(key)   
        values.append(value)
        i += 1

    details = [keys, values, max_i] #组成列表,传参
    return(details)

def open_url(url):
    # 使用headers解决百科反爬虫的问题
    #return(url)
    headers = {
            'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
            'Referer': 'https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin&fromid=126069&fromtitle=%E5%8C%97%E4%BA%AC%E5%B8%82'
            }

    res = requests.get(url, headers = headers).content.decode('utf-8')
    soup = bs4.BeautifulSoup(res, 'lxml')
    # print(soup)
    details = get_details(soup)
    return (details)

def save_details(details):
    max_i = details[2]
    i = 0
    file = open('中国县级以上城市信息简表2.txt', 'a', encoding = 'utf-8')
    while i < max_i: #输出完整信息
        file.write(details[0][i]+":"+details[1][i]+"\n")
        # print(details[0][i]+":"+details[1][i])
        i += 1
    file.write('\n\n')
    file.close
    return('Success')

def get_list():
    file = open("中华人民共和国县以上行政区划代码.txt", "r", encoding = "utf-8")
    all_lines = file.readlines()
    details = []
    provinces = []
    cities = []

    for line in all_lines:
        details.append(line.split())

    i = 0
    while i < len(details):
        if len(details[i]) != 0:
            cities.append(details[i])
        else:
            #print(cities)
            provinces.append(cities)
            cities = []
        i += 1
    return (provinces)

def make_urls(name):
    # print("正在拼凑")
    name = name[0]
    url = "https://baike.baidu.com/item/" + str(name)
    return (url)

def main():
    num = 1
    st = time.time()
    provinces_name = get_list()
    pool = Pool(processes = 8)
    for province in provinces_name:
        provinces_urls = pool.map(make_urls, province)
        provinces_txt = pool.map(open_url, provinces_urls)
        for each in provinces_txt:
            try:
                result = save_details(each)
                print(result, num)
            except:
                print('failed', each)
            num += 1

    print(time.time()-st)

if __name__ == '__main__':
    main()

果然多进程没有让我失望,仅用3分钟就完成了3200多座城市的信息获取,从速度上完胜,但遗憾的是,我发现有几座城市的返回信息为None,暂未明白出错的原因,如有大佬路过,请赐教,非常感谢!

最后

  1. 我学习Python的GitHub主页:https://github.com/busbyjrj/Python-Learning

  2. 本次学习的代码(GitHub):https://github.com/busbyjrj/Python-Learning/tree/master/multiprocessing/city_list

  3. 本爬虫仅学习使用,请控制爬取的速度,以免影响其他用户正常使用百度,谢谢。

  4. 我的多进程代码还有问题,可能会丢失几座城市的信息,暂未查明原因,如有大佬路过,请赐教,非常感谢!

  5. 我的代码虽然例子中只用于城市信息,但实测对其他百度词条也可以使用,但也可能存在一个Bug需要修正,也请赐教,谢谢!

最近更新时间:2018年4月14日

树莓派利用samba和DLNA搭建家庭影院[2018.04.02]

前言

近期学习Python框架不顺,于是重新开始折腾树莓派放松一下。昨天利用Transmission搭建了一个PT下载器,那么既然我都下载到了不少4K视频,当然想看了,然而从树莓派硬盘下载到本地再看非常不方便,且在一些设备上也不支持,那么久想到了再搭建一个家庭影院系统,本次用到了samba和DLNA。

安装samba

sudo apt-get install samba samba-common-bin # 主程序

sudo apt-get install avahi-daemon # 能够使得一个局域网环境下的设备自动获取到树莓派的服务器

设置samba

  1. 打开/etc/samba/smb.conf配置文件,在最下面增加以下代码:

    [share]

    comment = Public Storage

    path = /home/pi/sda1 # 我的PT下载地址

    valid users = root # 可访问的用户,samba有独立的用户体系

    browseable = yes

    public = yes

    writable = yes

    create mask = 0777

    directory mask = 0777

  2. 由于samba有自己独立的用户体系,还需要将root用户增加到samba中

    smbpasswd -a root # 会提示设置密码,需输入两遍

    sudo /etc/init.d/samba restart # 重启软件生效

  3. 设置开机自动启动samba,修改/etc/rc.loca,增加如下内容:

    sudo /etc/init.d/samba start

测试samba

在Windows10 此计算机中增加一个网络地址 \你的树莓派ip地址\share,注意不要漏掉share,输入刚刚添加的root账号及密码后就能够访问。
添加网络地址

本段参考文献:https://shumeipai.nxez.com/2013/08/24/install-nas-on-raspberrypi.html

安装DLNA

sudo apt-get install minidlna # 安装主程序

设置DLNA

打开DLNA的配置文件/etc/minidlna.conf,在末尾添加如下内容:

media_dir=A,/home/pi/sda1 # A表示自动加载音乐文件,后面是我的PT目录

media_dir=P,/home/pi/sda1 # P表示自动加载图片文件

media_dir=V,/home/pi/sda1 # V表示自动加载视频文件

db_dir=/home/pi/sda1/dlna # 设置DLNA的目录

log_dir=/home/pi/sda1/dlna # 设置DLNA的日志

/etc/init.d/minidlna restart # 重启软件,配置生效

测试DLNA

  1. iPad上我使用NPlayer软件,选择网络,点击右上角的加号,直接选择扫面网络即可,可以发现树莓派的目录,输入树莓派自身的root账户和密码即可加载成功(注意不同于samba的root账户和密码,如果两者设置密码是一样的话...那就一样吧)

扫描网络
设置账户

  1. 查看服务器一共有多少个文件

    http://你的树莓派ip地址:8200/

查看文件数量

好啦,设置就到这里了,如果用其它软件或者电视,也参考类似方法,祝观影愉快~

本段参考文献:https://shumeipai.nxez.com/2015/07/12/raspberry-pi-install-dlna-streaming-media-server.html?variant=zh-cn

最近更新时间:2018年04月2日

给树莓派挂载硬盘并搭载PT下载器[2018.04.01]

前要

今天是愚人节,又有一些PT站点开放了注册,于是顺手注册了一个,为了完成新手任务,但又不想在电脑上跑PT程序,就想到了在树莓派上跑PT。但受制于SD卡的容量与性能,必须增加一块硬盘,默默找出了吃灰一段时间的硬盘,本次操作记录如下。

NTFS读写权限

对于NTFS格式的硬盘,树莓派系统没有写的权限,只能读,解决方案如下:

sudo apt-get install fuse-utils ntfs-3g # 安装第三方软件

modprobe fuse # 启动内核模块

reboot # 重启生效

挂载

查看了网上前人的教程后发现我的树莓派3能够自动识别到硬盘且已挂载,但是如果不想挂载默认目录,可以重新挂载,建议重新挂载以解决权限的问题。

  1. 查看挂载情况:

    sudo df -h # 正常情况可以看到一个sda的硬盘,记住挂载地址,我的是/dev/sda5

  2. 卸载原有的挂载:

    umount /dev/sda5

  3. 重新挂载:

    mount -t ntfs-3g /dev/sda5 你的新地址

  4. 设置开机自动挂载,修改/etc/fstab文件,在文末添加一行代码:

    /dev/sda5 你的新地址 ntfs-3g silent,umask=0,locale=zh_CN.utf8 0 0

本段参考文献:http://www.cnblogs.com/kerrycode/archive/2013/04/01/2993701.html

安装及设置PT

  1. 安装:

    sudo apt-get install transmission-daemon

  2. 增加授权:

    sudo usermod -a -G pi debian-transmission

  3. 修改配置文件,在etc/transmission-daemon/settings.json,需要修改一些地方

    "download-dir": "下载完的文件保存的地址",

    "incomplete-dir": "未下载完的文件保存地址",

请确保目录已经有777权限,否则PT会显示permission denied

  1. 重载配置:

    sudo service transmission-daemon reload

  2. 访问地址为:树莓派IP地址:9091,默认用户名和登录密码均为transmission,然后就可以愉快地玩耍啦~

    192.168.1.*:9091

  3. 我发现PT后台经常会被杀掉,原因不明,因此需要其它PT的操作命令:

    sudo service transmission-daemon start # 启动

    sudo service transmission-daemon stop # 停止

    sudo service transmission-daemon restart # 重启

本段参考文献:https://www.jianshu.com/p/9dac4772cc72

最后祝大家愚人节快乐!

最近更新时间:2018年04月1日

树莓派第一次启动记录[2018.03.11]

树莓派第一次启动记录

一、安装树莓派系统

  1. 从树莓派官网下载 Raspbian 系统(最新版本基于 Debian 9):下载地址(官方地址国内速度不好,建议网盘离线下载后再进行下载)

  2. 下载 win32diskimager 软件,用以系统的刻录,将刚刚解压出的.img 文件刻录到空白的 TF卡 中:下载地址

  3. 刻录完成后,由于新系统不再直接支持 ssh 的连接方法,没有买显示器的用户需要手动在 boot 文件夹下创建一个名称为 ssh 文件,注意没有任何后缀。

二、开机获取 root 权限

  1. 将 TF卡 安装在树莓派的底部,插上电源和网线后,绿灯常亮黄灯闪烁显示设备正常启动。

  2. 通过路由器查询到树莓派的 ip地址。

  3. 通过 putty 等软件连接树莓派,默认账户为 pi ,密码为 raspberry。

  4. 连上后更新软件源时,发现网速很慢,因此想要更换为国内源,发现更改需要 root 权限。

  5. 获取 root 权限,需要执行以下代码。

    sudo su #切换为 root 账户

    sudo passwd root #设置 root 账户的密码,需要重复两边

    sudo passwd -u root #切换为 root 账号,需要输入密码

  6. 可能会出现“password expiry information changed.”的错误,这是系统默认禁止了 root 用户的登录。需要修改系统的配置文件。

    sudo nano /etc/ssh/sshd_config

  7. 找到“PermitRootLogin”一项,将后面的参数修改为“yes”,即“PermitRootLogin yes”,再用Ctrl+O快捷键保存,敲击回车,Ctrl+W退出。

  8. 最后重启树莓派,然后就可以用 root 账号愉快的进修修改源了。

    reboot

本部分参考链接:https://www.cnblogs.com/EasonJim/p/6120463.html

三、更新软件源

  1. 国内的网络环境实在太差了,需要将官方的源修改为国内的镜像。修改/etc/apt/sources.list文件,将内容替换为:

    deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main contrib non-free rpi #阿里云

    deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi #中国科学技术大学

    deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi #清华大学

(注:可以根据自己的网络情况只选择其中某个源)

  1. 再修改/etc/apt/sources.list.d中的raspi.list文件,将内容替换为:

    deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/ stretch main ui #中国科学技术大学

(我用的是中科大的源,其他源可以参考设置)

  1. 更换完源之后就可以愉快的升级软件了。

    sudo apt-get update #更新系统软件
    sudo apt-get upgrade #更新已安装的包

大部分网上的教程中都是“wheezy”或者“jessie”,这是因为树莓派的老系统基于Debian 7或者Debian 8,现在最新的树莓派系统是基于Debian 9,如上设置为“Stretch”即可。

四、树莓派的官方设置

  1. 打开设置,这里可以开启 VNC,设置分辨率等,因为我用不到,还没有仔细看。

    sudo raspi-config

最近更新时间:2018年03月11日

全面升级 HTTPS 访问[2018.03.05]

全面升级 HTTPS 访问

HTTPS 是什么?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL ,因此加密的详细内容就需要 SSL。(节选自百度百科)

目前,一半以上的网站都已经开通了 HTTPS 加密,Chrome 和 Firefox 等现代浏览器均表示即将把 HTTP 访问的网站标记为不安全的网站。因此,我昨晚花了一个小时将手头的几个域名都开通了 HTTPS 的证书,将具体过程记录在本文中,以免忘记,因为三个月后我要给证书续期。

Let’s Encrypt X3 的证书

这是一份由 Let’s Encrypt 免费提供的证书,有效期为三个月,到期后可以免费续期。
申请方法一:免费的中文申请网站,freessl.org,我选择的是 ECC 的证书类型,验证类型为 File (DNS也可以,但是我设置了 CDN 加速,改 DNS 有点麻烦),CSR 生成为后端生成(试过一次用浏览器生成,但是用 Chrome 访问的时候失败了,后端生成都能够成功)。

Freessl.org

如图设定好后,将一个文件设置到网站的指定目录,等待120秒后认证通过,就可以下载到 SSL 的证书。我使用的是宝塔面板,可以直接在网站管理中加入证书。我一共有两个域名是通过这个方法申请到的 SSL 证书,缺点是免费证书只能是单域名的,对于多域名和泛域名并不支持。

申请方法二:可以通过这个网站申请:sslforfree,具体操作过程和方法一类似,就不多说了。唯一的区别在于方法一时中文界面,方法二是英文界面。

申请方法三:使用宝塔面板网站管理直接生成证书,据说可以自动续证书,但是我用了 CDN,可能不支持。宝塔的界面如下:
bt.cn

申请方法四(失败):似乎百度云和阿里云等云服务器企业也可以申请免费的证书,但是我在做百度云的时候迟迟不通过文件验证,浪费了许多时间,于是就放弃了。

TrustAsia 亚洲诚信的证书

申请方法一:这个证书是知名杀毒软件赛门铁克家的,它也可以直接在freessl.org这个网站上申请,它提供一年免费的 DV SSL 证书,比上面那个三个月有效期长了四倍,减少了续期的工作量。我也是用 File 文件认证和后端生成 CSR 的方式,我有两个子域名是通过这个证书升级为 HTTPS。

申请方法二(未测试):百度云、阿里云、腾讯云好像也提供这个证书的免费申请,但没有测试过。

将证书安装到阿里 CDN 和 OSS 服务

因为在申请证书的时候,我关闭了 CDN 服务,在后面重建的时候发生了一些错误,浪费了一些时间,特记录。由于晚上可能智商掉线,我一开始弄错了业务逻辑,应该是将访问域名的 DNS 解析到 CDN 的别名上,CDN 的回源域名是 OSS 提供的别名,

在阿里云的 CDN 界面中,设置回源为443端口,并且把证书复制进去,和宝塔面板一样,然后等一会就好了。

但是在访问网站的过程中,我发现还是没有全部实现 HTPPS 访问,通过浏览器的开发人员工具调试发现,我的网站一开始访问的图片还是由80端口提供,经过301跳转才到了433端口,这就使得并不完全安全。但是没有发现什么好的解决方法,好在图片数量不多,于是我只能手动把图片链接改成了 HTTPS 的头,以后看来都要注意这个问题。

后记

当晚就收到了阿里云的账单,因为 OSS 服务花了两分钱,然后就被暂停服务了,吐槽一下阿里云就不能透支一点点么?也不是很懂这两分花在了哪里,我都开通了资源包。

有趣的是,我并没有刻意选择哪个证书去申请,但是凑巧,两个用了 CDN 的子域名都申请了亚洲诚信的一年期证书,这就减少了我未来的工作量,准备三个月后,另外两个子域名也都转移到亚洲诚信下。

更有趣的是,我刚发布完这篇文章的时候就接到了百度云客服经理的回访电话,嗯,提工单解决,以后再说吧,暂时不需要了。

参考教程:

  1. 秋大对 SSL 证书的介绍:https://teddysun.com/527.html
  2. 宝塔面板的 SSL 安装教程:http://www.bt.cn/bbs/thread-704-1-1.html

最近更新时间:2018年03月05日