SpiderMan(二)模拟人类爬虫: Selenium

作者在Nature 2018关键词这个帖子里面所用到的数据就是用python写了一个简单的爬虫程序,几分钟内就获取了Nature主刊在2018年所刊登的所有文章信息。因为Nature期刊网页是比较开放的,所有你看到的网页内容基本都可以在网页的html文件里面获得,也就是所谓的静态网页。但是有些网站,比如GoEuroAirBnB这种商业网站的网页就没有那么简单了,你在浏览器里面看到的内容在当前网页的html文件里面找不到。这是因为网站在跟你捉迷藏!使用了大量的JavaScript内容!对付这样的网站,就不能用简单的爬虫方法(from urllib.request import urlopen)了,高级一点的方法就是利用Selenium来模拟人类操作(比如单击、登录、翻页等)浏览器来获取网页内容!

Selenium

Selenium本来是为测试网页而设计的,当然也可以用于爬虫了。它的安装还有使用方法,在其官网上有详细说明,下面只挑几个重点列举。简单的入门也可以参考这篇博客+视频

这里假设目标机器上已经有了python的相关环境

安装Selenium

pip install Selenium

Web Driver

既然要模拟人类操作浏览器,那么这个过程肯定是基于浏览器这个软件了,所以需要对应浏览器的驱动(Driver)内核程序,根据官网的说明,Selenium目前支持四种浏览器

Chrome, Safari, Edge, FireFox

我是Mac系统,当然是用Safari浏览器了,点开相应的driver链接发现,新版Mac系统(Safari 10 on OS X El Capitan and macOS Sierra)已经提供了原生的Safari WebDriver程序了,所在路径为/usr/bin/safaridriver。所以对于Mac用户,这一步可以跳过了!现在就可以直接上一小段代码来个hello world了

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Safari()
driver.get("https://www.modernfig.cn")
driver.find_element_by_link_text("Team").click()
driver.find_element_by_link_text("Blog").click()
driver.close()

注意: 在你直接用的时候回提示这样的错误: SessionNotCreatedException: Message: Could not create a session: You must enable the 'Allow Remote Automation' option in Safari's Develop menu to control Safari via WebDriver. 解决方法就是:根据这个提示在你的Safari浏览器的Develop菜单下面找到Allow Remote Automation这个菜单按钮(倒数第三个)单击即可!

运行这段代码的效果就是浏览器会自动打开www.modernfig.cn(🤔这是我用sphinx做的个人网站😎),然后完成代码里面的任务(两个单击操作分别打开Team页面Blog页面)就自动关闭!

小白初尝

问题来了,人类对浏览器的操作怎么用python代码来表达呢?这个问题对于熟悉爬虫的程序猿或者爱好者来说,不是个问题,因为他们已经记住了怎么写这些代码!对于初学者,有个简单的方法,就是跟word里面录制宏的功能一样,也可以对浏览器的操作进行录制,保存为python代码。

浏览器的操作录制需要借助Chrome浏览器了,因为它有一个很棒的插件叫Katalon Recorder ,可以进行这样的骚操作!为什么Safari没有?Mac在2018年11月升级之后,对Safari的插件管理更严格了,彻底禁止了未知开发者的插件了,而且只在App Store里面开放Safari的插件下载!

Katalon Recorder记录浏览器操作并导出为python代码

录制完成后,导出为python代码,很长一段,都是固定格式的,我们关注的就是类似下面的这段代码:首先打开了www.modernfig.cn然后进行了两次点击操作

driver.get("https://www.modernfig.cn")
driver.find_element_by_link_text("Team").click()
driver.find_element_by_link_text("Blog").click()

注意:上面的简单的演示过程中程序都会自动打开Safari浏览器界面,然后模拟人的点击操作,但是我们在批量爬去内容的时候或许不希望界面显示出来,让它在后台运行即可!这个就需要用的--handless选项了,但是Selenium目前好像不支持Safari的handless选项,因此如果想后台运行selenium程序代码,需要用chrome浏览器。关于Chrome浏览器的web driver,下载然后拷贝到/usr/local/bin目录下即可. 设置后台运行的代码如下:

from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")       # define headless
driver = webdriver.Chrome(chrome_options=chrome_options)

获取网页

经过上面的几个步骤,现在已经能让程序控制你的浏览器了。接下来就到正事儿了:获取网页内容 driver.page_source,还可以保存网页截图 driver.get_screenshot_as_file("skyscanner.png")!!!

from urllib.request import urlopen
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")       # define headless
driver = webdriver.Chrome(options=chrome_options)

url='https://www.skyscanner.net/transport/flights/fran/hamb/181109/181116/?adults=1&children=0&adultsv2=1&childrenv2=&infants=0&cabinclass=economy&rtn=1&preferdirects=false&outboundaltsenabled=false&inboundaltsenabled=false&ref=home#results'

driver.get(url)
html = driver.page_source       # 获取html
driver.get_screenshot_as_file("skyscanner.png") #保存网页截图
driver.close()
保存的网页截图:悲剧了,需要验证

获取网页以后,对网页的解析和提取信息,就跟简单爬虫教程里面的一样啦,用BeautifulSoup解析就行!

好像goeuro和skyscanner这两个网站都设置了反爬虫程序,有机器人验证!目前还不知怎么破,后面再补充吧!不过booking和Airbnb可以愉快的爬虫!旅行酒店比价问题基本解决了!接下来找一个方便找机票和火车票信息的网站就完美了!

Google Flight

Google Flight 查询机票价格信息还是个不错的选择,没有设置那么强的验证限制。不过最好是设置几十秒的间隔时间,防止被查封!本来Google Flights提供开放的API的,但是2018年四月份关闭了这个服务。

先别高兴太早:打开Google Flights搜索结果的网页,发现浏览器显示源码里面并没有价格等信息,因为你看到的网页是经过JavaScript允许之后的,不是静态网页!!!这就是前面说的网站在跟你玩捉迷藏!用命令 html = driver.page_source 获取的html与浏览器源码显示的一毛一样,缺失了很多信息,不是页面显示的信息!怎么办?

用下面这个命令可以获取内部数据:

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")

对于刚入门的我来说,未解决这个问题,找了很多地方,最后发现还是google搜索强大,直接用英文搜索会出来更多有价值的东西!最终在全球最活跃的程序猿论坛 stack overflow找到了答案!这个操作简直不要太给力!😎

至此,基本上日常生活中的爬虫任务解决了!

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

推荐阅读更多精彩内容