使用Selenium进行动态爬虫


人生苦短,我用python

最近看了才大(静觅博客博主)的selenium教程,在使用过程中也遇到了不少问题,现在应该也算是入了点自动化测试的门道了。

Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。

由于目前前端框架的兴起,很多网站的页面是由javascript生成的,静态页面的爬虫就显得比较无力。这时候就需要拿出selenium这般神器了,他可以模拟浏览器的操作,例如表单操作,点击事件等等。

所以,我们可以通过selenium来爬取一些复杂的网站的信息。譬如淘宝,京东一类的通过框架渲染出来的页面。

那就废话不多说。我们用python结合selenium进行动态爬虫的世界。


首先当然是安装Selenium库,使用pip安装:

pip install selenium

先别急,使用selenium没有浏览器驱动器模拟怎么行,所以推荐使用火狐(FireFox)或者PhantomJs,这里就要问了,什么是PhantamJs呢.

PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。

显然,它和火狐也一样是浏览器,只不过不能直接看到,可以间接的用截图来看。

不过还是推荐使用火狐,因为火狐是比较直观地能看到它的动作的。(为什么不用Chrome呢,因为我找了很多解决方案都没有用,感觉应该是selenium和chrome的驱动器版本不匹配吧 -_-)

当然,这里两者都会提供一下windows的安装方式

这两个东西,由于我的无知,掉了很多坑!终于弄明白安装方式了!

1、PhantomJs,下载地址:

https://npm.taobao.org/dist/phantomjs/

找到对应的版本就好,比如我下载的是phantomjs-2.1.1-windows.zip

解压到任意盘(我是解压到E盘),然后找到bin里的phantomJs.exe。

在这里就可以写javascript脚本了,例如


console.log("Hello world");

这样就会输入Hello world了。

但怎么才能在selenium中使用phantomJs呢。Windows用户需要配置环境变量。

因为我的phantomJs.exe在E:\phantomjs-2.1.1-windows\bin里,我就将该位置添加进系统变量的Path里

系统变量配置

这个时候phantomJs就配置好了。

进入cmd控制台,输入

phantomJs -v

便可以查询版本,若配置完全,就可以显示版本,我这里显示的就是2.1.1。否则,检查环境变量是否配置正确。


2、火狐(Firefox),下载地址

https://github.com/mozilla/geckodriver/releases

选择合适的版本下载,例如我的是geckodriver-v0.18.0-win64

安装分四步

1、首先得要有个FireFox浏览器,然后把FireFox的安装位置添加到环境变量中,如果不太清楚这步,可以参考phantomjs的过程。

2、然后把刚刚下载的压缩包中的geckodriver.exe 放到 FireFox的安装目录下。

3、最后最好再把geckodriver.exe 放到 python的安装目录下

4、OK,为自己鼓鼓掌,配置成功! 



配置完所有环境后,就是 进入正题了,动态爬虫!


这里以FireFox驱动为例,进行selenium的示范

from selenium import webdriver

driver = webdriver.Firefox()

driver.get("https://sg.search.yahoo.com/")

driver的类型为FireFox,也就是用火狐进行模拟。

driver.get("https://sg.search.yahoo.com/")  这一句是请求雅虎,运行会发现,自动打开了雅虎搜索网页!(我也不知道为啥百度打不开了!!只能拿雅虎试水  :|)

下一步,进行模拟输入,怎么办呢,很简单,找到输入的标签

那么用浏览器打开雅虎(此处用的FireFox),右键输入框-查看元素

可以得知输入框的id为yschsp  , 搜索按钮的class为sbb。那就可以写代码了!

from selenium importwebdriver


driver=webdriver.Firefox()

driver.get("https://sg.search.yahoo.com/")

searchWhat=driver.find_element_by_id("yschsp")

#获取id叫做'yschsp'的元素

searchWhat.clear()

#通过clear方法,可以将输入框内的字符清空,比较保险的做法

searchWhat.send_keys("python")

#通过send_keys方法把'python'传递给serchWhat元素,即id叫做'yschsp'的元素

searchBtn=driver.find_element_by_class_name("sbb")

#获取id叫做'sbb'的元素,但通常不推荐用class找,用selector能更精确的找到

searchBtn.click()

#通过click()方法点击


运行后,可以看见浏览器自动输入python后,又点击了按钮进行了搜索!

哈哈哈哈!这就是selenium的强大之处,这样对于很多动态页面也能很方便地爬取了!





然而这个selenium可没那么简单,它的慢是出了名的,很多坑需要用一些手段来处理。我总结一下目前遇到的一些问题。

一、最容易遇到的问题就是 编译器报错:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:

这是为什么呢,因为浏览器驱动器看不到你要找的元素!对!看不到!

最可能的情况就是网速慢导致还没加载出来,那我们就等他加载出来

import time

time.sleep(1)

强制等待到加载出来。

当然还有其他更加灵活的方法,可以查api来学习。(其实是笔者还不太会,不敢乱讲(逃))

第二种可能是没有通过一些交互的方式加载出来,比如要按个按钮啊之类的,这就需要

自己仔细地去查找了。


第三种是有些网站需要滚动才会加载新的东西,比如qq空间,这时候要用js来强制滚动

js="document.documentElement.scrollTop=10000" #拖动滚动条到屏幕底端

driver.execute_script(js)

这样就可以滚动后再加载出新的元素


二、还有些比较坑的情况,就是你找到的按钮可能用click点击根本没用,并不是找错了,而可能是这个网页的框架引起的,还需要点击父元素,同样的也是要找到父元素后使用click方法。超坑的有木有! (微笑脸)


哈,终于写完了~写完日记写代码~



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

推荐阅读更多精彩内容