Scrapy定時(shí)爬蟲總結(jié)&Docker/K8s部署

初識(shí)Scrapy

Scrapy是Python開發(fā)的一個(gè)快速、高層次的屏幕抓取和web抓取框架,用于抓取web站點(diǎn)并從頁面中提取結(jié)構(gòu)化的數(shù)據(jù)。Scrapy用途廣泛,可以用于數(shù)據(jù)挖掘、監(jiān)測(cè)和自動(dòng)化測(cè)試。

https://docs.scrapy.org/en/latest/


scrapy框架結(jié)構(gòu)及工作原理


scrapy框架

對(duì)于用戶來說,Spider 是最核心的組件,scrapy爬蟲開發(fā)是圍繞Spider 展開的。



圖1?Scrapy框架的組成結(jié)構(gòu)

1.當(dāng)SPIDER要爬取某URL地址的頁面時(shí),需使用該URL構(gòu)造一個(gè)Request對(duì)象,提交給ENGINE(圖1中的①)。

2.Request對(duì)象隨后進(jìn)入SCHEDULER按某種算法進(jìn)行排隊(duì),之后的某個(gè)時(shí)SCHEDULER將其出隊(duì),送往DOWNLOADER(圖1中的②③④)

3.DOWNLOADER根據(jù)Request對(duì)象中的URL地址發(fā)送一次HTTP請(qǐng)求到網(wǎng)站服務(wù)器,之后用服務(wù)器返回的HTTP響應(yīng)構(gòu)造出一個(gè)Response對(duì)象,其中包含頁面的HTML文本(圖1中的⑤)

4.Response對(duì)象最終會(huì)被遞送給SPIDER的頁面解析函數(shù)(構(gòu)造Request對(duì)象時(shí)指定)進(jìn)行處理,頁面解析函數(shù)從頁面中提取數(shù)據(jù),封裝成Item后提交給ENGINE,Item之后被送往ITEMPIPELINES進(jìn)行處理,最終可能由EXPORTER(圖1中沒有顯示)以某種數(shù)據(jù)格式寫入文件(csv,json);另一方面,頁面解析函數(shù)還從頁面中提取鏈接(URL),構(gòu)造出新的Request對(duì)象提交給ENGINE(圖1中的⑥⑦⑧)。

理解了框架中的數(shù)據(jù)流,也就理解了Scrapy爬蟲的工作原理。如果把框架中的組件比作人體的各個(gè)器官,Request和Response對(duì)象便是血液,Item則是代謝產(chǎn)物


這里具體編寫scrapy,暫時(shí)不多介紹。下面介紹關(guān)于定時(shí)的內(nèi)容

定時(shí)調(diào)度器:schedule

筆者這里選擇一個(gè)輕量級(jí)的定時(shí)任務(wù)調(diào)度的庫:schedule。他可以完成每分鐘,每小時(shí),每天,周幾,特定日期的定時(shí)任務(wù)

schedule.every(10).minutes.do(job)#每10分鐘啟動(dòng)一次任務(wù)

schedule.every().hour.do(job)#每隔1小時(shí)啟動(dòng)一次任務(wù)

schedule.every().day.at("10:30").do(job)#每天10:30執(zhí)行任務(wù)

代碼如下:每天00:00執(zhí)行scrapy crawl? spider_name

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

import schedule

import subprocess

import logging

LOG = logging.getLogger()

from projectname.settings import ON_TIME

def job():

? ? ? LOG.info('Start to scrapy crawlspider_name..?')

? ? ? subprocess.Popen('scrapy crawl spider_name',shell=True,cwd='/demo')

? ? ? LOG.info('Finished to scrapy。')

if __name__=='__main__':

? ? ? LOG.info('start to scrapy。')

? ? ? schedule.every().day.at("00:00").do(job)#每天00:00

? ? ? while True:

? ? ? ? ? ? ? ?schedule.run_pending()

Docker/k8s集群部署

這是可以選擇兩種部署方式,各有優(yōu)點(diǎn)。docker容器意味著環(huán)境隔離和可重復(fù)性。通俗點(diǎn),就是指開發(fā)人員只要為應(yīng)用創(chuàng)建一次運(yùn)行環(huán)境,然后打包成容器便可在其他機(jī)器上運(yùn)行。容器消除了開發(fā),測(cè)試,生產(chǎn)環(huán)境的不一致性。k8s即是容器調(diào)度編排產(chǎn)品。https://docs.docker.com/

一、創(chuàng)建鏡像

1、拉取基礎(chǔ)鏡像

docker pull python:3.7.0

docker images 查看鏡像

2、創(chuàng)建dockerfile。Dockerfile是一個(gè)包含用于組合映像的命令的文本文檔??梢允褂迷诿钚兄姓{(diào)用任何命令。 Docker通過讀取Dockerfile中的指令自動(dòng)生成映像

FROM??python:3.7.0? #指定基礎(chǔ)鏡像

RUN? pip?install?/wheels/schedule-0.6.0-py2.py3-none-any.whl?&&

? ? ? ? ? pip?install?/wheels/Scrapy-1.6.0-py2.py3-none-any.whl? ?#運(yùn)行命令,即pip安裝依賴包

COPY? spider_name / spider_name / #復(fù)制

EXPOSE?8000? # 指定于外界交互的端口

CMD?["/usr/local/bin/python","/ spider_name?/sche_work.py"] #? 在容器啟動(dòng)時(shí)才進(jìn)行調(diào)用。

3、根據(jù)dockerfile 構(gòu)建鏡像,在dockerfile路徑下運(yùn)行,也可以在其他路徑使用-f?

docker?build?-t??xxscrapy:v1.0?.

docker images?

docker inspect images_id

4.根據(jù)鏡像,創(chuàng)建容器

docker?run?-it?-d?--name?xxscrapy?-v?/root/scrapy/ spider_name?/:/ spider_name?/???-p?2888:8000???xxscrapy:v1.0

-d???---------??????指定容器運(yùn)行于前臺(tái)還是后臺(tái),默認(rèn)為false

-v???---------??????給容器掛載存儲(chǔ)卷,掛載到容器的某個(gè)目錄

-p???---------??????指定容器暴露的端口

-env?---------??????設(shè)置環(huán)境變量

-n --------------? 容器名稱

xxscrapy:v1.0? ?即我們之前構(gòu)建的鏡像

5.查看狀態(tài)

docker ps? 查看正常的容器

docker ps -a 查看其他容器

docker inspect container_id? 查看該容器的配置文件?

docker ps


歡迎各位大神交流,交流QQ群:688933850

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容