欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

互聯(lián)網(wǎng)css選擇器怎么設(shè)置,css選擇器項目符號圖像是什么

老白2年前28瀏覽0評論

互聯(lián)網(wǎng)css選擇器怎么設(shè)置,css選擇器項目符號圖像是什么?

css樣式屬性list-style-image :設(shè)定列表項目符號的自定義圖像。其值是一個引用圖像的URL路徑。

url ( url ) —— 使用絕對或相對 url 地址指定圖像。

互聯(lián)網(wǎng)css選擇器怎么設(shè)置,css選擇器項目符號圖像是什么

想學簡單的網(wǎng)頁制作?

我是老李,我來回答!更多技術(shù)分享,歡迎點關(guān)注

這兩年來,互聯(lián)網(wǎng)發(fā)展越來越好,網(wǎng)頁技術(shù)也變成了剛需技能,就算你不是想做開發(fā)工程師,也應該學一點來做個簡單網(wǎng)頁。

今天就來講一下基礎(chǔ)的一些網(wǎng)頁開發(fā)需要學習的路線吧。

首先,基本的網(wǎng)頁制作我們一般都是指基礎(chǔ)的PC端網(wǎng)頁開發(fā),完成基本的布局,完整表達網(wǎng)頁需要展示的內(nèi)容信息,表達出人性化的網(wǎng)頁效果。

那么這種程度應該怎么學習呢??

首先,無論學任何一個技術(shù),都是從零基礎(chǔ)開始的,網(wǎng)頁開發(fā)也是一樣。做軟件開發(fā),是從事編程開發(fā)工作,必須先從語法基礎(chǔ)開始學習,通過語法組成產(chǎn)品效果。

網(wǎng)頁開發(fā)的基礎(chǔ)語法,由HTML+CSS+JavaScript組成,這是網(wǎng)頁開發(fā)最基本的3個語言。

網(wǎng)頁布局基礎(chǔ):HTML+CSSHTML就是超文本標記語言,組成網(wǎng)頁內(nèi)容的最基本語言。你可以直接說他是網(wǎng)頁的骨架,網(wǎng)頁的圖片、文字、視頻、音頻、程序都需要他引入到網(wǎng)頁中體現(xiàn)。光是HTML做網(wǎng)頁,只是有了內(nèi)容,當然是遠遠不夠的。因為只是HTML的話,只能用Table做布局才能勉強做出個成型的網(wǎng)頁來。但是從Web2.0時代開始,都是盒子模型布局法了,也就是用DIV+CSS來實現(xiàn)布局了。CSS就是層疊樣式表。通過樣式屬性來對標簽進行布局規(guī)范,在不再使用table布局的時候,只要CSS樣式對網(wǎng)頁標簽進行對應的布局實現(xiàn)才是正確的開發(fā)方式了。HTML(div)+CSS布局,是基礎(chǔ)入門的基本步驟,在這個階段,你需要學習的內(nèi)容,包括有:1.標簽語義化,SEO2.頁面加載的流程和原理3.網(wǎng)頁結(jié)構(gòu)4.盒子模型(W3C盒子模型和IE盒子模型)5.CSS選擇器6.CSS布局浮動、定位在剛剛開始的階段,大家學習的布局方式基本都是以px為單位的靜態(tài)布局方法。熟悉好布局方法,先給自己一個小目標,做一個簡單的電商網(wǎng)頁的基本結(jié)構(gòu)出來,不用特效,不需要交互。瀏覽器腳本語言:JavaScriptJavaScript是我們學習前端開發(fā)中非常重要的一個內(nèi)容,也是一個大家經(jīng)常掉坑里的難點。JavaScript現(xiàn)在可以說是互聯(lián)網(wǎng)時代使用率最高的腳本語言了,在網(wǎng)頁中,所有的數(shù)據(jù)渲染,特效的交互都需要利用JavaScript,來影響瀏覽器的顯示。JavaScript不只是開發(fā)網(wǎng)頁特效和渲染數(shù)據(jù)的重要內(nèi)容,如果你想往編程開發(fā)工程師發(fā)展,在學習前端開發(fā)的后期,大量使用算法和框架的時候,對JavaScript基礎(chǔ)的考驗也是很多的。在基礎(chǔ)階段,我們學習JavaScript需要注意:1.基本關(guān)鍵字指令2.基本數(shù)據(jù)類型、數(shù)組3.函數(shù)4.面向?qū)ο缶幊?.原型鏈、閉包6.JSON7.Ajax8.DOM(文檔對象模型 原生DOM操作)9.事件捕獲、冒泡、代理10.常用函數(shù)方法在JavaScript部分學習,主要還是要去理解好交互的原理,把原理分析清楚,真的理解語法,那寫出多復雜的邏輯也是手到擒來。快速開發(fā)網(wǎng)頁特效jQuery說到學習JavaScript,很多小白同學肯定會很頭痛他的原生寫法。每次邏輯業(yè)務都需要手動寫,也就是用一次就造一次輪子。覺得很麻煩。如果能簡單一點就好了。因為JavaScript有可以封裝的特性,所以在后面也出現(xiàn)了很多用JavaScript封裝的類庫、插件。比如說最經(jīng)典的類庫就是jQuery了。jQuery類庫就是在類庫里面封裝好了很多JavaScript的事件方法。jQuery通過封裝,減輕了遍歷、對象選擇等等很多的問題。把網(wǎng)頁特效的實現(xiàn)變得簡單化,通過調(diào)用方法就可以了。在學習jQuery的時候,需要重點認識的有:1.jQuery語法和JavaScript原生語法的差異2.Dom對象和jQuery對象3.jQuery的入口函數(shù)和JavaScript的入口函數(shù)的差異4.jQuery事件的執(zhí)行邏輯。學習jQuery,最需要達到的效果就是能快速的完成網(wǎng)頁的特效,比如說輪播圖、手風琴菜單、旋轉(zhuǎn)木馬、放大鏡等等這些特效。能完成一個電商網(wǎng)站的布局+特效開發(fā)是最基本的要求了。這些就是零基礎(chǔ)學習必備的一些基本內(nèi)容,在入門前端開發(fā)最基本需要掌握的東西,把基礎(chǔ)理解好,才能為后面的學習做更多的準備。

我是前端開發(fā)老李,如果你想學習更多前端開發(fā)的內(nèi)容,點擊關(guān)注不迷路!

用爬蟲技術(shù)能做到哪些有趣的事情?

看到這個問題必須來怒答一波~用python爬蟲爬便宜機票了解一下?

喜歡旅行又怕吃土?讓Python來爬取最便宜機票吧!

圖源:

videoblocks.com

你喜歡旅行嗎?

這個問題通常會得到一個肯定的答案,隨后引出一兩個有關(guān)之前冒險經(jīng)歷的故事。大多數(shù)人都認為旅行是體驗新文化和開闊視野的好方法。但如果問題是“你喜歡搜索機票的過程嗎?”也許話題就到此為止了……

可事實上,便宜的機票往往也很重要!本文將嘗試構(gòu)建一個網(wǎng)絡(luò)爬蟲,該爬蟲對特定目的地運行并執(zhí)行帶有浮動日期(首選日期前后最多三天)的航班價格搜索。它會將結(jié)果保存為excel文件并發(fā)送一封包含快速統(tǒng)計信息的電子郵件。顯然,這個爬蟲的目的就是幫助我們找到最優(yōu)惠的價格!

你可以在服務器上運行腳本(一個簡單的Raspberry Pi就可以),每天運行一到兩次。結(jié)果會以郵件形式發(fā)送,建議將excel文件存入Dropbox文件夾,以便隨時隨地查看。

因為爬蟲以“浮動日期”進行搜索,所以它會搜索首選日期前后最多三天的航班信息。盡管該腳本一次僅運行一對目的地,但可以很容易地改寫該爬蟲使其每個循環(huán)運行多個目的地。最終甚至可能找到一些錯誤票價...那會很有意思!

另一個爬蟲

某種意義上來講,網(wǎng)絡(luò)爬取是互聯(lián)網(wǎng)“工作”的核心。

也許你認為這是一個十分大膽的說法,但谷歌就是從拉里·佩奇用Java和Python構(gòu)建的網(wǎng)絡(luò)爬蟲開始的。爬蟲不斷地爬取信息,整個互聯(lián)網(wǎng)都在試圖為所有問題提供最佳的可能答案。網(wǎng)絡(luò)爬取有不計其數(shù)的應用程序,即使更喜歡數(shù)據(jù)科學中的其他分支,你仍需要一些爬取技巧以獲得數(shù)據(jù)。

這里用到的一些技術(shù)來自于最近新的一本佳作《Python網(wǎng)絡(luò)數(shù)據(jù)采集》,書中包含與網(wǎng)絡(luò)爬取相關(guān)的所有內(nèi)容,并提供了大量簡例和實例。甚至有一個特別有意思的章節(jié),講述如何解決驗證碼檢驗的問題。

Python的拯救

第一個挑戰(zhàn)就是選擇爬取信息的平臺,本文選擇了客涯(Kayak)。我們試過了Momondo, 天巡(Skyscanner), 億客行(Expedia)和其它一些網(wǎng)站,但是這些網(wǎng)站上的驗證碼特別變態(tài)。

在那些“你是人類嗎?”的驗證中,嘗試了多次選擇交通燈、十字路口和自行車后,客涯似乎是最好的選擇,盡管短時間內(nèi)加載太多頁面它會跳出安全檢查。

我們設(shè)法讓機器人每4到6個小時查詢一次網(wǎng)站,結(jié)果一切正常。雖然說不定哪個部分偶爾會出點小問題,但是如果收到驗證碼,既可以手動解決問題后啟動機器人,也可以等待幾小時后的自動重啟。

如果你是網(wǎng)絡(luò)爬取新手,或者不知道為何有些網(wǎng)站花費很大力氣阻止網(wǎng)絡(luò)爬取,那么為構(gòu)建爬蟲寫下第一行代碼前,你一定要多加努力。

谷歌的“網(wǎng)絡(luò)爬取規(guī)范”:

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

系緊安全帶...

導入并打開Chrome瀏覽器標簽頁后,會定義一些循環(huán)中會用到的函數(shù)。這個架構(gòu)的構(gòu)思大概是這樣的:

· 一個函數(shù)用于啟動機器人程序,表明想要搜索的城市和日期。

· 這個函數(shù)獲得首輪搜索結(jié)果,按“最佳”航班排序,然后點擊“加載更多結(jié)果”。

· 另一個函數(shù)會爬取整個頁面,并返回一個dataframe數(shù)據(jù)表。

· 隨后重復步驟2和步驟3,得出按“價格”和“航行時間”排序的結(jié)果。

· 發(fā)送一封簡要總結(jié)價格(最低價和平均價)的郵件,并將帶有這三種排序類型的dataframe數(shù)據(jù)表保存為一份excel文件。

· 以上所有步驟會在循環(huán)中重復,每X小時運行一次。

每個Selenium項目都以一個網(wǎng)頁驅(qū)動器開始。我們使用Chromedriver驅(qū)動器,但還有其它選擇。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函數(shù)令機器人在每次搜索之間隨機睡眠幾秒鐘。這對任何一個機器人來說都是必要屬性。如果運行前面的代碼,應該打開一個Chrome瀏覽器窗口,機器人會在其中導航。

一起來做一個快速測試:在另一個窗口上訪問客涯網(wǎng)(http://kayak.com),選擇往返城市和日期。選擇日期時,確保選擇的是“+-3天”。由于在編寫代碼時考慮到了結(jié)果頁面,所以如果只想搜索特定日期,很可能需要做一些微小的調(diào)整。

點擊搜索按鈕在地址欄獲取鏈接。它應該類似于下面所使用的鏈接,將變量kayak定義為url,并從網(wǎng)頁驅(qū)動器執(zhí)行g(shù)et方法,搜索結(jié)果就會出現(xiàn)。

無論何時,只要在幾分鐘內(nèi)使用get命令超過兩到三次,就會出現(xiàn)驗證碼。實際上可以自己解決驗證碼,并在下一次驗證出現(xiàn)時繼續(xù)進行想要的測試。從測試來看,第一次搜索似乎一直沒有問題,所以如果想運行這份代碼,并讓它在較長的時間間隔后運行,必須解決這個難題。你并不需要十分鐘就更新一次這些價格,對吧?

每個XPath都有陷阱

到目前為止,已經(jīng)打開了一個窗口,獲取了一個網(wǎng)站。為了開始獲取價格和其他信息,需要使用XPath或CSS選擇器,我們選擇了XPath。使用XPath導航網(wǎng)頁可能會令人感到困惑,即使使用從inspector視圖中直接使用“復制XPath”,但這不是獲得所需元素的最佳方法。有時通過“復制XPath”這個方法獲得的鏈接過于針對特定對象,以至于很快就失效了。《Python網(wǎng)絡(luò)數(shù)據(jù)采集》一書很好地解釋了使用XPath和CSS選擇器導航的基礎(chǔ)知識。

接下來,用Python選擇最便宜的結(jié)果。上面代碼中的紅色文本是XPath選擇器,在網(wǎng)頁上任意一處右鍵單擊選擇“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。這次……會成功的。現(xiàn)在就可以告訴你,id元素會在下次加載頁面時更改。每次頁面一加載,字母wtKI會動態(tài)改變,所以只要頁面重新加載,代碼就會失效。花些時間閱讀XPath,保證你會有收獲。

不過,使用復制的方法在不那么“復雜”的網(wǎng)站上工作,也是很好的!

基于以上所展示的內(nèi)容,如果想在一個列表中以幾個字符串的形式獲得所有搜索結(jié)果該怎么辦呢?其實很簡單。每個結(jié)果都在一個對象中,這個對象的類是“resultWrapper”。獲取所有結(jié)果可以通過像下面這樣的for循環(huán)語句來實現(xiàn)。如果你能理解這一部分,應該可以理解接下來的大部分代碼。它基本上指向想要的結(jié)果(結(jié)果包裝器),使用某種方式(XPath)獲得文本,并將其放置在可讀對象中(首先使用flight_containers,然后使用flight_list)。

前三行已展示在圖中,并且可以清楚地看到所需的內(nèi)容,但是有獲得信息的更優(yōu)選擇,需要逐一爬取每個元素。

準備起飛吧!

最容易編寫的函數(shù)就是加載更多結(jié)果的函數(shù),所以代碼由此開始。為了在不觸發(fā)安全驗證的前提下最大化所獲取的航班數(shù)量,每次頁面顯示后,單擊“加載更多結(jié)果”。唯一的新內(nèi)容就是所添加的try語句,因為有時按鈕加載會出錯。如果它對你也有用,只需在前面展示的start_kayak函數(shù)中進行簡要注釋。

# 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

現(xiàn)在,經(jīng)過這么長的介紹,已經(jīng)準備好定義實際爬取頁面的函數(shù)。

我們編譯了下一個函數(shù)page_scrape中的大部分元素。有時這些元素會返回列表插入去程信息和返程信息之間。這里使用了一個簡單的辦法分開它們,比如在第一個 section_a_list和section_b_list變量中,該函數(shù)還返回一個flight_df數(shù)據(jù)表。所以可以分離在不同分類下得到的結(jié)果,之后再把它們合并起來。

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表示旅行的返程信息。接下來說說下一個函數(shù)。

等等,還有什么嗎?

截至目前,已經(jīng)有了一個能加載更多結(jié)果的函數(shù)和一個能爬取其他結(jié)果的函數(shù)。本可以在此結(jié)束這篇文章,而你可以自行手動使用這些函數(shù),并在瀏覽的頁面上使用爬取功能。但是前文提到給自己發(fā)送郵件和一些其他信息的內(nèi)容,這都包含在接下來的函數(shù)start_kayak中。

它要求填入城市名和日期,并由此打開一個kayak字符串中的地址,該字符串直接跳轉(zhuǎn)到“最佳”航班結(jié)果排序頁面。第一次爬取后,可以獲取價格的頂部矩陣,這個矩陣將用于計算平均值和最小值,之后和客涯(Kayak)的預測結(jié)果(頁面左上角)一同發(fā)送到郵件中。這是單一日期搜索時可能導致錯誤的原因之一,因其不包含矩陣元素。

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賬戶測試發(fā)送郵件,但是可以搜索到很多的替代方法,前文提到的那本書中也有其他方法來實現(xiàn)這一點。如果已有一個Hotmail賬戶,只要替換掉個人的詳細信息,它就會開始工作了。

如果想探索腳本的某一部分正在做什么,可以將腳本復制下來并在函數(shù)外使用它。這是徹底理解它的唯一方法。

利用剛才創(chuàng)造的一切

在這些步驟之后,還可以想出一個簡單的循環(huán)來使用剛創(chuàng)造的函數(shù),同時使其持續(xù)運行。完成四個“花式”提示,寫下城市和日期(輸入)。因為測試時不想每次都輸入這些變量,需要的時候可以使用以下這個清楚的方式進行替換。

如果已經(jīng)做到了這一步,恭喜你!改進還有很多,比如與Twilio集成,發(fā)送文本消息而不是郵件。也可以使用VPN或更加難懂的方式同時從多個服務器上研究搜索結(jié)果。還有就是驗證碼的問題,驗證碼會時不時地跳出來,但對此類問題還是有解決辦法的。不過,能走到這里已經(jīng)是有很牢固的基礎(chǔ)了,你可以嘗試添加一些額外的要素。

使用腳本運行測試的示例

留言 點贊 關(guān)注

我們一起分享AI學習與發(fā)展的干貨

歡迎關(guān)注全平臺AI垂類自媒體 “讀芯術(shù)”

css3的transition是直接寫在選擇器上?

寫在哪里是要分情況的,是要看你想要實現(xiàn)什么效果。

1)如果寫在選擇器,如果是寫的rotate等事件,則直接執(zhí)行事件,如果寫的是transtion:all ease 0.5s,那么他在你鼠標移入以及鼠標移出的時候都會發(fā)揮作用。

2)寫在hover上,那么他只會在鼠標移入的時候才執(zhí)行你自己定義的transtion動作,移出沒有效果;