php怎么加减运算,信息系统用什么进制来表现信息?
在信息系统中用什么代码的形式来表示信息和数据?用二进制代码的形式来表示信息和数据,原因很容易实现,二进位计数制的四则运算规则十分简单,在电子计算机中采用
首先,二进位计数制仅用两个数码。利用这些截然不同的状态来代表数字,是很容易实现的。二进位计数制的四则运算规则十分简单。而且四则运算最后都可归结为加法运算和移位,这样,电子计算机中的运算器线路也变得十分简单了。第三,在电子计算机中采用二进制表示数可以节省设备。
对二进制及其运算首次给出了比较完整的描述。后来,他拜访一位曾经到过中国的欧洲传教士,了解了中国的周易八卦,他对其与二进制数的相似之处极为惊叹。八卦是利用符号的二元形态来表示事物,这一点与二进制颇为相同,因此说,八卦是古代中国人提出的二进制思想。PHP教程10684次《PHP底层代码分析视频教程》所讲的是有关PHP的底层代码的运行机制以及PHP是如何运作的,让你对PHP有个更深
CPU是如何识别代码的?
CPU其实只认识“0”和“1”
我们经常会听说到某某芯片由多少百亿个晶体管组成这样的科技新闻。没错,CPU就是超大规模的集成电路,由数量超级多的晶体管组成,而晶体管只有“开”和“关”两种状态,刚好可以用“0”和“1”来代表这两种状态,所以CPU是采用二进制来进行运算的。
CPU是什么?CPU是Central Processing Unit的缩写,中文名全称为中央处理器。CPU的组成包括了运算逻辑、寄存器和控制部件,它可以解释指令和进行数据运算处理。因为CPU本身就是超大规模的数字电路,只认识“0”和“1”,所以所有的指令和数据都需要由“0”和“1”组成。
二进制只有“0”和“1”怎么运算?所有运算逻辑我们都可以理解为“与”,“或”,“非”,“异或”四种哦
与门:多个条件中,所有条件成立才算成立,
1 and 1 = 11 and 0 = 00 and 0 = 0或门:多个条件中,只要有一个条件成立,就算成立
1 or 0 =11 or 1 =10 or 0 =0非门:其实就是反相
not 1 =0not 0 =1异或门:可以理解为,两个条件不一样,才算成立
1 xor 1 =01 xor 0 =10 xor 0 =0当然还可以由这四种门延申出“与非门”,“或非门”,“与或非门”,“异或非门”等。
CPU为什么可以运行我们的程序呢?上面说到CPU只认识“0”和“1”,那它为什么可以运行我们的程序呢?CPU的确不可以直接运行我们编写的程序。但如果直接只用“0”和“1”的组合来写程序,那是相当的烦所,也难以找到错误,是非常不现实的。聪明的人类为了解决这个大麻烦,就发明了汇编语言,用一些容易理解和记忆的字符来代替“0”和“1”组成的指令。
例如:
ADD:表示逻辑加减MOV:代表数据传递JMP:代表跳转当然还是需要通过汇编器把这些用汇编语言编写的程序翻译为“0”和“1”组成的十六进制机器码。
随着计算机技术的发展,写的程序也越来越复杂了,发现用汇编语言编写程序的效率也相当低,然后聪明的人类又发明了我们现在用的各种高级语言,比如C,C++,PHP,Python等等,当然这些由高级语言编写的程序就需要通过编译器"翻译"为CPU能够识别的十六进制机器码。
汇编器或者编译器可以理解代码与CPU沟统的“桥梁”了,通过它进行“翻译”,CPU就可以认识代码了。
欢迎关注@电子产品设计方案,一起享受分享与学习的乐趣!关注我,成为朋友,一起交流一起学习记得点赞和评论哦!非常感谢!什么产业发展得更好?
这次肺炎疫情影响之下,好多产业受到了冲击,比如餐饮业,酒店业,旅游业,大型商场,交通运输业等。但是新冠疫情之后,估计有好多行业也会获得快速发展的机会。
医疗产业
这次新冠肺炎疫情中,好多非常新的医疗技术和医疗设备也在出现,这些医疗技术在未来将会得到较快的发展。
未来,新冠肺炎疫苗,快速检测等相关产业在未来可能也会得到很好的发展。未来也会有很多能够提升医疗救助效率的医疗器械,以及医疗药品等都会得到更快的发展。
自媒体产业
这次新冠肺炎疫情以后,可能自媒体以及直播等产业也将会发展更加迅猛。这次新冠肺炎疫情,火神山,雷神山网络直播24小时不间断,字节跳动公司免费网络首映囧妈,这些都是自媒体行业的一次发展,在未来自媒体行业可能会得到更快的发展。
2019年字节跳动公司发展很快,广告收入达到了1200亿元左右,2020年预计字节跳动营收可能会达到2000亿元。这样的收入规模也能够让字节跳动公司成为一个小巨头的企业了。
在线教育产业
新冠疫情影响之下,现在网络教育产业获得了一个发展的较好时机。好多学校可能不能按时开学,这样的情况下,网络教育可能就成为了一个较好的选择。
而未来,网络教育这个大市场可能也会蓬勃发展起来。
居家办公产业
新冠疫情影响之下,好多企业开始开启了居家办公的模式,不再采取集中到办公楼办公的方法。而居家办公也是需要很多的软硬件支持的,这些居家办公的服务可能未来也会得到很好的发展。
电商产业
新冠疫情之后,电商产业还将会较快发展。只要是网上能够方便买到的东西,质量又比较可靠,那么电商在这一块还会继续快速发展,以后网络电商对于实体的冲击可能还会持续。
这次新冠疫情中,京东自营仓库发挥了比较重要的作用,未来以京东为代表的配有自营仓库的电商可能会获得更快的发展。
旅游、餐饮
本次疫情让我们无法出门旅游、聚餐等,疫情过后,旅游行业,餐饮行业将得到短期的高速发展,积压的需求需要得到很好的释放。
结论
综上所述,新冠疫情影响之下,很多产业面临着较大的冲击。但是医疗产业,自媒体产业,在线教育产业,居家办公产业,电商产业等有可能会获得较快的发展。
计算机专业刚上大学?
转变思维
大学专业课程学习方式与高中文化基础课同,要迅速转变思维习惯专业课学习模式。我虽然不是计算机专业但是在大一的时候,初次接触专业课也是很懵。对专业没有清晰地认识,更别说找到学习方法了。所以要先从思想上把自己从文化基础课上解脱出来,认识到专业课与文化课的不同。探索适合计算机专业课程的学习方法,理论结合实际,买一个计算机,多看专业书籍,多进行实际操作。
多点耐心计算机与很多专业都有关系,在生产生活中计算机、网络、信息技术应用已经十分广泛.。我虽不是计算机专业,但是我们也有计算机基础课,主要是一些工作软件(编辑文档、表格、PPT)在今天看来十分简单的操作,和网络有关的也只是用邮箱发作业。在计算机、智能手机、网络信息发达的今天计算机应该都不陌生。电脑、网络、智能手机已经是家庭、个人的标配。计算机专业的学习条件十分成熟,计算机专业方向更加细化:编程、软件开发、广告制作、网络运营等等。我刚上第一节课的时候电脑开机都不会这是真的,QQ、微信是上完第一节课才申请的。你应该知道计算机操作对于我来说的的难度了。
对电脑的熟悉得益于毕业论文,我的毕业论文是手写的然后在敲在文档上,还没有学会扫描文字识别,手机电脑互联语音输入、语音识别。包括文档编辑、PPT制作都是通过写毕业论文自学的。我的计算机起点可以说是零起步了,现在看来有些不可思议,但那是事实。现在你们接触电脑、网络、智能手机很早,对信心技术有着感性的认识,在学习的时候可以结合生活联系更加密切,理解起来更容易,我当时对于计算机专业词汇是完全不理解的。要多点耐心,从计算机基础开始学起慢慢来,先积累知识,然后达到由量变到质变的目标,你会发现计算机专业并没有你想象的那么难。在困境中探究摸索是困苦的,要坚持下去多一点耐心,山穷水复疑无路,柳暗花明又一村。
多点时间大学的学习全靠自觉,辅导员、老师对学生的约束远远没有高中那样严格,只要你旷课次数不多、期末成绩及格,在学习上是没有人督促你的,所以你要严格、自觉要求自己。最好是制定一个详细的学习计划,为自己的学习制定时间表,确定一个目标。这样才能坚持下去,困惑的时候不迷茫,低落的时候不放弃。要想办法提高自己的自制力、意志,经得起诱惑,耐得住寂寞。
不仅要学会专业课,完成学校要求的学习目标,还要扩展自己的学习领域。计算机涉及领域十分广泛,在学好专业课的同时要拓展自己的知识面。建议以时间为轴线了解计算机的发展历程、以及计算机在发展历程中涉及的各个方面。以计算机、网络、信息、数控、智能化、广告制作、模具设计、制图影像、多媒体、自媒体为板块了解计算机在各行各业的使用。把自己的专业学好学透,严谨治学刻苦奋斗。
学会调节要学会调节自己的心情,管理自己的情绪。不要遇到困难就退缩产生消极情绪,要找到合适的方法,改变自己的现状。在学习、生活中我们会遇到各种各样的困难,也会产生负面情绪,但我们不能抱着消极的苦酒痛饮,要自我鼓励、自我调节尽快从这种消极的情绪中走出来。
暂时放下是我们困苦的事情,转移注意力缓解苦闷的情绪。暂时脱离困苦的环境到优美的地方看看一看舒缓一下心情。找到发泄苦闷情绪的方法比如:哭喊、听音乐、跑步、游泳等,把不好的情绪发泄出去。学会沟通把自己的苦闷和家长、老师、同学、朋友倾诉一下。
多种途径学习不能只靠自学、看书或者课堂上老师讲课来学习专业课。大学课程繁多学习专业课的时间有限,要利用现有的资源开展多种学习途径。比如可以向同级或高级同学请教你所遇到的问题。要利用网络资源查找专业课程视频、资料,认真看、反复练。我在学很多新软件的都是通过自带的教程、或者网络视频、电子版操作说明学会的,我相信你也可以。
用爬虫技术能做到哪些有趣的事情?
看到这个问题必须来怒答一波~用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垂类自媒体 “读芯术”