Python Scrapy 爬蟲(四):部署與運行

接上篇,在上篇中,咱們已經在服務器上搭建好了 Python3 環境以及對應的 virtualenv 虛擬環境了。接下來,咱們開始把代碼部署到咱們的服務器環境並運行。html

在部署咱們的代碼到服務器前,咱們來看看咱們的代碼須要哪些環境 首先,咱們的代碼是 Python3 開發的,所以,它首先依賴於 Python3 環境。 其次,咱們的代碼還用到了一此第三方的框架或庫,好比 scrapy、pymysql... 固然,最重要的就是咱們的代碼了,他是咱們的項目的核心邏輯和業務。python

在上一篇中,咱們完成了第一部分的 Python3 的環境的搭建。此文咱們將完成第三方庫安裝以及代碼部署這兩部分的工做。mysql

1、提交代碼

gitee.com 做爲咱們代碼託管平臺進行示例。react

注: 建立項目的步驟正常狀況下不該該在項目開發完成之後再進行,但因爲此步驟我在前面的文章中忘了介紹,所以在此處補上。事實上,以前開發的項目我已經提交過了,此處再另新建一個項目用做示例。git

1 註冊一個 gitee.com 帳號

此步驟略web

2 建立一個項目

此步驟簡要描述以下,點擊右上角的 "+" 選擇 "新建項目",填寫項目名稱,是否開源可隨意選擇,此處選擇私有。下面的選擇語言,添加 .gitignore,使用 Readme 文件初始化項目 等所有不選... 建立一個空白項目(因爲個人項目中以前已經建立過了,若是是新項目,則能夠選擇 python 的 .gitignore 模板與 Readme 模板)sql

新建一個空白項目

3 安裝 git 工具

個人開發環境是 Windows。所以,下載一個 Windows 版本的 git 並安裝,下載地址以下所示: git-scm.com/download/wi…數據庫

安裝過程略。windows

4 設置 SSH 公鑰

點擊頭像 -> "設置" -> "SSH公鑰" -> 點擊右側 "怎樣生成公鑰" 可查看生成方式bash

設置 SSH 公鑰

按照公鑰生成方式生成公鑰並添加到 gitee.com 的 SSH 公鑰頁面。公鑰能夠簡單理解爲密令,好比咱們生成的公鑰相似於 "天王蓋地虎,寶塔鎮河妖",而後咱們把這個密令給 gitee.com,而後當咱們須要與 gitee.com 進行資源操做時,兩邊一對口令,發現對上了。這事兒就簡單了,也不用咱再用戶密碼驗證一遍了。

5 代碼提交

爲了效果更直觀,所以,直接在 PyCharm 中進行代碼提交演示。

(1) 初始化項目

初始化 git

(2) 添加 readme.md 與 .gitignore

建立 .gitignore 與 README.md

在項目根目錄下建立名爲 readme.md 與 .gitignore 的文件,文件內容大體以下:

README.md

# proxy_ip

#### 項目介紹
proxy_ip 是一個從網絡上爬取免費 IP 的項目。

#### 項目環境與依賴
python 版本
- python 3.6.1

#### 第三方庫
- pywin32==223(windows environment)
- scrapy==1.5.0
- pymysql==0.8.1
- fake-useragent==0.1.10

#### 運行方法
1.運行環境
- 確保具有 ptyhon 3.x 的環境,安裝依賴的第三方庫
2.數據庫配置
- 更改 settings.py 中的 MySQL 數據庫鏈接信息
- 建立 proxy_ip 表,建表腳本位於 scripts/database.sql
3.運行程序
- 進入項目的根目錄 proxy_ip,執行 nohup python main.py &
複製代碼

.gitignore

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
.static_storage/
.media/
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/

# idea
/.idea/
複製代碼

(3) 添加遠程倉庫映射

PyCharm -> VCS -> Git -> Remotes -> 點擊 "+" -> 將項目首頁上代碼倉庫的 SSH 地址填入 URL 處 -> 點擊 OK -> 等待 Checking URL -> 若是前面 SSH 公鑰配置正確,此處就完事兒了

項目的代碼倉庫地址

image.png

(4) 第一次提交

"VCS" -> "Commit..." -> 在 "Commit Message" 下方的文本框中輸入提交的備註信息 -> 選擇 "Commit and push"

提交

2、拉取代碼

1 配置服務器公鑰

按照上方的配置方法與步驟將服務器的公鑰配置到 gitee.com 平臺

2 拉取代碼

肯定一個目錄用於存放項目代碼,如 /data 目錄,

[root@192 data]# cd /data
[root@192 data]# git clone git@gitee.com:jzl975/test-proxy-ip.git
Cloning into 'test-proxy-ip'...
The authenticity of host 'gitee.com (116.211.167.14)' can't be established. RSA key fingerprint is e3:ee:82:78:fb:c0:ca:24:65:69:ba:bc:47:24:6f:d4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'gitee.com,116.211.167.14' (RSA) to the list of known hosts. Cloning into 'test-proxy-ip'... remote: Counting objects: 36, done. remote: Compressing objects: 100% (34/34), done. remote: Total 36 (delta 11), reused 0 (delta 0) Receiving objects: 100% (36/36), 9.27 KiB, done. Resolving deltas: 100% (11/11), done. 複製代碼

3、安裝第三方庫

1 建立虛擬環境

[root@192 data]# mkvirtualenv proxy-ip
Using base prefix '/usr/local'
New python executable in /root/.virtualenvs/proxy-ip/bin/python3.6
Also creating executable in /root/.virtualenvs/proxy-ip/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /root/.virtualenvs/proxy-ip/bin/predeactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/proxy-ip/bin/postdeactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/proxy-ip/bin/preactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/proxy-ip/bin/postactivate
virtualenvwrapper.user_scripts creating /root/.virtualenvs/proxy-ip/bin/get_env_details
(proxy-ip) [root@192 data]# 
複製代碼

2 安裝第三方庫

根據咱們 README.md 中記錄的使用到的第三方庫進行安裝,以下示例: (省略安裝過程)

(proxy-ip) [root@192 data]# pip install scrapy -i https://pypi.douban.com/simple
...
Could not find a version that satisfies the requirement Twisted>=13.1.0 (from scrapy) (from versions: )
No matching distribution found for Twisted>=13.1.0 (from scrapy)
複製代碼

其中,安裝 scrapy 報錯,報錯信息以下,提示找不到匹配的 Twisted,因而手動安裝:

(proxy-ip) [root@192 Twisted-17.9.0]# pip install pymysql

(proxy-ip) [root@192 Twisted-17.9.0]# pip install fake-useragent

(proxy-ip) [root@192 ~]# wget https://twistedmatrix.com/Releases/Twisted/17.9/Twisted-17.9.0.tar.bz2
--2018-05-31 11:24:55--  https://twistedmatrix.com/Releases/Twisted/17.9/Twisted-17.9.0.tar.bz2
Resolving twistedmatrix.com... 66.35.39.66
Connecting to twistedmatrix.com|66.35.39.66|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3019243 (2.9M) [application/x-tar]
Saving to: 「Twisted-17.9.0.tar.bz2」

100%[==============================================================>] 3,019,243    217K/s   in 15s     

2018-05-31 11:25:13 (193 KB/s) - 「Twisted-17.9.0.tar.bz2」 saved [3019243/3019243]

(proxy-ip) [root@192 ~]# tar -jxf Twisted-17.9.0.tar.bz2 
(proxy-ip) [root@192 ~]# cd Twisted-17.9.0
(proxy-ip) [root@192 Twisted-17.9.0]# python setup.py install
複製代碼

再次安裝 scrapy

(proxy-ip) [root@192 ~]# pip install scrapy -i https://pypi.douban.com/simple
複製代碼

4、運行

注:

運行前,請確保本機有須要的 mysql 數據庫服務以及請確保建立了數據庫表(數據庫建表語句在代碼中的 scripts/database.sql 中),若是想要將數據保存到其餘數據庫中,請修改 settings.py 中的 MySQL 相關配置。

1 運行方式一

(proxy-ip) [root@192 ~]# cd /data/test-proxy-ip/
(proxy-ip) [root@192 test-proxy-ip]# scrapy list
proxy_ip
(proxy-ip) [root@192 test-proxy-ip]# scrapy crawl proxy_ip

...
            insert into proxy_ip(
                country, ip, port, server_location,
                is_anonymous, protocol_type, speed, connect_time,
                survival_time, validate_time, source, create_time
                )
            VALUES (%s, %s, %s, %s, %s,  %s, %s, %s, %s, %s,  %s, %s)
             ('CN', '120.33.247.127', '25998', '福建莆田', '高匿', 'HTTP', '1.759秒', '1.759秒', '4天', '2018-05-31 17:44:00', 'www.xicidaili.com', '2018-05-31 11:44:39')
(1062, "Duplicate entry '120.33.247.127-25998' for key 'ip'")
複製代碼

第一步,進入咱們的項目根目錄。 第二步,能夠執行 scrapy list 命令查看咱們的全部的爬蟲,這兒的 "proxy_ip" 就是咱們在 spiders 下面的 xicidaili.py 中定義的 name 的值。 第三步,執行 scrapy crawl proxy_ip 運行爬蟲。

注:

這種方式只是在前臺運行,即當咱們的會話結束,程序運行也就結束了。若是咱們要想程序在後臺運行,可使用 nohup scrapy crawl proxy_ip & 這樣的方式來執行

2 運行方式二

咱們的爬蟲是每次爬取西刺代理前 5 頁的內容,若是咱們想隔一段重複爬取一次呢。下面咱們可使用 crontab 的定時任務的方法實現,編輯 crontab -e ,在末尾添加以下命令並保存退出。

(proxy-ip) [root@192 ~]# crontab -e

00 * * * * workon proxy-ip && cd /data/test-proxy-ip/ && nohup scrapy crawl proxy_ip & >> ~/proxy_ip.log
複製代碼

以上命令表示每一個小時的整點會執行咱們的爬蟲程序

3 運行方式三

此方法是咱們寫一個 python 腳本,在 python 腳本中來調用系統命令 scrapy crawl proxy_ip,而後使用 python 的休眠來控制程序運行。

此 Python 腳本在咱們能夠建立在項目的根目錄下,腳本名稱隨意,如 main.py 表示這是咱們項目的入口文件,腳本內容以下:

# -*- coding:utf-8 -*-

__author__ = 'jiangzhuolin'

import sys
import os
import time

while True:
    os.system("scrapy crawl proxy_ip")  # scrapy spider 的啓動方法 scrapy crawl spider_name
    print("程序開始休眠...")
    time.sleep(3600)  # 休眠一小時後繼續爬取
複製代碼

而後咱們使用以下方式運行咱們的這個 python 腳本在後臺便可:

[root@192 ~]# workon proxy-ip
(proxy-ip) [root@192 ~]# cd /data/test-proxy-ip/
(proxy-ip) [root@192 test-proxy-ip]# ls
main.py  proxy_ip  README.md  scrapy.cfg
(proxy-ip) [root@192 test-proxy-ip]# nohup python main.py &
[1] 36449
(proxy-ip) [root@192 test-proxy-ip]# nohup: ignoring input and appending output to `nohup.out'
複製代碼

5、總結

該系統使用一個簡單的示例從環境搭建到代碼編寫到部署運行的完整過程分享了一個 Python Scrapy 爬蟲的大體生產流程。之後有機會再分享更多 Python Scrapy 爬蟲的知識,包括 Scrapy 分佈式爬蟲,Scrapyd 監控等等...

6、附錄

如下是一個部署腳本,能夠實現每次更新代碼到倉庫以後,執行該腳本自動重啓項目運行。

#! /bin/bash 
# 使用環境變量生效
source /etc/profile

PROJECT_DIR="/data"
PROJECT_NAME="test-proxy-ip"
PYTHON_ENV="proxy_ip"
EXECUTE_FILE="main.py"


cd ${PROJECT_DIR}

# 拉取項目
if [ ! -d ${PROJECT_NAME} ] 
then
    git clone git@gitee.com:jzl975/${PROJECT_NAME}.git
fi

# 進入項目目錄
cd $PROJECT_NAME

# 拉取最新代碼
git pull

# 切換到虛擬環境
workon ${PYTHON_ENV}

# 中止進程
PID=`ps -ef | grep ${EXECUTE_FILE} | grep -v grep | awk '{print $2}'`
if [ $PID ]
then
`kill -9 ${PID}`
fi

# 運行入口程序 
nohup python ${EXECUTE_FILE} &
複製代碼
相關文章
相關標籤/搜索