初识Scrapy
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
https://docs.scrapy.org/en/latest/
scrapy框架结构及工作原理
对于用户来说,Spider 是最核心的组件,scrapy爬虫开发是围绕Spider 展开的。
1.当SPIDER要爬取某URL地址的页面时,需使用该URL构造一个Request对象,提交给ENGINE(图1中的①)。
2.Request对象随后进入SCHEDULER按某种算法进行排队,之后的某个时SCHEDULER将其出队,送往DOWNLOADER(图1中的②③④)
3.DOWNLOADER根据Request对象中的URL地址发送一次HTTP请求到网站服务器,之后用服务器返回的HTTP响应构造出一个Response对象,其中包含页面的HTML文本(图1中的⑤)
4.Response对象最终会被递送给SPIDER的页面解析函数(构造Request对象时指定)进行处理,页面解析函数从页面中提取数据,封装成Item后提交给ENGINE,Item之后被送往ITEMPIPELINES进行处理,最终可能由EXPORTER(图1中没有显示)以某种数据格式写入文件(csv,json);另一方面,页面解析函数还从页面中提取链接(URL),构造出新的Request对象提交给ENGINE(图1中的⑥⑦⑧)。
理解了框架中的数据流,也就理解了Scrapy爬虫的工作原理。如果把框架中的组件比作人体的各个器官,Request和Response对象便是血液,Item则是代谢产物
这里具体编写scrapy,暂时不多介绍。下面介绍关于定时的内容
定时调度器:schedule
笔者这里选择一个轻量级的定时任务调度的库:schedule。他可以完成每分钟,每小时,每天,周几,特定日期的定时任务
schedule.every(10).minutes.do(job)#每10分钟启动一次任务
schedule.every().hour.do(job)#每隔1小时启动一次任务
schedule.every().day.at("10:30").do(job)#每天10:30执行任务
代码如下:每天00:00执行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集群部署
这是可以选择两种部署方式,各有优点。docker容器意味着环境隔离和可重复性。通俗点,就是指开发人员只要为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。容器消除了开发,测试,生产环境的不一致性。k8s即是容器调度编排产品。https://docs.docker.com/
一、创建镜像
1、拉取基础镜像
docker pull python:3.7.0
docker images 查看镜像
2、创建dockerfile。Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像
FROM python:3.7.0 #指定基础镜像
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 #运行命令,即pip安装依赖包
COPY spider_name / spider_name / #复制
EXPOSE 8000 # 指定于外界交互的端口
CMD ["/usr/local/bin/python","/ spider_name /sche_work.py"] # 在容器启动时才进行调用。
3、根据dockerfile 构建镜像,在dockerfile路径下运行,也可以在其他路径使用-f
docker build -t xxscrapy:v1.0 .
docker images
docker inspect images_id
4.根据镜像,创建容器
docker run -it -d --name xxscrapy -v /root/scrapy/ spider_name /:/ spider_name / -p 2888:8000 xxscrapy:v1.0
-d --------- 指定容器运行于前台还是后台,默认为false
-v --------- 给容器挂载存储卷,挂载到容器的某个目录
-p --------- 指定容器暴露的端口
-env --------- 设置环境变量
-n -------------- 容器名称
xxscrapy:v1.0 即我们之前构建的镜像
5.查看状态
docker ps 查看正常的容器
docker ps -a 查看其他容器
docker inspect container_id 查看该容器的配置文件
欢迎各位大神交流,交流QQ群:688933850