前言

我的京东价格监控网站需要不间断爬取京东商品页面,爬虫模块我采用了Scrapy+selenium+Headless Chrome的方式进行商品信息的采集。

由于最近爬虫用的服务器到期,需要换到新服务器重新部署,所以干脆把整个模块封装入Docker,以便后续能够方便快速的进行爬虫的部署。同时,由于我的Scrapy整合了redis,能够支持分布式爬取,Docker化后也更方便进行分布式的拓展。

任务需求

  • 将爬虫代码打包为Docker镜像
  • 在全新的服务器上安装Docker
  • 使用单独的Redis容器作为爬取url队列(也就是Scrapy-redis中redis的主要用处)
  • 所有新开的爬虫容器连接Redis容器

步骤

打包爬虫代码

Scrapy内置的crawler不支持页面渲染的方式进行页面渲染,需要使用scrapy-splash或者selenium作为中间件,才能够支持页面渲染爬取。我在代码中整合了selenium,并在系统中安装了chrome,这在docker中,需要在打包时将chrome安装至镜像中。

Dockerfile文件中,将chrome下载并安装至镜像,并且将chromedriver放入系统,保证selenium代码能够调用到chrome。

我参考了开源库:https://github.com/joyzoursky/docker-python-chromedriver

最后完成的Dockerfile文件:

FROM python:3.6

# install google chrome
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable # install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ # set display port to avoid crash
ENV DISPLAY=:99 # copy pm_scrapy
WORKDIR /usr/src/app
COPY . . # install requirements
RUN pip install -r requirements.txt CMD scrapy crawl JDcate

写完Docker文件,在打包前,最好还要加上.dockerignore避免吧没用的文件打包进镜像。

我打包的代码结构图如下:

使用命令,生成镜像:

 sudo docker image build -t pm_scrapy .
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
pm_scrapy latest 082e7e350831 47 hours ago 1.41 GB
proxy_pool latest 83a95913162b 6 days ago 1.01 GB
python 3.6 749d36d00e00 10 days ago 921 MB
redis latest 5d2989ac9711 10 days ago 95 MB

1.41G,大的吓人。

运行redis容器

镜像打包好之后,别急着运行,因为新服务器上,Redis还没有呢。

原则上来说,你可以使用docker-compose,把redis和爬虫代码两个镜像同时运行起来。

我这里,我将redis开启单独的镜像,一是为了方便其它模块使用redis,二是方便以后开更多的scrapy进行分布式爬取。

使用官方的redis镜像开启redis容器,并将redis端口映射到宿主机6379:

docker run -p 6379:6379  -d redis --requirepass "密码"

官方的redis设置中默认就是0.0.0.0,不用担心宿主机无法访问。

连接爬虫容器和redis容器

接下来可以运行爬虫容器,需要注意的是,连接两个容器,需要使用link。

首先找到redis容器的ID,或者你给他自定义的名字

接着运行并连接容器:

sudo docker container run -itd --link 00c2655515fb:redis pm_scrapy

出现问题:Docker 使用--link出现Cannot link to /xxx, as it does not belong to xxxxx异常

这个异常的原因是redis在一个特殊的网络里,你需要用:

docker inspect [需要link的容器名称或ID]

来查看redis容器所在的网段。

同时还可以看看

docker network ls

之后你就需要类似这样的语句(多指定--net来定下容器所在网络):

docker run -d --name movie_project -p 9090:80 --link 容器名:别名 --net link_continer_network -v /root/project/movie_project:/app:Z python2/nginx/flask

参考:

https://blog.csdn.net/hanchaobiao/article/details/81911587

https://www.jianshu.com/p/21d66ca6115e

跑代码

一切就绪,发现爬虫没法运行,使用docker logs 容器ID查看log。发现问题

出现问题:headless chrome:DevToolsActivePort file doesn't exist while trying to initiate Chrome Browser

这个问题参考下面的网址,这里直接给出解决方案,在你的代码里加一行参数:

chrome_options.add_argument('--disable-dev-shm-usage')

这是我的代码截图:

参考:

https://stackoverflow.com/questions/50642308/org-openqa-selenium-webdriverexception-unknown-error-devtoolsactiveport-file-d/50642913#50642913

对该容器的日常维护

平日里可以使用docker exec -it 21323a52d19f /bin/bash进入正在运行容器的bash,查看下爬虫状态

关注我

本人目前为后台开发工程师,主要关注Python爬虫,后台开发等相关技术。

原创博客主要内容:

  • 笔试面试复习知识点手册
  • Leetcode算法题解析(前150题)
  • 剑指offer算法题解析
  • Python爬虫相关实战
  • 后台开发相关实战

同步更新以下几大博客:

  • Csdn:

http://blog.csdn.net/qqxx6661

拥有专栏:Leetcode题解(Java/Python)、Python爬虫开发

  • 知乎:

https://www.zhihu.com/people/yang-zhen-dong-1/

拥有专栏:码农面试助攻手册

  • 掘金:

https://juejin.im/user/2119514149109095

  • 简书:

https://www.jianshu.com/u/b5f225ca2376

  • 个人公众号:Rude3Knife

Docker部署Scrapy-redis分布式爬虫框架(整合Selenium+Headless Chrome网页渲染)的更多相关文章

  1. Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合

    简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...

  2. 基于redis的简易分布式爬虫框架

    代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...

  3. 分布式爬虫框架XXL-CRAWLER

    <分布式爬虫框架XXL-CRAWLER> 一.简介 1.1 概述 XXL-CRAWLER 是一个分布式爬虫框架.一行代码开发一个分布式爬虫,拥有"多线程.异步.IP动态代理.分布 ...

  4. Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)

    Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...

  5. 爬虫(三)通过Selenium + Headless Chrome爬取动态网页

    一.Selenium Selenium是一个用于Web应用程序测试的工具,它可以在各种浏览器中运行,包括Chrome,Safari,Firefox 等主流界面式浏览器. 我们可以直接用pip inst ...

  6. 16 Scrapy之分布式爬虫

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  7. scrapy简单分布式爬虫

    经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...

  8. scrapy补充-分布式爬虫

    spiders 介绍:在项目中是创建爬虫程序的py文件 #1.Spiders是由一系列类(定义了一个网址或一组网址将被爬取)组成,具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. #2.换句 ...

  9. 介绍一款能取代 Scrapy 的 Python 爬虫框架 - feapder

    1. 前言 大家好,我是安果! 众所周知,Python 最流行的爬虫框架是 Scrapy,它主要用于爬取网站结构性数据 今天推荐一款更加简单.轻量级,且功能强大的爬虫框架:feapder 项目地址: ...

  10. scrapy进行分布式爬虫

    今天,参照崔庆才老师的爬虫实战课程,实践了一下分布式爬虫,并没有之前想象的那么神秘,其实非常的简单,相信你看过这篇文章后,不出一小时,便可以动手完成一个分布式爬虫! 1.分布式爬虫原理 首先我们来看一 ...

随机推荐

  1. YOLACT++ : 实时实例分割,从29.8mAP/33.5fps到34.1mAP/33.5fps

    YOLACT是首个实时实例分割算法,但是准确率较SOTA差得有点多,YOLACT++从主干网络.分支和anchor的3个角度出发对YOLACT进行优化,在保持实时性的前提下提升了5map,论文改进的角 ...

  2. kingbaseES 优化之操作系统瓶颈排查

    针对操作系统性能瓶颈的判断和排查是数据库优化工作的一项重要技能,尤其是针对实例整体优化 操作系统的性能瓶颈排查无外乎四个方面 CPU.内存.磁盘.网络 针对这四个方面整理了一些相关心得和大家分享. 在 ...

  3. 线上问题分析之java dump文件生成

    一.查看java进程 jps or ps aux | grep java 二.生成dump文件 jmap -dump:live,format=b,file=xxxx.bin 进程ID 三.查看dump ...

  4. #Tarjan#洛谷 1407 [国家集训队]稳定婚姻

    题目 分析 如果婚姻安全那么两个点不在同一个强连通分量, 考虑强制定方向,夫妻女向男连边,情侣男向女连边, 这样就直接用Tarjan有向图缩点就可以了 代码 #include <iostream ...

  5. 许北林:我为什么加入OpenHarmony生态?又为什么要做“启航KP”开发套件?

    许北林 软通动力 资深项目经理 在全球开源趋势下,中国正逐渐成为全球开源软件的主要使用者和核心贡献者.今天我们来认识一位接触 OpenHarmony 不到一年,便带领团队成功开发出一款"启航 ...

  6. SpringBoot2.x<<深入浅出>>

    书籍推荐 书名:深入浅出Spring Boot 2.x 作者:杨开振 出版社:人民邮电出版社 demo: https://gitee.com/threenut/spring-boot 讲的很细致, 把 ...

  7. Copy 进阶用法

    Copy 进阶用法 本文出处:https://www.modb.pro/db/239809 copy 是最基础的导入导出命令,那么它有什么其他用法可以帮助我们更好地进行导入导出的工作呢? 关于导入方式 ...

  8. HarmonyOS Codelab样例—弹窗基本使用

    一.介绍 本篇 Codelab 主要基于 dialog 和 button 组件,实现弹窗的几种自定义效果,具体效果有: 1.  警告弹窗,点击确认按钮弹窗关闭. 2.  确认弹窗,点击取消按钮或确认按 ...

  9. 结构化数据上的 TopN 运算

    1.     最大值 / 最小值 最大值 / 最小值可以理解为 TopN 查询中,N 等于 1 时的情况,因为很常用所以单独拿出来讲一下.取最大值 / 最小值是很常见的需求,例如一班数学最高分是多少, ...

  10. ActiveMQ c# 系列——实例(二)

    前言 前面一章中介绍了activemq,并且呢安装了. 这一章就来看一下实例吧. 正文 我使用队列举例. 是这样子,队列是一对一的关系,比如说我生产了一条消息,那么只要有一个消费者消费完毕那么就算消费 ...