docker+python無頭瀏覽器爬蟲


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

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

 

為什么使用docker?

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

作為一名開發人員,你是否還在因為環境搭不成功而沮喪?你是否經常對於復雜的安裝步驟感到反感,因而對新技術望而卻步?

作為一名運維人員,你是否經常因為不同操作系統的原因導致部署失敗?

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

為什么是無頭瀏覽器?

現在許多網站有反爬蟲功能。我們要做的就是盡量把我們的請求偽裝成是真正的瀏覽器發出的一樣。最好就直接用瀏覽器來發送請求,比如使用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 進行舉報,並提供相關證據,一經查實,本社區將立刻刪除涉嫌侵權內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM