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进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

原文链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容