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浏览器中,它看起来就像原有的页面。
接下来,我们将继续解析页面以提取定价信息。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论