首页 开发编程 正文

php队列怎么实现的

1.熟练掌握前端开发技术(HTML5、JS、JSON、XHTML、CSS3),Web后端更多的是负责产品的服务技术实现,后端开发主要是对数据库进行交互以处理相应的业务逻辑。...

php队列怎么实现的,前端和设计的区分和要求是什么?

Web前端和后端开发的区别和要求

有时候自己会分不清,其实是因为前后端都了解,类似于全栈工程师,但又什么都不是很精通。那到底什么是前端、后端呢,我整理了一些企业要求级别的前端/后端基础,开发框架等。

Web前端开发

什么是 Web 前端?

Web前端,顾名思义是来做web的前端页面的。这里所说的前端泛指web前端,也就是在web应用中用户可以看得见碰得着的东西。包括web页面的结构、web的外观视觉表现以及web层面的交互实现。web前端分为网页设计师、网页美工、web前端开发工程师。首先网页设计师是对网页的架构、色彩以及网站的整体页面代码,负责网页美工只针对UI这块儿的东西,比如网站是否做的漂亮。web前端开发工程师是负责交互设计的,需要和程序猿进行交互设计的配合。

Web前端开发需要掌握的技术:

1.熟练掌握前端开发技术(HTML5、JS、JSON、XHTML、CSS3),了解各项技术的相关标准

2.掌握Ajax异步编程,能够写出高性能、可复用的前端组件;

3.对OO、MVC、MVVM等编程思想、前端框架有深刻理解,熟练掌握一个前端框架(常用前端框架 Vuejs,AngularJS,React,Bootstrap,QUICK UI,移动端有:Frozen UI,weUI ,SUI,MUI,AUI)了解其原理(框架有很多,选择两三个主流的框架,熟练,深度了解才可以);

4.善于Web性能优化,可访问性、对SEO等有良好的体验;理解表现层与数据层分离的概念、 Web语义化(这些也是在找工作中,很有用的加分项);

5.了解前端安全机制,熟悉HTTP协议以及浏览器缓存策略;

6.熟悉常见JS开发框架源码实现,(如:prototype、jQuery、Mootools,Ext, Dojo,underscore、YUI、Kissy),至少熟练一种(当然也不要去选一些用的人很少的框架,要明白大项目都是团队做,不能自己搞一套);

7.拥有良好的代码编写,设计文档撰写的经验,熟练使用Git等版本控制工具;

8.对常见的浏览器兼容问题有清晰的理解,并有可靠的解决方案;如IE6/7/8/9、 Firefox、Safari、Chrome;

9.具有较高的审美(这个很重要,多去见识一些模板,高端的项目,就能感觉到有多大的差距)

web后端开发

什么是 Web 后端?

Web后端更多的是负责产品的服务技术实现,包括业务逻辑,数据存储和处理,消息队列处理等。以及产品服务端接口实现,包括与前端的接口,第三方的接口,服务体系内部接口等。后端开发主要是对数据库进行交互以处理相应的业务逻辑。web后端的话可供开发的语言有 java、php、python、jsp、.NET 这些后端开发语言,并且要掌握几个常用后端框架。

Web后端开发需要掌握的技术:

1.目前多数企业要求对服务器端高并发,大数据量处理经验(简单的说就是优化服务器处理高并发事务的能力)

2.精通 java,php,jsp,servlet,java bean,JMS,EJB,Jdbc,Flex,python 开发,对相关的工具、类库以及框架非常熟悉,常用后端框架如 SSM(Spring+SpringMVC+MyBatis)框架集,Velocity,Hibernate,iBatis,OSGI等,对Web开发的模式有较深的理解(只少熟练掌握一套后端框架);

3.至少熟悉一种关系型数据库,如:mysql,oracle等。熟练使用oracle、sqlserver、SQL Develpoer,PLSQL,MySQL Workbench等常用的数据库管理工具,对数据库有较强的设计能力

4.熟悉maven项目配置管理工具,熟悉tomcat、jboss等应用服务器,同时对在高并发处理情况下的负载调优有相关经验者优先考虑

5.精通面向对象分析和设计技术,包括设计模式、UML建模等

6.熟悉网络编程,具有设计和开发对外API接口经验和能力,同时具备跨平台的API规范设计以及API高效调用设计能力

7.熟悉部分前端知识

我感觉无论在知识的掌握深度上,还是知识掌握的宽度上,都是不够的。

Java工程师一定要求学历高吗?

从事Java开发已经十多年了,关于学历和面试,我谈谈自己的看法。

先简单地说说学历的事儿:

在我看来,学历很重要:我毕业于一个普通的本科学校,这个学历已经让我失去了很多面试的机会,是的,有很多公司,如果你的学历不高、学校一般,是连面试机会都没有的(我的学历是我们公司社招的底限,生源地一本;如果是校招的话,只招收985/211学校的学生);

当然,当你有了几年的工作经验,学历的影响也会越来越小,我身边就有不少大专学历的,都就职于大型的互联网单位,工资待遇跟高学历的相比,也没有什么差距;而且大多数时候学历确实只是一块敲门砖,只要能面试通过,后续的升职加薪、绩效考核,能力还是占主要原因的;

下面主要说说面试的经验:

虽然我自己跳槽次数不多,但是面试成功率还是挺高的;

首先是简历,我提几点建议:

不要写精通,有几项熟练已经很厉害了;我就见过所有技能都是精通的简历,好像除了精通就不会其他词似的;

最好两页,不要太多,相同技术栈的项目,挑一个写就行了;我见过七八页的简历,写了七八个项目,每个项目的内容都差不多,没有必要;

如果是直接发HR邮箱的简历,可以使用word编辑完了之后,生成PDF格式发送,因为word的版本有高有低,你编辑的时候格式很好看,但是HR打开之后可能就各种变形了;

技术栈部分,可以根据招聘信息进行调整,但是不是让你把不会的写上去,而是让你调整顺序,突出重点;

项目经验一定要突出重点,比如我用了什么新技术解决了什么问题,我做的XX业务的核心系统对业务掌握很深入,这个项目我是项目经理带了十几个小弟之类的;

简历上的内容都是真实的,因为一般来说面试官是根据简历上的内容来提问的,所以需要斟酌知识点,保证都能回答;

第二,说说面试前的准备:

主流技术、组件、框架的学习,这里就不说了,因为这些都源于平时一点一滴的积累;这里强调一下,在准备面试的过程中,刷题还是很重要的,因为很多时候,我们会用一个东西,不一定可以把它讲出来,讲出来的不一定可以讲清楚;

对于一些常见的技术问题,是一定要深入掌握的,比如Java程序员经常会被问到的Java基础问题:集合(特别是HashMap)、JVM相关;写了Redis,很大程度上就被问到穿透、雪崩的问题;

常见的非技术面试题,也要提前准备,比如自我介绍、项目中遇到过哪些问题你是如何解决的、你对我们公司/你投的这个岗位有多少了解等等;

项目是一定会被问到的,我建议要准备一段项目描述,控制在一分钟以内,说出项目的基本情况,比如背景、用到的技术栈、规模大小,这些可以少说一些;自己负责哪些事情,在项目中的角色是什么;然后可以描述一些技术细节,比如我使用到Redis做了数据缓存,为什么用?用完之后有什么效果之类的。这里要说你最有把握的技术,后面面试官的提问,很大程度是根据你说的这些内容来提问的。

最后,就是面试过程中还有哪些技巧:

学会引导面试官,比如你擅长做SQL优化、Java性能优化,那么在介绍项目的时候就可以提到项目中的数据量比较大,或者前端访问的并发量很高,这样就很容易让面试官“主动”问出来你们是如何解决的;

不要撒谎,但是最好也不要轻易放弃:被问到了一个没有接触过的问题,或者是一个不能100%确认的问题,不知道就是不知道,因为装模作样乱编的话,很容易被面试官揭穿;但是你可以讲一讲你的想法,或者解决这个问题的思路;

小心陷阱问题,不要太“实在”:当被问到“为什么要跳槽”的时候,尽管真的是因为“工资太低”、“老东家常年996受不了”,请不要说出来,请说一个“希望有一个更大的平台”这样的理由。

最后祝大家面试都能成功~我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

大型互联网公司有社招吗?

回答

当然会有社会招聘。主要是相关岗位。以技术类为主。

不过,一般大网站社会招聘对于学历,工作经验,以及相关其他资质都有一定要求。

比如,对于社招。起点学历在于211,985这类一等一本学生。

对于技术性专业。主要是网络编程含页面编程,美工设计,数据库管理等。市场类也有。

对于技术类社招一般不招收社招实习生。主要是5年以上工作经验,至少3年以上本岗位编程经验。

其他的例如程序,美工还需要带有个人历来作品。

有的大型网站还会涉及到背调

怎么在编程中找到快乐?

怎么在编程中找到快乐,并得到持久的动力?

1,多挣钱

IT行业发展迅速,软件开发工程师一直处于供不应求的状态,薪资较高,尽管有加班较多的问题,总体上还是令人羡慕。

为了多挣钱,努力学习编程,找到一份稳定的程序员工作,是学习的持久动力。

如果不是专职专业的软件开发工程师,并且有充分的自由时间,可以找一些外包项目或者副业兼职,获得额外收入。

总的来说,掌握一项社会急需的技能,多挣钱,是快乐,更是动力。

2,成就感

计算机编程技术在社会上充满了神秘感,非常受追捧,从业人员也容易获得较大的认同感和成就感,比如就有“找男朋友就找张江男”的说法。

1) 开源项目

Github是主流的技术社区,有不同编程语言、不同技术、多种应用场景的开源项目,选择感兴趣并且有较多用户的开源项目参与,贡献代码,对职业发展非常有帮助。

2) 技术社区

在工作学习过程中多,沉淀代码,经验,形成自己的知识库。写作成文,发表在技术社区中,如果阅读量大,获得首页推荐、精选文章等奖励,同行的认同将给予作者非常大的成就感。

还有一类线上技术社区,以编程练习为主,比如HackerRank,LeetCode,坚持完成题目,积累分数,获得排名,从而受到追捧。

3) 自媒体

自媒体平台鼓励知识分享,技术教育方向能够得到较多的流量推荐。在编程过程中,不断经验和心得,分享到自媒体平台,成为大V,也是非常大的收获。

我是工作多年的Web应用架构师,陆续发布关于软件开发方面的文章,欢迎关注我,了解更多IT专业知识。

用爬虫技术能做到哪些有趣的事情?

看到这个问题必须来怒答一波~用python爬虫爬便宜机票了解一下?

喜欢旅行又怕吃土?让Python来爬取最便宜机票吧!

图源:

videoblocks.com

你喜欢旅行吗?

这个问题通常会得到一个肯定的答案,随后引出一两个有关之前冒险经历的故事。大多数人都认为旅行是体验新文化和开阔视野的好方法。但如果问题是“你喜欢搜索机票的过程吗?”也许话题就到此为止了……

可事实上,便宜的机票往往也很重要!本文将尝试构建一个网络爬虫,该爬虫对特定目的地运行并执行带有浮动日期(首选日期前后最多三天)的航班价格搜索。它会将结果保存为excel文件并发送一封包含快速统计信息的电子邮件。显然,这个爬虫的目的就是帮助我们找到最优惠的价格!

你可以在服务器上运行脚本(一个简单的Raspberry Pi就可以),每天运行一到两次。结果会以邮件形式发送,建议将excel文件存入Dropbox文件夹,以便随时随地查看。

因为爬虫以“浮动日期”进行搜索,所以它会搜索首选日期前后最多三天的航班信息。尽管该脚本一次仅运行一对目的地,但可以很容易地改写该爬虫使其每个循环运行多个目的地。最终甚至可能找到一些错误票价...那会很有意思!

另一个爬虫

某种意义上来讲,网络爬取是互联网“工作”的核心。

也许你认为这是一个十分大胆的说法,但谷歌就是从拉里·佩奇用Java和Python构建的网络爬虫开始的。爬虫不断地爬取信息,整个互联网都在试图为所有问题提供最佳的可能答案。网络爬取有不计其数的应用程序,即使更喜欢数据科学中的其他分支,你仍需要一些爬取技巧以获得数据。

这里用到的一些技术来自于最近新的一本佳作《Python网络数据采集》,书中包含与网络爬取相关的所有内容,并提供了大量简例和实例。甚至有一个特别有意思的章节,讲述如何解决验证码检验的问题。

Python的拯救

第一个挑战就是选择爬取信息的平台,本文选择了客涯(Kayak)。我们试过了Momondo, 天巡(Skyscanner), 亿客行(Expedia)和其它一些网站,但是这些网站上的验证码特别变态。

在那些“你是人类吗?”的验证中,尝试了多次选择交通灯、十字路口和自行车后,客涯似乎是最好的选择,尽管短时间内加载太多页面它会跳出安全检查。

我们设法让机器人每4到6个小时查询一次网站,结果一切正常。虽然说不定哪个部分偶尔会出点小问题,但是如果收到验证码,既可以手动解决问题后启动机器人,也可以等待几小时后的自动重启。

如果你是网络爬取新手,或者不知道为何有些网站花费很大力气阻止网络爬取,那么为构建爬虫写下第一行代码前,你一定要多加努力。

谷歌的“网络爬取规范”:

http://lmgtfy.com/?q=web+scraping+etiquette

系紧安全带...

导入并打开Chrome浏览器标签页后,会定义一些循环中会用到的函数。这个架构的构思大概是这样的:

· 一个函数用于启动机器人程序,表明想要搜索的城市和日期。

· 这个函数获得首轮搜索结果,按“最佳”航班排序,然后点击“加载更多结果”。

· 另一个函数会爬取整个页面,并返回一个dataframe数据表。

· 随后重复步骤2和步骤3,得出按“价格”和“航行时间”排序的结果。

· 发送一封简要价格(最低价和平均价)的邮件,并将带有这三种排序类型的dataframe数据表保存为一份excel文件。

· 以上所有步骤会在循环中重复,每X小时运行一次。

每个Selenium项目都以一个网页驱动器开始。我们使用Chromedriver驱动器,但还有其它选择。PhantomJS和Firefox也很受欢迎。下载Chromedriver后,将其置于一个文件夹中即可。第一行代码会打开一个空白Chrome标签页。

from time import sleep, strftime

from random import randint

import pandas as pd

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import smtplib

from email.mime.multipart import MIMEMultipart

# Change this to your own chromedriver path!

chromedriver_path = 'C:/{YOUR PATH HERE}/chromedriver_win32/chromedriver.exe'

driver = webdriver.Chrome(executable_path=chromedriver_path) # This will open the Chrome window

sleep(2)

这些是将用于整个项目的包。使用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”复制路径的缺陷,请参考以下差异:

1 # This is what the copymethod would return. Right click highlighted rows on the right side and select “copy> Copy XPath”//*[@id=“wtKI-price_aTab”]/div[1]/div/div/div[1]/div/span/span

2 # This is what I used todefine the “Cheapest” buttoncheap_results= ‘//a[@data-code = “price”]’

第二种方法的简洁性清晰可见。它搜索具有data-code等于price属性的元素a。第一种方法查找id等于wtKI-price_aTab的元素,并遵循第一个div元素和另外四个div和两个span。这次……会成功的。现在就可以告诉你,id元素会在下次加载页面时更改。每次页面一加载,字母wtKI会动态改变,所以只要页面重新加载,代码就会失效。花些时间阅读XPath,保证你会有收获。

不过,使用复制的方法在不那么“复杂”的网站上工作,也是很好的!

基于以上所展示的内容,如果想在一个列表中以几个字符串的形式获得所有搜索结果该怎么办呢?其实很简单。每个结果都在一个对象中,这个对象的类是“resultWrapper”。获取所有结果可以通过像下面这样的for循环语句来实现。如果你能理解这一部分,应该可以理解接下来的大部分代码。它基本上指向想要的结果(结果包装器),使用某种方式(XPath)获得文本,并将其放置在可读对象中(首先使用flight_containers,然后使用flight_list)。

前三行已展示在图中,并且可以清楚地看到所需的内容,但是有获得信息的更优选择,需要逐一爬取每个元素。

准备起飞吧!

最容易编写的函数就是加载更多结果的函数,所以代码由此开始。为了在不触发安全验证的前提下最大化所获取的航班数量,每次页面显示后,单击“加载更多结果”。唯一的新内容就是所添加的try语句,因为有时按钮加载会出错。如果它对你也有用,只需在前面展示的start_kayak函数中进行简要注释。

# Load more results to maximize the scraping

def load_more():

try:

more_results = '//a[@class = “moreButton”]'

driver.find_element_by_xpath(more_results).click()

# Printing these notes during the program helps me quickly check what it is doing

print('sleeping…..')

sleep(randint(45,60))

except:

pass

现在,经过这么长的介绍,已经准备好定义实际爬取页面的函数。

我们编译了下一个函数page_scrape中的大部分元素。有时这些元素会返回列表插入去程信息和返程信息之间。这里使用了一个简单的办法分开它们,比如在第一个 section_a_list和section_b_list变量中,该函数还返回一个flight_df数据表。所以可以分离在不同分类下得到的结果,之后再把它们合并起来。

def page_scrape():

“““This function takes care of the scraping part”““

xp_sections = '//*[@class=“section duration”]'

sections = driver.find_elements_by_xpath(xp_sections)

sections_list = [value.text for value in sections]

section_a_list = sections_list[::2] # This is to separate the two flights

section_b_list = sections_list[1::2] # This is to separate the two flights

# if you run into a reCaptcha, you might want to do something about it

# you will know there's a problem if the lists above are empty

# this if statement lets you exit the bot or do something else

# you can add a sleep here, to let you solve the captcha and continue scraping

# i'm using a SystemExit because i want to test everything from the start

if section_a_list == []:

raise SystemExit

# I'll use the letter A for the outbound flight and B for the inbound

a_duration = []

a_section_names = []

for n in section_a_list:

# Separate the time from the cities

a_section_names.append(''.join(n.split()[2:5]))

a_duration.append(''.join(n.split()[0:2]))

b_duration = []

b_section_names = []

for n in section_b_list:

# Separate the time from the cities

b_section_names.append(''.join(n.split()[2:5]))

b_duration.append(''.join(n.split()[0:2]))

xp_dates = '//div[@class=“section date”]'

dates = driver.find_elements_by_xpath(xp_dates)

dates_list = [value.text for value in dates]

a_date_list = dates_list[::2]

b_date_list = dates_list[1::2]

# Separating the weekday from the day

a_day = [value.split()[0] for value in a_date_list]

a_weekday = [value.split()[1] for value in a_date_list]

b_day = [value.split()[0] for value in b_date_list]

b_weekday = [value.split()[1] for value in b_date_list]

# getting the prices

xp_prices = '//a[@class=“booking-link”]/span[@class=“price option-text”]'

prices = driver.find_elements_by_xpath(xp_prices)

prices_list = [price.text.replace('$','') for price in prices if price.text != '']

prices_list = list(map(int, prices_list))

# the stops are a big list with one leg on the even index and second leg on odd index

xp_stops = '//div[@class=“section stops”]/div[1]'

stops = driver.find_elements_by_xpath(xp_stops)

stops_list = [stop.text[0].replace('n','0') for stop in stops]

a_stop_list = stops_list[::2]

b_stop_list = stops_list[1::2]

xp_stops_cities = '//div[@class=“section stops”]/div[2]'

stops_cities = driver.find_elements_by_xpath(xp_stops_cities)

stops_cities_list = [stop.text for stop in stops_cities]

a_stop_name_list = stops_cities_list[::2]

b_stop_name_list = stops_cities_list[1::2]

# this part gets me the airline company and the departure and arrival times, for both legs

xp_schedule = '//div[@class=“section times”]'

schedules = driver.find_elements_by_xpath(xp_schedule)

hours_list = []

carrier_list = []

for schedule in schedules:

hours_list.append(schedule.text.split('\n')[0])

carrier_list.append(schedule.text.split('\n')[1])

# split the hours and carriers, between a and b legs

a_hours = hours_list[::2]

a_carrier = carrier_list[1::2]

b_hours = hours_list[::2]

b_carrier = carrier_list[1::2]

cols = (['Out Day', 'Out Time', 'Out Weekday', 'Out Airline', 'Out Cities', 'Out Duration', 'Out Stops', 'Out Stop Cities',

'Return Day', 'Return Time', 'Return Weekday', 'Return Airline', 'Return Cities', 'Return Duration', 'Return Stops', 'Return Stop Cities',

'Price'])

flights_df = pd.DataFrame({'Out Day': a_day,

'Out Weekday': a_weekday,

'Out Duration': a_duration,

'Out Cities': a_section_names,

'Return Day': b_day,

'Return Weekday': b_weekday,

'Return Duration': b_duration,

'Return Cities': b_section_names,

'Out Stops': a_stop_list,

'Out Stop Cities': a_stop_name_list,

'Return Stops': b_stop_list,

'Return Stop Cities': b_stop_name_list,

'Out Time': a_hours,

'Out Airline': a_carrier,

'Return Time': b_hours,

'Return Airline': b_carrier,

'Price': prices_list})[cols]

flights_df['timestamp'] = strftime(“%Y%m%d-%H%M”) # so we can know when it was scraped

return flights_df

尽量让这些名字容易理解。记住变量a表示旅行的去程信息,变量b表示旅行的返程信息。接下来说说下一个函数。

等等,还有什么吗?

截至目前,已经有了一个能加载更多结果的函数和一个能爬取其他结果的函数。本可以在此结束这篇文章,而你可以自行手动使用这些函数,并在浏览的页面上使用爬取功能。但是前文提到给自己发送邮件和一些其他信息的内容,这都包含在接下来的函数start_kayak中。

它要求填入城市名和日期,并由此打开一个kayak字符串中的地址,该字符串直接跳转到“最佳”航班结果排序页面。第一次爬取后,可以获取价格的顶部矩阵,这个矩阵将用于计算平均值和最小值,之后和客涯(Kayak)的预测结果(页面左上角)一同发送到邮件中。这是单一日期搜索时可能导致错误的原因之一,因其不包含矩阵元素。

def start_kayak(city_from, city_to, date_start, date_end):

“““City codes it's the IATA codes!

Date format YYYY-MM-DD”““

kayak = ('https://www.kayak.com/flights/' + city_from + '-' + city_to +

'/' + date_start + '-flexible/' + date_end + '-flexible?sort=bestflight_a')

driver.get(kayak)

sleep(randint(8,10))

# sometimes a popup shows up, so we can use a try statement to check it and close

try:

xp_popup_close = '//button[contains(@id,”dialog-close”) and contains(@class,”Button-No-Standard-Style close “)]'

driver.find_elements_by_xpath(xp_popup_close)[5].click()

except Exception as e:

pass

sleep(randint(60,95))

print('loading more.....')

# load_more()

print('starting first scrape.....')

df_flights_best = page_scrape()

df_flights_best['sort'] = 'best'

sleep(randint(60,80))

# Let's also get the lowest prices from the matrix on top

matrix = driver.find_elements_by_xpath('//*[contains(@id,”FlexMatrixCell”)]')

matrix_prices = [price.text.replace('$','') for price in matrix]

matrix_prices = list(map(int, matrix_prices))

matrix_min = min(matrix_prices)

matrix_avg = sum(matrix_prices)/len(matrix_prices)

print('switching to cheapest results…..')

cheap_results = '//a[@data-code = “price”]'

driver.find_element_by_xpath(cheap_results).click()

sleep(randint(60,90))

print('loading more…..')

# load_more()

print('starting second scrape…..')

df_flights_cheap = page_scrape()

df_flights_cheap['sort'] = 'cheap'

sleep(randint(60,80))

print('switching to quickest results…..')

quick_results = '//a[@data-code = “duration”]'

driver.find_element_by_xpath(quick_results).click()

sleep(randint(60,90))

print('loading more…..')

# load_more()

print('starting third scrape…..')

df_flights_fast = page_scrape()

df_flights_fast['sort'] = 'fast'

sleep(randint(60,80))

# saving a new dataframe as an excel file. the name is custom made to your cities and dates

final_df = df_flights_cheap.append(df_flights_best).append(df_flights_fast)

final_df.to_excel('search_backups//{}_flights_{}-{}_from_{}_to_{}.xlsx'.format(strftime(“%Y%m%d-%H%M”),

city_from, city_to,

date_start, date_end), index=False)

print('saved df…..')

# We can keep track of what they predict and how it actually turns out!

xp_loading = '//div[contains(@id,”advice”)]'

loading = driver.find_element_by_xpath(xp_loading).text

xp_prediction = '//span[@class=“info-text”]'

prediction = driver.find_element_by_xpath(xp_prediction).text

print(loading+'\n'+prediction)

# sometimes we get this string in the loading variable, which will conflict with the email we send later

# just change it to “Not Sure” if it happens

weird = '¯\\_(ツ)_/¯'

if loading == weird:

loading = 'Not sure'

username = 'YOUREMAIL@hotmail.com'

password = 'YOUR PASSWORD'

server = smtplib.SMTP('smtp.outlook.com', 587)

server.ehlo()

server.starttls()

server.login(username, password)

msg = ('Subject: Flight Scraper\n\n\

Cheapest Flight: {}\nAverage Price: {}\n\nRecommendation: {}\n\nEnd of message'.format(matrix_min, matrix_avg, (loading+'\n'+prediction)))

message = MIMEMultipart()

message['From'] = 'YOUREMAIL@hotmail.com'

message['to'] = 'YOUROTHEREMAIL@domain.com'

server.sendmail('YOUREMAIL@hotmail.com', 'YOUROTHEREMAIL@domain.com', msg)

print('sent email…..')

虽然没有使用Gmail账户测试发送邮件,但是可以搜索到很多的替代方法,前文提到的那本书中也有其他方法来实现这一点。如果已有一个Hotmail账户,只要替换掉个人的详细信息,它就会开始工作了。

如果想探索脚本的某一部分正在做什么,可以将脚本复制下来并在函数外使用它。这是彻底理解它的唯一方法。

利用刚才创造的一切

在这些步骤之后,还可以想出一个简单的循环来使用刚创造的函数,同时使其持续运行。完成四个“花式”提示,写下城市和日期(输入)。因为测试时不想每次都输入这些变量,需要的时候可以使用以下这个清楚的方式进行替换。

如果已经做到了这一步,恭喜你!改进还有很多,比如与Twilio集成,发送文本消息而不是邮件。也可以使用VP*或更加难懂的方式同时从多个服务器上研究搜索结果。还有就是验证码的问题,验证码会时不时地跳出来,但对此类问题还是有解决办法的。不过,能走到这里已经是有很牢固的基础了,你可以尝试添加一些额外的要素。

使用脚本运行测试的示例

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

本文转载自互联网,如有侵权,联系删除