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 进行举报,并提供相关证据,一经查实,本社区将马上删除涉嫌侵权内容。
相关文章
相关标签/搜索