摘要:海量數(shù)據(jù)從哪兒來?世上本無所謂大數(shù)據(jù)的,爬的多了,自然就有數(shù)據(jù)了。 為什么使用docker? 這兩年網(wǎng)上關(guān)于docker的討論不亞于當年的云計算,現(xiàn)在云計算已經(jīng)落地生根了。
海量數(shù)據(jù)從哪兒來?世上本無所謂大數(shù)據(jù)的,爬的多了,自然就有數(shù)據(jù)了。
為什么使用docker?
這兩年網(wǎng)上關(guān)于docker的討論不亞于當年的云計算,現(xiàn)在云計算已經(jīng)落地生根了。云時代docker被寄予厚望現(xiàn)在也是火的一塌糊涂。
作為一名開發(fā)人員,你是否還在因為環(huán)境搭不成功而沮喪?你是否經(jīng)常對于復(fù)雜的安裝步驟感到反感,因而對新技術(shù)望而卻步?
作為一名運維人員,你是否經(jīng)常因為不同操作系統(tǒng)的原因?qū)е虏渴鹗。?/p>
那么docker就是為了解決這些痛點而生的。docker不是什么新技術(shù),類似docker的東西早已有之,只不過docker用起來更爽,你真的應(yīng)該試一試,就像指紋解鎖一樣。用了你就回不去了。
為什么是無頭瀏覽器?
現(xiàn)在許多網(wǎng)站有反爬蟲功能。我們要做的就是盡量把我們的請求偽裝成是真正的瀏覽器發(fā)出的一樣。最好就直接用瀏覽器來發(fā)送請求,比如使用WebDriver驅(qū)動瀏覽器模擬真人操作。但是這樣速度太慢,再說服務(wù)器的linux一般都是server版的,根本沒有桌面,因此也沒有瀏覽器可用。所以我們就使用無頭(headless)瀏覽器。功能跟真的瀏覽器一樣,速度更快,只不過沒有界面罷了。
1.虛擬機安裝ubunt16.04。(略)
2.安裝docker。ubuntu14以上自帶docker,直接安裝即可
ubt1606@ubt1606-virtual-machine:~$docker
The program 'docker' is currently not installed. You can install it by typing:
sudo apt install docker.io
ubt1606@ubt1606-virtual-machine:~$sudo apt install docker.io
ubt1606@ubt1606-virtual-machine:~$docker images
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
ubuntu里需要在docker命令前面加sudo,否則會報上述信息。
ubt1606@ubt1606-virtual-machine:~$sudo docker images
REPOSITORY ? ? ? ? ?TAG ? ? ? ? ? ? ? ? IMAGE ID ? ? ? ? ? ?CREATED ? ? ? ? ? ? SIZE
如果嫌每次輸入docker命令都要加sudo麻煩,可以把當前用戶加入docker用戶組。具體參考這篇文章
3.拉docker鏡像
直接訪問docker hub比較慢。通過daocloud來訪問稍微快一些。 在虛擬機瀏覽器里打開?http://www.daocloud.io/。 然后注冊用戶或者直接用微信掃二維碼登錄。登錄后點擊“鏡像倉庫”。點擊“DockerHub鏡像”。 從這里可以打開docker官方的鏡像倉庫,然后在里面搜索你要的鏡像即可。
搜索python+selenium。其中有一個是這樣的“Container with python selenium for lazy people (like me) to avoid configuration xvfb on server.”。這正是我們要的。
這是這個地址https://hub.docker.com/r/pimuzzo/selenium-python-xvfb/
該作者還貼心的給了一個小demo。后面我們會用到。
ubt1606@ubt1606-virtual-machine:~$sudo docker pull pimuzzo/selenium-python
Using default tag: latest
Pulling repository docker.io/pimuzzo/selenium-python
Network timed out while trying to connect to https://index.docker.io/v1/repositories/pimuzzo/selenium-python/images. You may want to check your internet connection or if you are behind a proxy.
會發(fā)現(xiàn)拉不下來,使用daocloud的加速器。注冊賬號登錄后,點擊使用加速器,會給你一個專屬鏈接。 類似這樣
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://c4c833cb.m.daocloud.io
ubt1606@ubt1606-virtual-machine:~$sudo su
[sudo] password for ubt1606:
root@ubt1606-virtual-machine:/home/ubt1606#echo "DOCKER_OPTS=\"$DOCKER_OPTS --registry-mirror=http://c4c833cb.m.daocloud.io\"" >> /etc/default/docker
root@ubt1606-virtual-machine:/home/ubt1606#vi /etc/default/docker
查看一下/etc/default/docker文件里的確有了DOCKER_OPTS,小白溫馨提示,退出vi的方法是。按一下ESC,然后輸入:q
root@ubt1606-virtual-machine:/home/ubt1606#service docker restart
一定要重啟docker服務(wù)。注意剛才我切換到su用戶了,所以前面都沒有加sudo
注意這次我換成了 index.docker.io/pimuzzo/selenium-python-xvfb。這也是daocloud頁面上的。我就試了一下,這次很快就成功了。
root@ubt1606-virtual-machine:/home/ubt1606#docker pull index.docker.io/pimuzzo/selenium-python-xvfb
Using default tag: latest
latest: Pulling from pimuzzo/selenium-python-xvfb
759d6771041e: Already exists
8836b825667b: Already exists
c2f5e51744e6: Already exists
a3ed95caeb02: Already exists
21fb0716901c: Already exists
9cc47e6dfb6f: Pull complete
08c1371dc842: Pull complete
0aa04c2152b2: Pull complete
db151fc54aee: Pull complete
3f0af4107074: Pull complete
00d9524b72cc: Pull complete
3ba8b369c5ab: Pull complete
aad0e22b9317: Pull complete
Digest: sha256:73b4aca6ecfc2a5bf392065cd07cf7fc89e5da61104492e7c04332f2bfd8da4d
Status: Downloaded newer image for pimuzzo/selenium-python-xvfb:latest
root@ubt1606-virtual-machine:/home/ubt1606#docker images
REPOSITORY ? ? ? ? ? ? ? ? ? ? TAG ? ? ? ? ? ? ? ? IMAGE ID ? ? ? ? ? ?CREATED ? ? ? ? ? ? SIZE
pimuzzo/selenium-python-xvfb ? latest ? ? ? ? ? ? ?18dba38c825a ? ? ? ?5 months ago ? ? ? ?615.4 MB
root@ubt1606-virtual-machine:/home/ubt1606#
docker images看到類似上述信息就表示鏡像拉取成功。注意看SIZE的大小。如果網(wǎng)速不好很可能會失敗。失敗的話只能多試幾次了。再不行就看看有沒有其他鏡像源,實在不行就用open connect 吧(需要買vps)。也可以從別人那兒拷貝一個鏡像文件然后導(dǎo)入到docker里。不管你用什么辦法,只要能方便快速地把鏡像弄到docker里就行了。
====================================================================
到這一步環(huán)境上基本就OK了。如果不是拉取鏡像這一步有點小曲折,操作還是非常簡單的,簡單到令人發(fā)指。 要知道拉取一個鏡像容易,制作一個鏡像可不容易,真的很麻煩的。 一個docker image能為我們節(jié)省多少時間啊。這個鏡像不光可以在開發(fā)的時候用,開發(fā)完了之后也是可以直接部署的。一舉兩得啊。 只有一點,就是開發(fā)的時候不太好debug。所以做點小開發(fā)或者僅僅是測試某個特定的環(huán)境,或者嘗試新技術(shù),用docker實在是太方便了。
4.編寫第一個小demo
直接使用docker鏡像上給的demo。把網(wǎng)址換成baidu。
在/home/ubt1606/demo下建立demo.py文件。 注意ubt1606是用戶名
#!/usr/bin/env python
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(800, 600))
display.start()
# now Firefox will run in a virtual display.
# you will not see the browser.
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
print browser.title
browser.quit()
display.stop()
5.啟動容器并映射數(shù)據(jù)卷
docker run -ti -v /home/ubt1606/demo:/home/somethingpimuzzo/selenium_python_xvfb python /home/something/demo.py
docker run:啟動一個容器
-ti: ? ? ? 也可以寫成 -i -t,表示申請一個控制臺同容器交互。it分別是interact,terminal的首字母
-v /home/ubt1606/demo:/home/something:-v表示映射數(shù)據(jù)卷。將主機的/home/ubt1606/demo文件夾映射到docker里的
/home/something文件夾。就像windows和VMWare共享文件夾一樣。
pimuzzo/selenium_python_xvfb:鏡像的名字,表示給哪個鏡像創(chuàng)建容器。鏡像是死的,只有容器才是活的。鏡像相當于一個
windows.iso文件。而容器相當于已經(jīng)啟動起來的windows。
python /home/something/demo.py:運行docker里/home/something文件夾下的demo.py文件。注意路徑是docker里的路徑。
可以是其它路徑。 比如先把一個demo2.py放在/home/ubt1606/demo文件下,然后進入到docker里。在docker里將demo2.py從
/home/something下拷貝到/home/other文件夾下,然后命令換成python /home/other/demo2.py即可。一定要理解“docker里”,“docker里的路徑”這個東西。為了不給自己找麻煩,建議就別拷貝到別處了。
小結(jié)一下:
當我回頭看這篇文章時才發(fā)現(xiàn)其實就三步:
拉取一個docker鏡像。
寫一個demo.py文件并把這個文件映射到docker里。
啟動容器運行demo.py文件。
爬蟲的編寫其實就是用python版的webdriver來編寫程序。只不過這里沒有使用瀏覽器,而是pyvirtualdisplay。
本來webdriver和selenium都是獨立的,現(xiàn)在整合到一塊都叫selenium了。selenium官方宣稱是用來做自動化測試的。
不過我看目前用的最多的還是webdriver。就是用它來寫爬蟲。本文只是拋磚引玉,至于webdriver api的使用比較簡單,搞JavaEE的上手非???,這里就不詳細介紹了。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,本社區(qū)不擁有所有權(quán),也不承擔相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,歡迎發(fā)送郵件至:yqgroup@service.aliyun.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。