广东服务器生产企业,请问腾讯主机服务器是中国的吗?
记得有一次在节目上,宗庆后就问过马化腾这个问题。只是当时小马哥一笑而过,并没有作答,而腾讯主机服务器到底在哪里也成了一个热议的话题。
互联网起源于美国根服务器主要用来管理互联网的主目录,全世界只有13台(这13台根域名服务器名字分别为“A”至“M”),1个为主根服务器在美国。其余12个均为辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本,而不是在中国。也许,,腾讯会在美国会设立一些小型服务器,那是为了更加方便自己用户在国外顺畅的使用但是,绝大多数上网,都是本地DNS解析,极少数没访问量的域名,才需要更高级别的域名服务器解析,真正能到根服务器解析的访问,少之又少。
腾讯属于世界级的互联网公司,内部储存了海量的用户信息,出于国家安全考虑,政府也不会允许腾讯把主服务器放在国外,
如果腾讯主服务器在美国,成本高不说而且会严重影响到用户体验,掉线还不成为家常便饭。我们是无法享受到现在这种服务的。
其实为了保证QQ,微信,游戏,新闻的平顺传输腾讯会在很多大城市铺设节点,如今IDC已经遍布全国,比如深圳,广州,还有我们知道的天津滨海等大数据中心。最近媒体又曝光了腾讯在贵州的大数据中心,《新闻直播间》栏目中还做了重点介绍。
所以,腾讯的主服务器绝对是在中国,没有悬念。
广东深圳的电信DNS服务器是多少?
根据我所知,广东深圳的电信DNS服务器通常是:
主DNS服务器:
- IPv4:202.96.128.68
- IPv6:2402:f000:1:1501::10
备用DNS服务器:
- IPv4:202.96.134.133
- IPv6:2402:f000:1:1502::10
请注意,这些DNS服务器地址可能会有变化。
到底什么是云计算?
大家好,我是小枣君。
“云计算”很复杂?其实,一个小故事你就能看懂了——
周末快到了,李雷和他的几位小伙伴们约好,一起去春游、烧烤。
于是,到了这天,每个小伙伴都带来了烧烤所需的器材和食材:
大家带的器材和食材
(每人都带齐了一整套)
然后,他们就开始烤、开始吃...
烧烤结束之后,大家虽然都吃得很好,但是觉得并不开心。。。
为什么不开心呢?因为:
1 每个人都带着一整套的器材和食材,背包太重,很累
2 每个人都要搭架子,生火,穿铁签,抹酱料整个流程走一遍,时间太久
3 有的人木炭不够用,有的人却浪费了很多
第二周,大家又嘴馋了,于是,又相约去烧烤。
鉴于上次烧烤的经验教训,大家商量了一下,决定提前进行分工。
分工方案如下(方案A):
在这个方案A中,李雷专门负责带木炭、烧烤架、打火机,并且全程负责把火烧好。
而其他4人,负责各自食材的烧烤。
当然,最后烤好之后,四个人给李雷一份自己烤好的食物。
这次烧烤之后,大家都觉得比第一次好多啦!
但是,还是存在一些问题,如下:
1 有人酱料用得多,也有人酱料用得少,既有不足,也有浪费。
2 韩梅梅、吉姆、露西、莉莉每个人都要负责各自食材的烧烤,觉得太累。
第三周,小伙伴们又又相约去烧烤。。。
大家商量了之后,进一步进行分工调整,推出了新的方案,如下(方案B):
在方案B中,李雷带的东西不变,工作分工也不变。
韩梅梅改成只带酱料、酱料刷、铁签,并且,全程负责穿铁签,烤食材,刷酱料。
剩下的3个人,负责带食材。
当然,烤好之后,3个人都需要给李雷、韩梅梅一份烤好的食物。
这次烧烤之后,大家觉得更方便了,很开心,很满足。。。
到了第四周。。。。。。
Duang...
李雷、韩梅梅、吉姆这三个小伙伴,瞅准了烧烤带来的商机,干脆合伙开起了烧烤摊。。。专门卖给游客烤好的鸡腿、鸡翅、羊肉。。。(这就是方案C)
他们三个人开始了幸福的生活。。。
故事结束。。。
大家好,我是你们的小枣君~
上面的这个烧烤小故事,不知道大家看明白了没有?没明白也不要紧,大家听我慢慢解释。
今天我要说的,是关于“云计算”的知识。
云计算,相信大家都听说过,如今是一个很火爆的科技概念,到处都能看见对它的宣传,还有很多与之相关的企业。
那么,到底什么是云计算呢?
实际上,关于云计算的解释众说纷纭,每个人的理解都不太一样。比较流行的一种书面定义,是这个说的——
云计算是一种按使用量付费的模式。这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
这实在不是一句人话。
如果让我来解释,云化就是把每个人手中的独立资源集中起来,放在一个地方进行统一管理,然后动态分配给每个人使用。而云计算,就是把计算资源集中起来,这个计算资源,包括CPU、内存、硬盘等硬件,还有软件。
云化,集中化
嗯,是不是有点像人民公社的大锅饭?
换句话说,云计算就是让用户使用互联网来使用在云端的应用,数据,或者服务。
不同的用户,接入到云,获取资源
这些应用,数据,或者服务,就是云计算的资源。
云计算的结构里,这些资源是如何提供的呢?到底是怎么一个运作模式呢?
这里,就要提到三个我们经常会看到听到的词:
很多人搞不清这3个“ass”是什么意思。其实,它们是云计算的三种最常见的服务模式。
最底层的,就是IaaS——
IaaS: Infrastructure-as-a-Service(基础设施即服务)
Infrastructure就是基础设施的意思,IaaS有时候也叫Hardware-as-a-Service,一下子就理解了吧?就是提供硬件相关的服务。以前,你要建个网站,建个FTP,需要自己买服务器和交换机等硬件设备,现在不用了,可以使用IaaS服务商提供的IaaS服务。
刚才的故事里,方案A的李雷,其实就类似一个IaaS服务商。
再往上,就是——
PaaS: Platform-as-a-Service(平台即服务)
P就是Platform,平台。某些时候也叫做中间件。基于硬件之上,平台开发都可以在这一层进行。PaaS服务提供商提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统,以及数据库系统等。
方案B的李雷+韩梅梅,类似一个PaaS服务商
继续往上,就是——
SaaS: Software-as-a-Service(软件即服务)
这一层是和你的生活每天接触的一层,在这一层上,就可以直接访问和使用服务功能了!例如通过网页浏览器收发电邮,订购商品,查看航班信息等。在你的面前,就是具体的应用服务。
方案C,好基友烧烤摊,就是一个SaaS
游客们可以直接购买食物,买了就能直接吃,什么都不用自己操心,无需自己去准备器材、食材、也无需自己进行烧烤。
以上3个“ass”概念,一旦你理解了,云计算你就基本上算是理解了。
怎么样,并不难吧?
其实,除了IaaS、PaaS、SaaS之外,现在还衍生出了很多相关的概念,例如BaaS(后端即服务,Backend-as-a-Service)、CaaS(通讯即服务,Communications-as-a-Service)、DaaS(数据即服务,Data-as-a-Service)。这些都是创造出来的概念,表达了你提供服务的层面到底是什么。
就好像我给大家提供知识,也可以算是KaaS(Knowledge-as-a-Service)。
云计算之所以成为一种普遍采用的流行技术,就是因为它有这么几方面的优点:
1 能力强
云计算可以达到很庞大的规模,例如Google公司的云计算,就有100多万台服务器,这意味着超强悍的计算能力。
2 很可靠
云计算采用各种容灾措施,可以保证服务的高可靠性,比本地服务更稳妥。
3 灵活性
云计算很灵活,可以根据用户需求或规模提供相适应的资源,并支持动态伸缩,想多就多,想少就少。
4 低成本
云计算看上去很庞大,很花钱,但实际上,因为节点更为廉价,资源动态管理,所以,用户花的钱反而更少,可以根据自己的使用情况定制服务,控制成本。
总之,云计算作为一个新的技术趋势,已经在不断改变了我们的工作和生活方式。在网络等基础设施日益发展的支撑下,云计算将得到更快速的发展。
也许在未来,我们人类的大脑也会成为云计算的一部分,那也说不定哦!
小伙伴们看完是否有一些收获呢?喜欢就为我点赞和关注吧!
apex加速选哪个服务器?
apex加速选港服,台服,日服都可以,人多。
延迟稍微低,打游戏流畅。
另外新加坡服主播多。
因为《apex英雄》游戏服务 器是架设在国 外的,玩家在国 内游玩新赛季的过程中,网络连接服务 器很容易出现不稳定、波动的情况,就会导致游戏出现卡加载界面、进不去等问题。
用爬虫技术能做到哪些有趣的事情?
看到这个问题必须来怒答一波~用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集成,发送文本消息而不是邮件。也可以使用VPN或更加难懂的方式同时从多个服务器上研究搜索结果。还有就是验证码的问题,验证码会时不时地跳出来,但对此类问题还是有解决办法的。不过,能走到这里已经是有很牢固的基础了,你可以尝试添加一些额外的要素。
使用脚本运行测试的示例
留言 点赞 关注
我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”