3.2 使用高级的网络爬虫技术检索票价数据
我们已经在前面的章节中学习了如何使用 request 库来检索网页。正如我之前所说,它是一个了不起的工具,但不幸的是,这里无法工作。我们想要爬取的页面是完全基于AJAX 的。异步 JavaScript(AJAX)这个方法从服务器获取数据,而不必重新加载整个页面。这意味着,需要使用浏览器来检索数据。虽然这个听起来好像需要大量的额外工作,不过有两个库,当一起使用它们的时候,这就会成为一个轻量级的任务。
这两个库是 Selenium 和 PhantomJS。Selenium 是一个强大的工具,它可以自动化 Web浏览器,而 PhantomJS 是一个浏览器。为什么使用 PhantomJS 而不是 Firefox 或 Chrome 呢?
PhantomJS 是所谓的无头浏览器,意思是它没有可视化的用户界面。这使得它非常精简,成为我们理想的选择。
要安装PhantomJS,你可以从http://phantomjs.org/download.html 下载可执行文件或者源码。至于Selenium,它可以通过 pip 来安装。
我们还需要另一个名为 BeautifulSoup4 的库来解析页面中的数据。如果你还没有安装这个,也可以使用 pip 安装它。
完成这些安装之后,让我们开始动手吧。我们将在 Jupyter 记事本里工作。Jupyter 最适合探索性的分析。稍后,当探索完成之后,我们会继续在文本编辑器中工作。文本编辑器更适合编写我们想要部署为应用程序的代码。
首先,导入这些库。
import pandas as pd
import numpy as np
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import
DesiredCapabilities
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
%matplotlib inline
接下来,我们将设置代码以实例化浏览器对象。正是这个对象将为我们拉取页面。你可以在浏览器中搜索并复制 URL,以此来选择想要的机场或地区。在这里,我会查找从纽约机场到几个亚洲城市的行程。
url = "https://www.google.com/flights/explore/#explore;f=JFK,EWR,LGA;t=HND,NRT,TPE,HKG,KIX;s=1;li=8;lx=12;d=2016-04-01"
driver = webdriver.PhantomJS()
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0
(Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/46.0.2490.80 Safari/537.36")
driver = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true'])
driver.implicitly_wait(20)
driver.get(url)
我们需要向接收请求的服务器发送一个用户代理。你可以使用我在此列出的代理,或者如果你愿意,也可以将其替换为自己的代理。进入到解析阶段的时候,这点变得尤为重要。如果你在普通的浏览器中使用某代理来选择文档对象模型(DOM)元素,然后在代码中传递了另一个不同的代理,那么你解析页面的时候也许会碰到问题,因为 DOM 可能是与用户代理相关的。
你可以通过 Google 搜索“what is my user agent?”,来找到自己的用户代理。
如果你计划将其用于其他的爬虫,请复制这个信息,然后在上述代码中使用它。
运行上述代码之后,你可以使用下面这行代码来保存页面的截图。请检查这个截图,以确保一切看起来正常。
driver.save_screenshot(r'flight_explorer.png')
如果一切都是按计划完成,你应该可以看到输出为 True,并且生成一个与所抓取页面相关的图像文件。在普通的 Web 浏览器中,它看起来就像原有的页面。
接下来,我们将继续解析页面以提取定价信息。
本书评论