初識(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)及工作原理

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

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? 查看該容器的配置文件?

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