[Docker]Docker部署Scrapy-redis分布式爬蟲框架實(shí)踐(整合Selenium+Headless Chrome網(wǎng)頁(yè)渲染)

前言

我的京東價(jià)格監(jiān)控網(wǎng)站需要不間斷爬取京東商品頁(yè)面雕擂,爬蟲模塊我采用了Scrapy+selenium+Headless Chrome的方式進(jìn)行商品信息的采集偏序。

由于最近爬蟲用的服務(wù)器到期,需要換到新服務(wù)器重新部署了赵,所以干脆把整個(gè)模塊封裝入Docker问拘,以便后續(xù)能夠方便快速的進(jìn)行爬蟲的部署。同時(shí)冯勉,由于我的Scrapy整合了redis,能夠支持分布式爬取摹芙,Docker化后也更方便進(jìn)行分布式的拓展灼狰。

任務(wù)需求

  • 將爬蟲代碼打包為Docker鏡像
  • 在全新的服務(wù)器上安裝Docker
  • 使用單獨(dú)的Redis容器作為爬取url隊(duì)列(也就是Scrapy-redis中redis的主要用處)
  • 所有新開的爬蟲容器連接Redis容器

步驟

打包爬蟲代碼

Scrapy內(nèi)置的crawler不支持頁(yè)面渲染的方式進(jìn)行頁(yè)面渲染,需要使用scrapy-splash或者selenium作為中間件浮禾,才能夠支持頁(yè)面渲染爬取交胚。我在代碼中整合了selenium,并在系統(tǒng)中安裝了chrome盈电,這在docker中蝴簇,需要在打包時(shí)將chrome安裝至鏡像中。

Dockerfile文件中匆帚,將chrome下載并安裝至鏡像熬词,并且將chromedriver放入系統(tǒng),保證selenium代碼能夠調(diào)用到chrome吸重。

我參考了開源庫(kù):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避免吧沒用的文件打包進(jìn)鏡像嚎幸。

我打包的代碼結(jié)構(gòu)圖如下:

在這里插入圖片描述

使用命令颜矿,生成鏡像:

 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,大的嚇人嫉晶。

運(yùn)行redis容器

鏡像打包好之后骑疆,別急著運(yùn)行,因?yàn)樾路?wù)器上替废,Redis還沒有呢箍铭。

原則上來說,你可以使用docker-compose椎镣,把redis和爬蟲代碼兩個(gè)鏡像同時(shí)運(yùn)行起來诈火。

我這里,我將redis開啟單獨(dú)的鏡像衣陶,一是為了方便其它模塊使用redis柄瑰,二是方便以后開更多的scrapy進(jìn)行分布式爬取闸氮。

使用官方的redis鏡像開啟redis容器,并將redis端口映射到宿主機(jī)6379:

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

官方的redis設(shè)置中默認(rèn)就是0.0.0.0教沾,不用擔(dān)心宿主機(jī)無法訪問蒲跨。

連接爬蟲容器和redis容器

接下來可以運(yùn)行爬蟲容器,需要注意的是授翻,連接兩個(gè)容器或悲,需要使用link。

首先找到redis容器的ID堪唐,或者你給他自定義的名字

在這里插入圖片描述

接著運(yùn)行并連接容器:

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

出現(xiàn)問題:Docker 使用--link出現(xiàn)Cannot link to /xxx, as it does not belong to xxxxx異常

這個(gè)異常的原因是redis在一個(gè)特殊的網(wǎng)絡(luò)里巡语,你需要用:

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

來查看redis容器所在的網(wǎng)段。

同時(shí)還可以看看

docker network ls
在這里插入圖片描述

之后你就需要類似這樣的語句(多指定--net來定下容器所在網(wǎng)絡(luò)):

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
http://www.reibang.com/p/21d66ca6115e

跑代碼

一切就緒淮菠,發(fā)現(xiàn)爬蟲沒法運(yùn)行男公,使用docker logs 容器ID查看log。發(fā)現(xiàn)問題

出現(xiàn)問題:headless chrome:DevToolsActivePort file doesn't exist while trying to initiate Chrome Browser

這個(gè)問題參考下面的網(wǎng)址合陵,這里直接給出解決方案枢赔,在你的代碼里加一行參數(shù):

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

這是我的代碼截圖:

在這里插入圖片描述

參考:

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

對(duì)該容器的日常維護(hù)

平日里可以使用docker exec -it 21323a52d19f /bin/bash進(jìn)入正在運(yùn)行容器的bash,查看下爬蟲狀態(tài)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拥知,一起剝皮案震驚了整個(gè)濱河市踏拜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌低剔,老刑警劉巖速梗,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異襟齿,居然都是意外死亡姻锁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蕊唐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屋摔,“玉大人烁设,你說我怎么就攤上這事替梨。” “怎么了装黑?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵副瀑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我恋谭,道長(zhǎng)糠睡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任疚颊,我火速辦了婚禮狈孔,結(jié)果婚禮上信认,老公的妹妹穿的比我還像新娘。我一直安慰自己均抽,他們只是感情好嫁赏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著油挥,像睡著了一般潦蝇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上深寥,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天攘乒,我揣著相機(jī)與錄音,去河邊找鬼惋鹅。 笑死则酝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闰集。 我是一名探鬼主播堤魁,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼返十!你這毒婦竟也來了妥泉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤洞坑,失蹤者是張志新(化名)和其女友劉穎盲链,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迟杂,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刽沾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了排拷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侧漓。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖监氢,靈堂內(nèi)的尸體忽然破棺而出布蔗,到底是詐尸還是另有隱情,我是刑警寧澤浪腐,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布纵揍,位于F島的核電站,受9級(jí)特大地震影響议街,放射性物質(zhì)發(fā)生泄漏泽谨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吧雹。 院中可真熱鬧骨杂,春花似錦、人聲如沸雄卷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龙亲。三九已至陕凹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳄炉,已是汗流浹背杜耙。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拂盯,地道東北人佑女。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谈竿,于是被迫代替她去往敵國(guó)和親团驱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容