小白 Python 爬虫部署 Linux

  • 2019 年 11 月 3 日
  • 筆記

前言

前面國慶節的時候寫過一個簡易的爬蟲。

《Python 簡易爬蟲實戰》

還沒看過的同學可以先看一下,這隻爬蟲主要用來爬取各個部落格平台的閱讀量等數據,一直以來都是每天晚上我自己手動在本地電腦運行,中間也有過幾次忘記運行了,導致沒有當天的統計數據。

當然最好的辦法就是把這隻爬虫部署在伺服器上,讓伺服器定時去運行,這樣就不需要我每天人工運行了,還有另外一件事就是之前也說了要做一個統計頁面,自己挖的坑,要自己填起來。

正好最近各個雲服務廠商都在搞雙十一的活動,小編一眼看下去,都是新用戶才能享受優惠,還好,小編在京東雲還是新用戶,購買了京東雲的服務。

這個價格實在是太!貴!了!

一般自己測試使用沒必要買和我同款的機器,小編買這個是為了後面有一些其他的服務也可以部署在上面。

閑話不多說,我們正式開始吧。

前置環境準備

新機器拿到手,除了上面裝好了一個 CentOS 以外,啥都沒有了,第一步當然是先把環境裝起來啊。

先列舉下我們要裝的軟體:

  • Docker
  • Mysql
  • Python3
  • Java8
  • Nginx

先裝這麼多吧,後續有補充的話再接著裝。

Docker

首先什麼是 Docker 請各位同學自己擺渡好吧,我簡單解釋一下 Docker 是一個容器,這個容器中可以運行很多的程式,這些程式之間互不干擾,如果其中那個程式在使用的過程中配置不對搞不定了,只需要將對應的 container 停止掉刪除掉重新啟動一個即可,從這一點上來講類似於一個沙盒環境。這一點上尤其是資料庫,本人擁有者豐富的在本地安裝 Mysql 把 Mysql 玩脫了重新安裝的經驗。還是 Docker 好用。

開始安裝 Docker ,首先時用自己喜歡的工具連接到遠程的伺服器上(小編這裡使用的是 xshell ),或者也可以自己本地安裝對應的 CentOS 虛擬機(win 環境下安裝 CentOS 虛擬機又可以寫一篇教程了,尤其是其中的網路配置,第一次安裝的同學十有八九都卡在這裡,有需要的同學可以在公眾號給我留言)。

連接成功後如下圖:

好像把 ip 露出來了,emmmmmmmmmmmmm ,各位大佬,沒事幹別攻擊小編的機器,拜謝。

# step 1: 安裝必要的一些系統工具  sudo yum install -y yum-utils device-mapper-persistent-data lvm2  # Step 2: 添加軟體源資訊  sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  # Step 3: 更新並安裝 Docker-CE  sudo yum makecache fast  sudo yum -y install docker-ce  # Step 4: 開啟Docker服務  sudo systemctl start docker

如果 Linux 是使用 root 帳號登錄,命令中無需添加 sudo ,這個關鍵字的含義是使用管理員許可權執行命令。

Docker 默認的鏡像源在遙遠的太平洋的另一端,可以配置中國的鏡像加速來加塊我們的拉取速度,小編這裡選擇的是阿里雲的鏡像加速,配置方式如下:

# 創建文件夾  sudo mkdir -p /etc/docker  # 寫入配置內容  sudo tee /etc/docker/daemon.json <<-'EOF'  {    "registry-mirrors": ["https://12ofullf.mirror.aliyuncs.com"]  }  EOF  # 重啟服務  sudo systemctl daemon-reload  sudo systemctl restart docker

至此,Docker 安裝配置就完成了,可以使用如下命令查看 Docker 的相關資訊來驗證 Docker 正常安裝:

docker info

頁面正常列印如下:

Mysql

Mysql 可以有兩種安裝方式,一種是直接在 CentOS 上進行安裝,另一種是在 Docker 中進行安裝,這裡小編選擇後一種,別問為啥,問就是簡單、方便、快捷。

小編這裡安裝的 Mysql 選擇版本為 5.7 ,安裝命令如下:

docker pull mysql:5.7

等進度條走完,好了,我們已經裝好了 Mysql ,是不是很簡單。

當然,我們剛才只是把 Mysql 的景象給 pull 下來了,接下來的啟動才是關鍵。

docker run --name mysql --restart=always -p 3306:3306 -v /www/mysql/conf.d:/etc/mysql/conf.d -v /www/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d -v /www/mysql/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -d mysql:5.7

這個命令稍微有點長,不過沒關係,直接 Copy 就 Ok。

稍微解釋下其中的含義吧:

--restart 標誌會檢查容器的退出程式碼,並據此來決定是否要重啟容器,默認是不會重啟。

--restart 的參數說明:

  • always:無論容器的退出程式碼是什麼,Docker都會自動重啟該容器。
  • on-failure:只有當容器的退出程式碼為非0值的時候才會自動重啟。另外,該參數還接受一個可選的重啟次數參數,--restart=on-fialure:5 表示當容器退出程式碼為非0時,Docker會嘗試自動重啟該容器,最多5次。

-v 容器內的 /var/lib/mysql 在宿主機上 /www/mysql/datadir 做映射

-e MYSQL_ROOT_PASSWORD 初始密碼

-p 將宿主機3306的埠映射到容器3306埠

接下來我們測試下剛才安裝的 Mysql ,當然是使用本地的連接工具看下是否能正常連接啊,這裡的工具小編選擇了 Navicat 這一經典的 Mysql 連接工具。

測試鏈接成功,我們的 Mysql 安裝完成。

Nginx

Nginx 是一款優秀的反向代理工具,詳細的資訊各位同學可以擺渡,簡單描述下使用場景的話就是我一台伺服器上可以啟動多個服務,通過 Nginx 反向代理,可以映射多個域名,使用不同的域名訪問不同的服務,當然 Nginx 的功能遠不止這些。

首先,打開 Nginx 的官網( http://nginx.org/en/download.html ),選擇一個你喜歡的版本,Copy 到它的下載鏈接:

然後我們使用 wget 命令來下載它。

cd /opt/  wget http://nginx.org/download/nginx-1.17.5.tar.gz

小編這裡選擇的 Nginx 的版本為 1.17.5 。

等待進度條走完,這時我們得到了一個 Nginx 的壓縮包,接下來解壓它。

tar -xvzf nginx-1.17.5.tar.gz

然後我們需要安裝 nginx 的編譯環境:

yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

等待進度條走完。

進入我們剛才解壓的目錄:

cd nginx-1.17.5

開始配置、編譯、安裝:

./configure  make && make install

一小段時間的等待。

等待執行完成後,可以看到 Nginx 已經幫我們安裝到 /usr/local/nginx/ 這個目錄下了,接下來我們可以創建一個軟連接,讓我們在任何目錄都可以直接執行 nginx 的命令:

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

nginx 相關命令

# 啟動  nginx  # 停止  nginx -s quit 或者 nginx -s stop  # 重啟  nginx -s reload

我們啟動 nginx ,打開瀏覽器訪問直接訪問ip,如圖:

Nginx 已經安裝完成,反向代理的配置我們後面用到了再聊,這裡先醬。

Java8

統計報表服務小編這裡計劃使用 Java 來寫,當然 Java 程式也可以放入 Docker 中運行,不過配置 Java 環境就是一件順手的事情,順便做了吧:)

首先一樣,先下載 JDK8 ,並且將 JDK8 放入 /opt/ 目錄中。

因為小編這裡本地有下好的,就不去下載了,大家可以訪問 Oracle 的官網下載。

小編這裡給一個下載鏈接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

回到我們的 CentOS :

cd /opt/  ll

小編這裡使用的 jdk 的版本是 8u221 。

直接解壓:

tar -xvzf jdk-8u221-linux-x64.tar.gz

好了,我們又安裝完了,當然還需要配置下環境變數,直接編輯 /etc/profile 這個文件,在文件中加入我們的環境變數:

# 編輯  vi /etc/profile

寫入環境變數如下:

# 先按 i 開啟插入模式,寫入以下內容  export JAVA_HOME=/opt/jdk1.8.0_221  export JRE_HOME=${JAVA_HOME}/jre  export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  export PATH=${JAVA_HOME}/bin:$PATH

退出保存時先按 esc 鍵,輸入 :wq ,再按回車鍵 enter

這時需要刷新下配置文件:

source /etc/profile

我們來測試剛才配置的 jdk 環境變數是否生效:

# 輸入  java -version  # 輸出  java version "1.8.0_221"  Java(TM) SE Runtime Environment (build 1.8.0_221-b11)  Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)  # 輸入  javac -version  # 輸出  javac 1.8.0_221

jdk 安裝完成

Python3

終於到了最重要的 Python3 的安裝了 。

首先一樣,去 Python 的官網,找到對應版本的 Python3 的下載地址,進入 /opt/ 目錄進行下載:

官網下載鏈接:https://www.python.org/downloads/source/

小編這裡選擇的是截止目前最新發布的 3.8.0 版本。

wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz

下載完成後直接解壓:

tar -xvzf Python-3.8.0.tgz

解壓後編譯安裝:

# 創建安裝目錄  mkdir /usr/local/python3  cd Python-3.8.0  # 檢查配置  ./configure --prefix=/usr/local/python3  # 編譯、安裝  make && make install  # 創建軟連接  ln -s /usr/local/python3/bin/python3 /usr/bin/python3  ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

測試安裝結果:

# 輸入  python3 -V  # 輸出  Python 3.8.0

至此,前置環境已經搭建完成~~~

部署爬蟲

我們前面寫的爬蟲是一個 .py ,先把這個文件上傳至伺服器,目錄自己喜歡就好,小編一般放置在 /opt/ 目錄下。

由於我們的爬蟲引用了一些第三方的模組,這裡需要先安裝這些模組:

pip3 install lxml pymysql

安裝完成後我們執行一下之前的腳本:

# 輸入  python3 /opt/pythonproject/spider-demo.py  # 輸出  ---------CSDN 數據寫入完成---------  ---------掘金 數據寫入完成---------  ---------CNBLOG 數據寫入完成---------

可以看到執行成功,接下來,我們要為 CentOS 設置定時任務,暫時先設置成每天的整點執行一次我們的 Python 爬蟲,便於我們分辨當前的任務是否執行。

定時任務我們是使用 crontab 來完成的,如果當前的 CentOS 不含有 crontab ,可以先進行安裝:

yum install crontabs -y

幾個基礎命令了解一下:

/sbin/service crond start //啟動服務  /sbin/service crond stop //關閉服務  /sbin/service crond restart //重啟服務  /sbin/service crond reload //重新載入配置  查看crontab服務狀態:service crond status 

我們先配置定時任務:

# 進入任務計劃設置  crontab -e  # 計劃內容  0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 * * * python3 /opt/pythonproject/spider-demo.py  # 保存退出  :wq

任務配置完成後,重新載入一下配置,或者重啟一下服務都是可以的。

接下來就是靜靜的等待一小時後看下數據有沒有正常的寫入資料庫。

統計報表

統計報表使用 Java 來完成,後端使用技術為 SpringBoot + Mybatis + Thymeleaf 。前端設計技術為 Vue + Element(餓了么前端組件庫)。

具體實現就不列舉了,有興趣的同學可以訪問程式碼倉庫獲取。

成品大致是醬紫滴:

Java 程式發布大致介紹一下吧,在伺服器上創建一個自己喜歡的目錄,將本地的程式打包後拖上去,執行下面的命令:

nohup java -jar /opt/project/tongji.jar >tongji.out 2>&1 &

就啟動成功了。當然也可以將這個程式打成 Docker 鏡像(這個後續有機會再聊吧),通過 Docker 來啟動 Java 服務。

你以為這就完了么?怎麼可能,我們還有 Nginx 沒有用呢,下面來介紹如何通過 Nginx 來反向代理一個域名。

首先,你要有一個域名,小編的域名是在騰訊雲購買的,並且完成了備案,可以隨心所欲的使用啦~~~~

首先,自定義一個域名指向我們的伺服器,大致是這樣滴:

稍微等一會,等 DNS 生效。然後我們訪問域名:http://tongji.geekdigging.com/ ,這時可以看到頁面跳轉至 Nginx 的首頁:

接下來我們要配置 Nginx 的反向代理了。

首先在 /usr/local/nginx/conf/nginx.conf 這個文件的最後增加一句話:

include /etc/nginx/vhost/*.conf;

因為我們後面可能會配置很多域名,這裡直接將所有的域名相關的配置文件都放在 /etc/nginx/vhost/ 這個目錄下,方便管理, nginx 自身的配置文件我們不多做修改。

我們在 /etc/nginx/vhost/ 創建 tongji.conf 文件,其中內容如下:

server {      listen       80;      autoindex on;      server_name  tongji.geekdigging.com;      access_log off;      # access_log /usr/local/nginx/logs/fuhui_access.log combined;      error_log  /usr/local/nginx/logs/fuhui_error.log  error;      index index.html index.htm index.jsp index.php;        if ( $query_string ~* ".*[;'<>].*" ){          return 404;      }        location / {          proxy_pass http://127.0.0.1:8080;            proxy_set_header Host $http_host;            proxy_set_header X-Real-IP $remote_addr;            proxy_set_header Client-IP $remote_addr;            proxy_set_header X-Forward-For $remote_addr;        }  }

完成後重啟 Nginx :

nginx -s reload

然後我們就能通過域名訪問自己的統計報表了,如圖:

具體鏈接為:http://tongji.geekdigging.com/ ,感興趣的小夥伴可以自己試試看,有不清楚的地方可以在公眾號留言問我。

示例程式碼

本系列的所有程式碼小編都會放在程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。

示例程式碼-Github

示例程式碼-Gitee

參考

https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.12931991GMAstw

https://blog.csdn.net/d1240673769/article/details/81451922