网络资讯撷取神器 – 爬虫程序 (PYTHON SELENIUM)

我们在举办【Python 大数据培训课程】时,发现很多学员对 Selenium 有以下问题,在此解释一下:


网络爬虫是什麽?
我们每天花很多时间在网络,例如投资股票的朋友每天不时上网留意股价,广告界的朋友经常在社交媒体、论坛等地方收集最新资讯,房地产的朋友则经常留意各区物业买卖价等。不论目的为何,大家做的其实都是不断重复三个步骤 ─「打开网页」、「前往目标版面」、「记录资料」。其实只要你懂写简单的电脑程序,便可把这些重复动作交给电脑自动去做,电脑可以 24×7 无间断地,每隔一个指定的时间 (例如每隔 5 分钟),自动地去做记录资料的工作。你更可以指示电脑自动分析这些资料,并自动执行某个行动 (例如股价波动到某个位时自动进行交易)。

Selenium 原理是什麽?
Selenium 是利用自动化控制你的浏览器,前往网站,模拟人手点击键盘滑鼠下载资料的,就像网络版的按键精灵。这个方法虽然简单原始,但却是最通用而有效的方案,99% 以上的网站都可以下载到。

原因是,浏览器是必定可以运行所有 Javascript、frame 的 (不然你平日怎样上网?)。其次,无论网站采取那种技术去阻挡爬虫程序,它的设计是一定要让正常用户通过 (不然这个网站就无人去到了…)。而正常用户是通过浏览器观看网站的,而且他们是用键盘和滑鼠操作网站的。

Selenium 正是基於浏览器,并且会模拟键盘和滑鼠操作网站,只要目标页面你平日能够用浏览器入到,那 Selenium 都会入到的,因此几乎所有网站都可以用 Selenium 爬的。

网络爬虫是否犯法?
Python Selenium 并不是 black magic,它无法神奇地取得对方的机密资料。它的原理只是自动化控制你的浏览器,前往网站,模拟人手点击键盘滑鼠,copy-and-paste 取得资料。因此所取得的网站内容其实都是对方已经公开在网站上的,用人手都能拿到,所以并不犯法的。要注意的是如果你把程序速度设定过快,网站可能会认为你在恶意攻击而把你封锁 IP。因此我们会教你在程序加入适量延时,减慢程序速度以避免这点。

我曾试过用某个工具把网站的 HTML 下载,但里面无我要的资料!?
这是因为该网站内容是动态地以 Javascript 呈现出来、又或是用 frame 包住的,因此虽然你在浏览器上看到,但你下载回来的HTML档却不会含有资料,这是网站阻挡爬虫程序的常见做法。你一般会在这些网站源码中看到 frame、iframe、document.write、ajax、XMLHttpRequest 等语句。要解决这个问题,你的爬虫程序不能是单纯的 HTML 下载器,而是要能够运行 Javascript 和 frame 的程序,Selenium 正是解决这个问题的好方法。

Selenium、Beautiful soup、Scrapy 有什麽不同?
除了 Selenium 外,常见的爬虫库还有 Beautiful soup、Scrapy。但它们无法运行 Javascript 和frame,只能把网站的HTML源码下载 (严格来说 Beautiful soup 只是 HTML 解析器,下载还需搭配urllib、requests 等工具库)。因此很多动态生成资料的网站它们都无法下载。你可能会问,那为什麽这些库还会存在?那是因为它们的设计目的不是让你下载网站资料,而只是要快速取得网站内每个页面所有的超连结 (a),分析网站页面之间的关系 (好像 Google, Yahoo 等搜寻引擎)。这些库不运行Javascript,大大提升了它们的速度,它们1秒内下载数十个页面都不是难事 (但实际应用时还是要限速以避免封 IP)。

而 Selenium 的设计初衷则是让网站开发人员为网站自动化除错用的 (相信你曾经遇到过某些网站上的按钮被广告盖住,无法点击吧。那就是因为开发人员偷懒,无进行测试的结果!),小型网站只有数十个页面,开发人员手动到访每个页面测试就可以了。但有数千个页面的大型网站就必须要用 Selenium 自动测试所有页面了。由於 Selenium 站在使用者角度测试网站,因此它必须模仿使用者浏览页面时的行为,例如键盘输入文字、滑鼠点击、上下滑动页面等。这个设计优点是能够取得所有真实呈现在画面的资料,绝大多数网站都能用,但缺点是速度较慢,1秒可能只能下载1页。

Selenium 有无法下载的网站吗?
只要是浏览器入到的网站,Selenium 都能入到,但网站的设计者还是可以透过一些技巧令你入到、看到,但下载不到资料。

首先是文字被嵌入在图片中,这个情况下 Selenium 只能下载到图片,但要读取图片中的文字(如下图两张图片)则要用图像文字识别 OCR (Optical Character Recognition) 技术才能读到,大大增加读取难度。

以上文字和走势线是图片画出来的,程序需要加上 OCR (Optical Character Recognition) 才「可能」读到。
然後是随机出现的问答问题。除非你事先已为所有可能会出现的问题设定答案,否则Selenium基本上不可能自动答到的。

图:随机问答例子
除了以上两种情况外,还有一些很奇特的方法令你看到但很难下载到资料的,但它们实行的成本都很高,也会影响到正常用户访问页面的体验,可谓杀敌八百自损三千,因此资料性的网站一般都不会特地用这些方法保护 (总不成要使用者每看一篇新闻都要答一次问题吧!) 因此只有一些非常大型、非资料性的网站才会使用。另外,即使网站用了问答或图片验证码,只要出现频率不高,Selenium 还是能够下载到的,请见下文。

Selenium 对於有随机问答、图片验证码,或要登入的网站能否下载?
只要出现频率不高,是可以的。虽然上面提及到 Selenium 很难自动完成问答,或读到验证码内的文字,但你是可以做到先让程序暂停在页面,你手动输入答案或验证码,再让程序继续运行的。因此大部份需要验证码登入的网站,你只需一开始手动输入一次验证码,然後 Selenium 也是可以下载的。


<<:  用python下载东西

>>:  Mikrotik RouterOS从入门到实战系列-Mikrotik入门第二课

久坐是门学问 - 人因工程

来到了办公桌座位,打开电脑萤幕,拿起滑鼠准备查阅未开封的信件,开始一天的早晨。这一整段过程看似简单,...

Day_02 系统安装(一)

玩OpenWrt第一步当然是制作系统,下载系统映像的入口其实很多,但这个路径我觉得最直观与便捷。可以...

找LeetCode上简单的题目来撑过30天啦(DAY30)

题号:74 标题:Search a 2D Matrix 难度:Medium Write an eff...

JAVAFX 跳出新窗格

请问我该怎麽让他按下purchas这个action後能购开启一个新视窗 ...

JS 12 - 继承方法

大家好! 我们花了两天介绍原型链和原型继承的原理,今天就要介绍继承的方法了。 我们进入今天的主题吧!...