linux selenium_[Docker]Docker部署Scrapy-redis分布式爬虫框架实践(整合Selenium)

v2-1a78dea9ab9623753a2fe5fd254c1eca_1440w.jpg?source=172ae18b

前言

我的京东价格监控网站需要不间断爬取京东商品页面,爬虫模块我采用了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文件:

 1FROM python:3.6
 2
 3# install google chrome
 4RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
 5RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
 6RUN apt-get -y update
 7RUN apt-get install -y google-chrome-stable
 8
 9# install chromedriver
10RUN apt-get install -yqq unzip
11RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
12RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
13
14# set display port to avoid crash
15ENV DISPLAY=:99
16
17# copy pm_scrapy
18WORKDIR /usr/src/app
19COPY . .
20
21# install requirements
22RUN pip install -r requirements.txt
23
24CMD scrapy crawl JDcate

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

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

v2-8b1bba76c6d79477bea7ecc099c98762_b.jpg

使用命令,生成镜像:

1 sudo docker image build -t pm_scrapy .   

1REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
2pm_scrapy           latest              082e7e350831        47 hours ago        1.41 GB
3proxy_pool          latest              83a95913162b        6 days ago          1.01 GB
4python              3.6                 749d36d00e00        10 days ago         921 MB
5redis               latest              5d2989ac9711        10 days ago         95 MB

1.41G,大的吓人。

运行redis容器

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

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

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

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

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

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

连接爬虫容器和redis容器

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

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

v2-ac2b5f8dd4838d4e43d7b6f816b5c2ff_b.png

接着运行并连接容器:

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

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

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

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

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

同时还可以看看

1docker network ls

v2-c0bb477dd2a03ba0ff96c259ba45f358_b.jpg

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

1docker 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/hanchaobi ao/article/details/81911587 https://www. jianshu.com/p/21d66ca61 15e

跑代码

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

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

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

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

这是我的代码截图:

v2-32aaa601ce0b4390a0803d05e30f91d0_b.jpg

参考:

https:// stackoverflow.com/quest ions/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/5b48015ce51d45191462ba55

  • 简书:

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

  • 个人公众号:Rude3Knife

v2-4b602341407f7be00d8313302641f6f3_b.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值