docker+python無頭瀏覽器爬蟲

摘要: 海量數據從哪兒來?世上本無所謂大數據的,爬的多了,天然就有數據了。 爲何使用docker? 這兩年網上關於docker的討論不亞於當年的雲計算,如今雲計算已經落地生根了。html

海量數據從哪兒來?世上本無所謂大數據的,爬的多了,天然就有數據了。python

 

爲何使用docker?linux

這兩年網上關於docker的討論不亞於當年的雲計算,如今雲計算已經落地生根了。雲時代docker被寄予厚望如今也是火的一塌糊塗。web

做爲一名開發人員,你是否還在由於環境搭不成功而沮喪?你是否常常對於複雜的安裝步驟感到反感,於是對新技術望而卻步?docker

做爲一名運維人員,你是否常常由於不一樣操做系統的緣由致使部署失敗?ubuntu

那麼docker就是爲了解決這些痛點而生的。docker不是什麼新技術,相似docker的東西早已有之,只不過docker用起來更爽,你真的應該試一試,就像指紋解鎖同樣。用了你就回不去了。windows

爲何是無頭瀏覽器?api

如今許多網站有反爬蟲功能。咱們要作的就是儘可能把咱們的請求假裝成是真正的瀏覽器發出的同樣。最好就直接用瀏覽器來發送請求,好比使用WebDriver驅動瀏覽器模擬真人操做。可是這樣速度太慢,再說服務器的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.

會發現拉不下來,使用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服務。注意剛纔我切換到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的大小。若是網速很差極可能會失敗。失敗的話只能多試幾回了。再不行就看看有沒有其餘鏡像源,實在不行就用open connect 吧(須要買vps)。也能夠從別人那兒拷貝一個鏡像文件而後導入到docker裏。無論你用什麼辦法,只要能方便快速地把鏡像弄到docker裏就好了。

====================================================================

到這一步環境上基本就OK了。若是不是拉取鏡像這一步有點小曲折,操做仍是很是簡單的,簡單到使人髮指。 要知道拉取一個鏡像容易,製做一個鏡像可不容易,真的很麻煩的。 一個docker image能爲咱們節省多少時間啊。這個鏡像不光能夠在開發的時候用,開發完了以後也是能夠直接部署的。一箭雙鵰啊。 只有一點,就是開發的時候不太好debug。因此作點小開發或者僅僅是測試某個特定的環境,或者嘗試新技術,用docker實在是太方便了。

4.編寫第一個小demo

直接使用docker鏡像上給的demo。把網址換成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.啓動容器並映射數據卷

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表示映射數據卷。將主機的/home/ubt1606/demo文件夾映射到docker裏的

/home/something文件夾。就像windows和VMWare共享文件夾同樣。

pimuzzo/selenium_python_xvfb:鏡像的名字,表示給哪一個鏡像建立容器。鏡像是死的,只有容器纔是活的。鏡像至關於一個

windows.iso文件。而容器至關於已經啓動起來的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裏的路徑」這個東西。爲了避免給本身找麻煩,建議就別拷貝到別處了。

 

小結一下:

當我回頭看這篇文章時才發現其實就三步:

拉取一個docker鏡像。

寫一個demo.py文件並把這個文件映射到docker裏。

啓動容器運行demo.py文件。

 

爬蟲的編寫其實就是用python版的webdriver來編寫程序。只不過這裏沒有使用瀏覽器,而是pyvirtualdisplay。

原本webdriver和selenium都是獨立的,如今整合到一塊都叫selenium了。selenium官方宣稱是用來作自動化測試的。

不過我看目前用的最多的仍是webdriver。就是用它來寫爬蟲。本文只是拋磚引玉,至於webdriver api的使用比較簡單,搞JavaEE的上手很是快,這裏就不詳細介紹了。

 

版權聲明:本文內容由互聯網用戶自發貢獻,本社區不擁有全部權,也不承擔相關法律責任。若是您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: yqgroup@service.aliyun.com 進行舉報,並提供相關證據,一經查實,本社區將馬上刪除涉嫌侵權內容。
相關文章
相關標籤/搜索