docker+python无头浏览器爬虫
海量数据从哪儿来?世上本无所谓大数据的,爬的多了,自然就有数据了。
[size=18px; box-sizing: border-box;]为什么使用docker?[/size]
[size=18px; box-sizing: border-box;]作为一名开发人员,你是否还在因为环境搭不成功而沮丧?你是否经常对于复杂的安装步骤感到反感,因而对新技术望而却步?[/size]
[size=18px; box-sizing: border-box;]那么docker就是为了解决这些痛点而生的。docker不是什么新技术,类似docker的东西早已有之,只不过docker用起来更爽,你真的应该试一试,就像指纹解锁一样。用了你就回不去了。[/size]
[size=18px; box-sizing: border-box;]现在许多网站有反爬虫功能。我们要做的就是尽量把我们的请求伪装成是真正的浏览器发出的一样。最好就直接用浏览器来发送请求,比如使用WebDriver驱动浏览器模拟真人操作。但是这样速度太慢,再说服务器的linux一般都是server版的,根本没有桌面,因此也没有浏览器可用。所以我们就使用无头(headless)浏览器。功能跟真的浏览器一样,速度更快,只不过没有界面罢了。[/size]
1.虚拟机安装ubunt16.04。(略)
2.安装docker。ubuntu14以上自带docker,直接安装即可
ubt1606@ubt1606-virtual-machine:~$ dockerThe program 'docker' is currently not installed. You can install it by typing:sudo apt install docker.ioubt1606@ubt1606-virtual-machine:~$ sudo apt install docker.ioubt1606@ubt1606-virtual-machine:~$ docker imagesCannot connect to the Docker daemon. Is the docker daemon running on this host?ubuntu里需要在docker命令前面加sudo,否则会报上述信息。ubt1606@ubt1606-virtual-machine:~$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
如果嫌每次输入docker命令都要加sudo麻烦,可以把当前用户加入docker用户组。具体参考这篇文章
3.拉docker镜像
搜索python+selenium。其中有一个是这样的“Container with python selenium for lazy people (like me) to avoid configuration xvfb on server.”。这正是我们要的。
该作者还贴心的给了一个小demo。后面我们会用到。
Using default tag: latestPulling repository docker.io/pimuzzo/selenium-pythonNetwork 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.
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/dockerroot@ubt1606-virtual-machine:/home/ubt1606# vi /etc/default/docker
root@ubt1606-virtual-machine:/home/ubt1606# service docker restart
root@ubt1606-virtual-machine:/home/ubt1606#docker pull index.docker.io/pimuzzo/selenium-python-xvfbUsing default tag: latestlatest: Pulling from pimuzzo/selenium-python-xvfb759d6771041e: 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:73b4aca6ecfc2a5bf392065cd07cf7fc89e5da61104492e7c04332f2bfd8da4dStatus: Downloaded newer image for pimuzzo/selenium-python-xvfb:latest
docker images看到类似上述信息就表示镜像拉取成功。注意看SIZE的大小。如果网速不好很可能会失败。失败的话只能多试几次了。再不行就看看有没有其他镜像源,实在不行就用open connect 吧(需要买vps)。也可以从别人那儿拷贝一个镜像文件然后导入到docker里。不管你用什么办法,只要能方便快速地把镜像弄到docker里就行了。
到这一步环境上基本就OK了。如果不是拉取镜像这一步有点小曲折,操作还是非常简单的,简单到令人发指。 要知道拉取一个镜像容易,制作一个镜像可不容易,真的很麻烦的。 一个docker image能为我们节省多少时间啊。这个镜像不光可以在开发的时候用,开发完了之后也是可以直接部署的。一举两得啊。 只有一点,就是开发的时候不太好debug。所以做点小开发或者仅仅是测试某个特定的环境,或者尝试新技术,用docker实在是太方便了。
4.编写第一个小demo
在/home/ubt1606/demo下建立demo.py文件。 注意ubt1606是用户名
[code="python"]#!/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.启动容器并映射数据卷
[size=18px; box-sizing: border-box;]-ti: 也可以写成 -i -t,表示申请一个控制台同容器交互。it分别是interact,terminal的首字母[/size]
[size=18px; box-sizing: border-box;]/home/something文件夹。就像windows和VMWare共享文件夹一样。[/size]
[size=18px; box-sizing: border-box;]windows.iso文件。而容器相当于已经启动起来的windows。[/size]
[size=18px; box-sizing: border-box;]python /home/something/demo.py:运行docker里/home/something文件夹下的demo.py文件。注意路径是docker里的路径。[/size]
[size=18px; box-sizing: border-box;]/home/something[/size]下拷贝到/home/other文件夹下,然后命令换成python /home/other/demo2.py即可。一定要理解“docker里”,“docker里的路径”这个东西。为了不给自己找麻烦,建议就别拷贝到别处了。
[size=18px; box-sizing: border-box;]小结一下:[/size]
[size=18px; box-sizing: border-box;]拉取一个docker镜像。[/size]
[size=18px; box-sizing: border-box;]启动容器运行demo.py文件。[/size]
[size=18px; box-sizing: border-box;]爬虫的编写其实就是用python版的[size=18px; box-sizing: border-box;]webdriver来编写程序。只不过这里没有使用浏览器,而是pyvirtualdisplay。[/size][/size]
[size=18px; box-sizing: border-box;]不过我看目前用的最多的还是webdriver。就是用它来写爬虫。本文只是抛砖引玉,至于webdriver api的使用比较简单,搞JavaEE的上手非常快,这里就不详细介绍了。[/size]
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:[email protected] 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
原文链接