小白 Python 爬虫部署 Linux
- 2019 年 11 月 3 日
- 筆記
前言
前面國慶節的時候寫過一個簡易的爬蟲。
還沒看過的同學可以先看一下,這隻爬蟲主要用來爬取各個部落格平台的閱讀量等數據,一直以來都是每天晚上我自己手動在本地電腦運行,中間也有過幾次忘記運行了,導致沒有當天的統計數據。
當然最好的辦法就是把這隻爬虫部署在伺服器上,讓伺服器定時去運行,這樣就不需要我每天人工運行了,還有另外一件事就是之前也說了要做一個統計頁面,自己挖的坑,要自己填起來。
正好最近各個雲服務廠商都在搞雙十一的活動,小編一眼看下去,都是新用戶才能享受優惠,還好,小編在京東雲還是新用戶,購買了京東雲的服務。
這個價格實在是太!貴!了!
一般自己測試使用沒必要買和我同款的機器,小編買這個是為了後面有一些其他的服務也可以部署在上面。
閑話不多說,我們正式開始吧。
前置環境準備
新機器拿到手,除了上面裝好了一個 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 上,方便大家取用。
參考
https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.12931991GMAstw
https://blog.csdn.net/d1240673769/article/details/81451922