Python带你薅羊毛:手把手教你揪出最优惠航班信息

免费的成年av动漫网站

简而言之,我们的目标是编写一个网络爬虫,帮助您自动搜索特定目的地的航班,以便在灵活范围内(首选日期之前和之后最多3天)进行一系列航班。它将搜索结果保存在Excel电子表格中,并将精确的统计信息通过电子邮件发送给您。

显然,我们正在寻找的是相应时期内最好的机票。

ba3f3e1526fe40479705284854e246a4

在现实生活中,爬行动物的使用完全取决于你。我曾经安排过两次假期旅行,并寻找一些回到我家乡的短途航班。

如果你想要专业,你可以把这个程序放在服务器上(一个简单的树莓派就够了)让它每天运行一到两次。该程序会将统计信息发送到您的电子邮件地址。我还建议您将生成的Excel电子表格保存到Web磁盘(例如Dropbox),以便您可以从任何地方轻松访问数据。

它会搜索“灵活”的日期范围,以便在您首选日期的3天内查找航班信息。虽然此脚本一次只能查询一对目的地(出发到达),但您可以轻松调整它以在每个循环中多次运行。你甚至可能会发现一些标签错误的超低票价..这是一个“伟大的”(不提倡这样的漏洞)。

b806d38f408643d890a5b1b06cfd1c85

Python学习交流组:1004391443

我还没有找到任何这样的门票,但我想我会成功!

01另一个爬行动物?

当我第一次开始网络抓取时,我对这方面并不太感兴趣..这是对的,这是事实。我对预测建模,财务分析甚至语义情感分析等“高级”项目更感兴趣。

但事实证明,尝试编写第一个Web爬虫的过程非常有趣。随着我不断学习,我逐渐意识到网络爬行是推动互联网本身的主要推动力。

您可能认为我是一个章节,但如果您知道,Google最初是建立在Larry Page用Java和Python编写的爬虫上的吗?

这个爬虫几乎完全捕获了整个互联网(即使是现在),因此当您在搜索框中键入关键字时,该程序可以为您提供最佳答案。网络爬虫在互联网上的实际应用几乎是无穷无尽的。即使您从事数据科学的其他领域,您也需要一些网络抓取技能来帮助您从互联网上获取数据。

ca495fb0f52449fc8428992b16769ac8

02“你喜欢旅行吗?”

这个简单而无害的问题经常得到其他人的积极回答,偶尔会有一两个以前的冒险故事。我想大多数人都应该同意,旅行是体验新文化和拓展视野的好方法。但是,如果问题变成“你喜欢预订机票的过程吗?”,我认为每个人的热情肯定会打折..

这是Python展示才华的时候。

第一个挑战是哪个平台可供选择。这不是一个容易的决定。最后,我选择了Kayak。在此过程中,我还考虑了Momondo,Skyscanner,Expedia和其他一些网站,但对于初学者来说,这些网站的人机验证确实..无情。

在选择“哪个是交通信号灯,这是人行道和自行车”之后,经过几次“我不是机器人”,我认为Kayak更友好的是,尽管如果你同时读了太多页面很短的时间它还会给你一些安全检查。

我目前让脚本每隔4到6小时抓一次页面,虽然偶尔会出现小问题,但总的来说还可以。如果您发现脚本一直在访问验证码,您可以尝试手动提交验证,然后重新启动脚本,或者等待几个小时让爬虫访问该站点,然后验证码就会消失。

您也可以尝试在其他平台上使用这些代码。欢迎您在下面的评论中分享您的结果!

在我真正开始之前,我想强调一点:如果您不熟悉网页抓取,或者您不知道为什么有些网站会尽力停止抓取,那么在您编写第一行抓取代码之前,请谷歌首先“网络爬虫礼仪”。如果你像一个疯子一样无法控制地打击别人的网站,你可能很快就会偷看。

说明:请严格遵守中国互联网和计算机系统的各项法律法规和相关规定,不得滥用爬行动物技术。

051d8ef7a503438bb4460499f1e06b31

03系好安全带

准备,加速!

导入所需的库并打开Chrome页面后,我们需要定义一些稍后将在循环中调用的函数。主程序结构应与此类似:

一个函数负责启动爬虫,指出我们需要找到城市和日期函数来获取初始搜索结果,以“最佳”方式对航班列表进行排序,然后单击“加载更多”另一个函数来爬行整个页面并返回一个数据帧数据表对象重复上面的步骤2和3,以“最便宜”和“最快”的方式对列表进行排序,以简单地计算价格(最低价格,平均价格),然后形成摘要汇总表,发送到指定的邮箱,并将相应的数据框保存为Excel电子表格文件,并在指定目录中每隔X小时重复上述每一步

通常,每个Selenium项目都以webdriver开头。我正在使用Chromedriver,它使用Chrome内核。当然,您也可以选择其他选项,例如无头浏览器PhantomJS,或者只是Firefox,这非常好。下载后,您将完成该文件夹。

请关注读者,我写这篇文章不是为了展示任何新技术。是的,已有更先进的方法可以找到更便宜的门票,但我只希望我的文章能为读者带来一些简单实用的东西。

从时间导入睡眠,strftime

来自随机导入randint

将pandas导入为pd

来自selenium import webdriver

从selenium.webdriver.common.keys导入密钥

导入smtplib

来自email.mime.multipart导入MIMEMultipart

这些是我们脚本所需的代码库。我将使用randint()让爬虫在每次搜索之间暂停几秒钟,这基本上就是每个爬虫都会有的。

Driver=webdriver.Chrome(executable_path=chromedriver_path)

睡眠(2)

前几行将打开一个空白的Chrome页面。当您运行它时,您会看到一个空白的Chrome窗口,我们将让爬虫在此窗口中工作。

所以让我们先在另一个窗口打开kayak.com并查看它。选择您的出发和到达城市,以及出发日期。选择日期时,请记住选择“±3天”选项。我在编写代码时使用了调试选项,所以如果我只想搜索特定日期,我需要对代码进行一些调整。

b9e35eeaf4e347f59337385eedf920a1

我将在稍后解释我需要调整的地方,但如果您在尝试时遇到问题,请在下面留言。

接下来,我们按搜索按钮复制地址栏中的链接地址。此地址应类似于下面代码中的地址。我将此字符串分配给kayak变量,并使用webdriver的get方法访问此地址。

皮划艇=''

Driver.get(皮艇)

睡眠(3)

您的搜索结果页面应该会出现。

如果我在几分钟内执行此命令两到三次,网站将弹出验证码以阻止后续访问。在这种情况下,您可以手动验证验证并继续测试您需要搜索的内容,直到弹出下一个验证码。

就我的个人测试而言,第一次搜索始终不是问题,因此如果您还无法跳过验证码,则可以在让爬虫具有较低频率之前尝试手动验证验证。执行搜索操作。毕竟,你不必每10分钟搜索一下价格吧?

04 XPath:带坑的萝卜

目前,我们已经打开了一个窗口并阅读了一个网页。为了获得确切的价格和其他信息,我们需要使用XPath或CSS选择器。在今天的例子中,我选择使用XPath来定位页面上的元素,因为我不认为在这个例子中需要CSS。当然,如果你可以混合和匹配CSS进行定位,那么当然它更完美。

使用XPath跳转页面有时很容易让人迷惑,即使您使用Internet上文章中的技术,例如右键单击“检查元素”中的“复制XPath”以获取相应的页面元素。 XPath信息不一定是最好的方法 - 有时候,你得到的链接是如此特殊,以至于它们不能再被使用了。

注释:这里我个人推荐《Python 爬虫开发从入门到实战》(谢玉坤)我亲自购买,其中详细介绍了XPath语法,以及如何构建XPath知识,当然还有Selenium的模拟登录和处理验证码以及其他黑色技术。介绍也是不可或缺的。建议有学习能力的学生可以看一看。

Cheap_results='//a [