个人网站整站源码下载,上海建筑建材业网站,大学生活网站设计,专业的深圳网站设计图源#xff1a;videoblocks.com你喜欢旅行吗#xff1f;这个问题通常会得到一个肯定的答案#xff0c;随后引出一两个有关之前冒险经历的故事。大多数人都认为旅行是体验新文化和开阔视野的好方法。但如果问题是“你喜欢搜索机票的过程吗#xff1f;”也许话题就到此为止了…图源videoblocks.com你喜欢旅行吗这个问题通常会得到一个肯定的答案随后引出一两个有关之前冒险经历的故事。大多数人都认为旅行是体验新文化和开阔视野的好方法。但如果问题是“你喜欢搜索机票的过程吗”也许话题就到此为止了……可事实上便宜的机票往往也很重要本文将尝试构建一个网络爬虫该爬虫对特定目的地运行并执行带有浮动日期(首选日期前后最多三天)的航班价格搜索。它会将结果保存为excel文件并发送一封包含快速统计信息的电子邮件。显然这个爬虫的目的就是帮助我们找到最优惠的价格你可以在服务器上运行脚本(一个简单的Raspberry Pi就可以)每天运行一到两次。结果会以邮件形式发送建议将excel文件存入Dropbox文件夹以便随时随地查看。因为爬虫以“浮动日期”进行搜索所以它会搜索首选日期前后最多三天的航班信息。尽管该脚本一次仅运行一对目的地但可以很容易地改写该爬虫使其每个循环运行多个目的地。最终甚至可能找到一些错误票价...那会很有意思另一个爬虫某种意义上来讲网络爬取是互联网“工作”的核心。也许你认为这是一个十分大胆的说法但谷歌就是从拉里·佩奇用Java和Python构建的网络爬虫开始的。爬虫不断地爬取信息整个互联网都在试图为所有问题提供最佳的可能答案。网络爬取有不计其数的应用程序即使更喜欢数据科学中的其他分支你仍需要一些爬取技巧以获得数据。这里用到的一些技术来自于最近新的一本佳作《Python网络数据采集》书中包含与网络爬取相关的所有内容并提供了大量简例和实例。甚至有一个特别有意思的章节讲述如何解决验证码检验的问题。Python的拯救第一个挑战就是选择爬取信息的平台本文选择了客涯(Kayak)。我们试过了Momondo, 天巡(Skyscanner), 亿客行(Expedia)和其它一些网站但是这些网站上的验证码特别变态。在那些“你是人类吗”的验证中尝试了多次选择交通灯、十字路口和自行车后客涯似乎是最好的选择尽管短时间内加载太多页面它会跳出安全检查。我们设法让机器人每4到6个小时查询一次网站结果一切正常。虽然说不定哪个部分偶尔会出点小问题但是如果收到验证码既可以手动解决问题后启动机器人也可以等待几小时后的自动重启。如果你是网络爬取新手或者不知道为何有些网站花费很大力气阻止网络爬取那么为构建爬虫写下第一行代码前你一定要多加努力。谷歌的“网络爬取规范”系紧安全带...导入并打开Chrome浏览器标签页后会定义一些循环中会用到的函数。这个架构的构思大概是这样的· 一个函数用于启动机器人程序表明想要搜索的城市和日期。· 这个函数获得首轮搜索结果按“最佳”航班排序然后点击“加载更多结果”。· 另一个函数会爬取整个页面并返回一个dataframe数据表。· 随后重复步骤2和步骤3得出按“价格”和“航行时间”排序的结果。· 发送一封简要总结价格(最低价和平均价)的邮件并将带有这三种排序类型的dataframe数据表保存为一份excel文件。· 以上所有步骤会在循环中重复每X小时运行一次。每个Selenium项目都以一个网页驱动器开始。我们使用Chromedriver驱动器但还有其它选择。PhantomJS和Firefox也很受欢迎。下载Chromedriver后将其置于一个文件夹中即可。第一行代码会打开一个空白Chrome标签页。这些是将用于整个项目的包。使用randint函数令机器人在每次搜索之间随机睡眠几秒钟。这对任何一个机器人来说都是必要属性。如果运行前面的代码应该打开一个Chrome浏览器窗口机器人会在其中导航。一起来做一个快速测试在另一个窗口上访问客涯网(http://kayak.com)选择往返城市和日期。选择日期时确保选择的是“-3天”。由于在编写代码时考虑到了结果页面所以如果只想搜索特定日期很可能需要做一些微小的调整。点击搜索按钮在地址栏获取链接。它应该类似于下面所使用的链接将变量kayak定义为url并从网页驱动器执行get方法搜索结果就会出现。无论何时只要在几分钟内使用get命令超过两到三次就会出现验证码。实际上可以自己解决验证码并在下一次验证出现时继续进行想要的测试。从测试来看第一次搜索似乎一直没有问题所以如果想运行这份代码并让它在较长的时间间隔后运行必须解决这个难题。你并不需要十分钟就更新一次这些价格对吧每个XPath都有陷阱到目前为止已经打开了一个窗口获取了一个网站。为了开始获取价格和其他信息需要使用XPath或CSS选择器我们选择了XPath。使用XPath导航网页可能会令人感到困惑即使使用从inspector视图中直接使用“复制XPath”但这不是获得所需元素的最佳方法。有时通过“复制XPath”这个方法获得的链接过于针对特定对象以至于很快就失效了。《Python网络数据采集》一书很好地解释了使用XPath和CSS选择器导航的基础知识。接下来用Python选择最便宜的结果。上面代码中的红色文本是XPath选择器在网页上任意一处右键单击选择“inspect”就可以看到它。在想要查看代码的位置可以再次右键单击选择“inspect”。为说明之前所观察到的从“inspector”复制路径的缺陷请参考以下差异为说明之前所观察到的从“inspector”复制路径的缺陷请参考以下差异第二种方法的简洁性清晰可见。它搜索具有data-code等于price属性的元素a。第一种方法查找id等于wtKI-price_aTab的元素并遵循第一个div元素和另外四个div和两个span。这次……会成功的。现在就可以告诉你id元素会在下次加载页面时更改。每次页面一加载字母wtKI会动态改变所以只要页面重新加载代码就会失效。花些时间阅读XPath保证你会有收获。不过使用复制的方法在不那么“复杂”的网站上工作也是很好的基于以上所展示的内容如果想在一个列表中以几个字符串的形式获得所有搜索结果该怎么办呢其实很简单。每个结果都在一个对象中这个对象的类是“resultWrapper”。获取所有结果可以通过像下面这样的for循环语句来实现。如果你能理解这一部分应该可以理解接下来的大部分代码。它基本上指向想要的结果(结果包装器)使用某种方式(XPath)获得文本并将其放置在可读对象中(首先使用flight_containers然后使用flight_list)。前三行已展示在图中并且可以清楚地看到所需的内容但是有获得信息的更优选择需要逐一爬取每个元素。准备起飞吧最容易编写的函数就是加载更多结果的函数所以代码由此开始。为了在不触发安全验证的前提下最大化所获取的航班数量每次页面显示后单击“加载更多结果”。唯一的新内容就是所添加的try语句因为有时按钮加载会出错。如果它对你也有用只需在前面展示的start_kayak函数中进行简要注释。现在经过这么长的介绍已经准备好定义实际爬取页面的函数。我们编译了下一个函数page_scrape中的大部分元素。有时这些元素会返回列表插入去程信息和返程信息之间。这里使用了一个简单的办法分开它们比如在第一个 section_a_list和section_b_list变量中该函数还返回一个flight_df数据表。所以可以分离在不同分类下得到的结果之后再把它们合并起来。尽量让这些名字容易理解。记住变量a表示旅行的去程信息变量b表示旅行的返程信息。接下来说说下一个函数。等等还有什么吗截至目前已经有了一个能加载更多结果的函数和一个能爬取其他结果的函数。本可以在此结束这篇文章而你可以自行手动使用这些函数并在浏览的页面上使用爬取功能。但是前文提到给自己发送邮件和一些其他信息的内容这都包含在接下来的函数start_kayak中。它要求填入城市名和日期并由此打开一个kayak字符串中的地址该字符串直接跳转到“最佳”航班结果排序页面。第一次爬取后可以获取价格的顶部矩阵这个矩阵将用于计算平均值和最小值之后和客涯(Kayak)的预测结果(页面左上角)一同发送到邮件中。这是单一日期搜索时可能导致错误的原因之一因其不包含矩阵元素。虽然没有使用Gmail账户测试发送邮件但是可以搜索到很多的替代方法前文提到的那本书中也有其他方法来实现这一点。如果已有一个Hotmail账户只要替换掉个人的详细信息它就会开始工作了。如果想探索脚本的某一部分正在做什么可以将脚本复制下来并在函数外使用它。这是彻底理解它的唯一方法。利用刚才创造的一切在这些步骤之后还可以想出一个简单的循环来使用刚创造的函数同时使其持续运行。完成四个“花式”提示写下城市和日期(输入)。因为测试时不想每次都输入这些变量需要的时候可以使用以下这个清楚的方式进行替换。如果已经做到了这一步恭喜你改进还有很多比如与Twilio集成发送文本消息而不是邮件。也可以使用VPN或更加难懂的方式同时从多个服务器上研究搜索结果。还有就是验证码的问题验证码会时不时地跳出来但对此类问题还是有解决办法的。不过能走到这里已经是有很牢固的基础了你可以尝试添加一些额外的要素。使用脚本运行测试的示例留言 点赞 关注我们一起分享AI学习与发展的干货欢迎关注全平台AI垂类自媒体 “读芯术”