項目4 爬取動態(tài)網(wǎng)頁-獲取圖書基本信息_第1頁
項目4 爬取動態(tài)網(wǎng)頁-獲取圖書基本信息_第2頁
項目4 爬取動態(tài)網(wǎng)頁-獲取圖書基本信息_第3頁
項目4 爬取動態(tài)網(wǎng)頁-獲取圖書基本信息_第4頁
項目4 爬取動態(tài)網(wǎng)頁-獲取圖書基本信息_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

爬取動態(tài)網(wǎng)頁——獲取

圖書基本信息1使用Selenium庫爬取動態(tài)網(wǎng)頁目錄使用逆向分析爬取動態(tài)網(wǎng)頁2存儲數(shù)據(jù)至MongoDB數(shù)據(jù)庫3動態(tài)網(wǎng)頁中數(shù)據(jù)不能使用項目3中介紹的方法獲取。需要通過逆向分析的思路,借助瀏覽器中的開發(fā)者模式,定位目標(biāo)數(shù)據(jù)所在的資源,并確定目標(biāo)數(shù)據(jù)所在的URL。本任務(wù)的目標(biāo)為使用逆向分析的方法獲取某出版社官網(wǎng)“/”中“新書推薦”欄下默認(rèn)的計算機(jī)類的8本圖書的名稱。任務(wù)描述判別網(wǎng)頁的類型。使用Chrome開發(fā)者工具的“網(wǎng)絡(luò)”面板定位目標(biāo)信息所在位置。使用Chrome開發(fā)者工具確定目標(biāo)信息所在網(wǎng)址。使用Requests庫發(fā)送請求,獲取響應(yīng)內(nèi)容。使用JSON格式對響應(yīng)內(nèi)容進(jìn)行解析,提取目標(biāo)信息。任務(wù)分析獲取“新書推薦”欄中計算機(jī)類的8本圖書的名稱,需要先確定目標(biāo)內(nèi)容是靜態(tài)內(nèi)容還是動態(tài)內(nèi)容,基本步驟如下:(1)在瀏覽器中右擊,選擇“查看網(wǎng)頁源代碼”選項,得到當(dāng)前頁面的靜態(tài)源代碼。判別網(wǎng)頁類型(2)使用組合鍵“Ctrl+F”,在當(dāng)前網(wǎng)頁源代碼中進(jìn)行搜索,搜索的內(nèi)容為部分目標(biāo)文字。(3)檢索到的匹配次數(shù)為0次,即通過靜態(tài)的網(wǎng)頁源代碼無法定位到目標(biāo)內(nèi)容,目標(biāo)內(nèi)容采用了動態(tài)加載的方法,需要采用動態(tài)網(wǎng)頁爬取的方法來獲取。判別網(wǎng)頁類型在確認(rèn)網(wǎng)頁是動態(tài)網(wǎng)頁之后,需要獲取在網(wǎng)頁響應(yīng)中由JavaScript動態(tài)加載生成的信息。在Chrome瀏覽器中查找網(wǎng)頁“新書推薦”欄中圖書名稱所在資源,基本步驟如下。(1)按“F12”鍵打開網(wǎng)頁“”的Chrome開發(fā)者工具,選擇“面板網(wǎng)絡(luò)”,并按“F5”鍵進(jìn)行頁面刷新,加載各項資源。獲取動態(tài)網(wǎng)頁信息(2)打開“網(wǎng)絡(luò)”面板后,會發(fā)現(xiàn)有很多響應(yīng)。在“網(wǎng)絡(luò)”面板中,“Fetch/XHR”是AJAX(AsynchronousJavaScriptandXML,異步JavaScript和XML技術(shù))中的概念,表示XML-HTTP-request對象,一般JavaScript加載的文件隱藏在“JS”或“Fetch/XHR”中。通過查找可發(fā)現(xiàn),網(wǎng)頁通過JavaScript加載的文件在“Fetch/XHR”上。在開發(fā)者工具中,可以通過單擊“Fetch/XHR”對加載資源進(jìn)行過濾,篩選XML-HTTP-request對象。獲取動態(tài)網(wǎng)頁信息(3)“新書推薦”欄的信息會在“Fetch/XHR”的“預(yù)覽”標(biāo)簽中顯示。在“網(wǎng)絡(luò)”面板的Fetch/XHR中,查看“getRecommendBookListForPortal”資源的“預(yù)覽”信息,可以看到推薦的圖書名稱。獲取動態(tài)網(wǎng)頁信息爬取“”首頁“新書推薦”欄下的圖書名稱,基本步驟如下。(1)單擊“getRecommendBookListForPortal”資源的“標(biāo)頭”標(biāo)簽,找到“請求網(wǎng)址”。獲取動態(tài)網(wǎng)頁信息獲取動態(tài)網(wǎng)頁信息(2)使用Requests庫向找到的請求網(wǎng)址發(fā)送請求,獲得響應(yīng)內(nèi)容。(3)使用JSON格式,將響應(yīng)內(nèi)容中的圖書名稱提取出來。1使用Selenium庫爬取動態(tài)網(wǎng)頁目錄使用逆向分析爬取動態(tài)網(wǎng)頁2存儲數(shù)據(jù)至MongoDB數(shù)據(jù)庫3動態(tài)網(wǎng)頁內(nèi)容除了可以采用逆向分析方法爬取之外,還可以使用Selenium庫爬取。Selenium庫是一個功能非常強(qiáng)大的自動化測試工具,能模擬瀏覽器的行為,支持多種主流瀏覽器,可以獲取到頁面動態(tài)加載之后的內(nèi)容。本任務(wù)使用Selenium庫,在某出版社官網(wǎng)“/”進(jìn)行單擊、最大化、獲取數(shù)據(jù)等操作,同時掌握Selenium庫的使用方法。任務(wù)描述下載、配置瀏覽器驅(qū)動。使用Selenium庫定位單個目標(biāo)元素、多個目標(biāo)元素。使用Selenium庫對頁面進(jìn)行最大化、關(guān)閉、滾動等操作,對單個可單擊元素進(jìn)行單擊,對文本輸入框進(jìn)行文字輸入操作。使用Selenium庫獲取目標(biāo)標(biāo)簽中的文本、屬性值。使用Selenium庫進(jìn)行窗口切換。使用多種方法實(shí)現(xiàn)頁面等待效果,獲取加載后的內(nèi)容。任務(wù)分析在使用Selenium庫啟動瀏覽器時,需要下載、安裝對應(yīng)的瀏覽器驅(qū)動,下面以Chrome瀏覽器驅(qū)動文件下載和安裝為例介紹基本步驟。(1)確定當(dāng)前瀏覽器的版本號,可以在Chrome瀏覽器中通過“關(guān)于GoogleChrome”查看版本號,如下圖所示。下載瀏覽器驅(qū)動(2)在Chrome瀏覽器驅(qū)動的官網(wǎng)下載對應(yīng)瀏覽器版本和當(dāng)前操作系統(tǒng)版本的驅(qū)動,并將驅(qū)動文件放置到系統(tǒng)路徑中。當(dāng)前瀏覽器版本號為108.0.5359.72,驅(qū)動版本號幾乎沒有和瀏覽器版本完全一致的。選擇盡可能相近的即可(至少保證主版本號一致),本任務(wù)選擇的驅(qū)動版本號為108.0.5359.71。進(jìn)入該驅(qū)動版本對應(yīng)目錄下,選擇對應(yīng)操作系統(tǒng)的文件進(jìn)行下載。根據(jù)操作系統(tǒng)版本,此處下載chromedriver_win32.zip。(3)將下載的壓縮文件解壓,得到chromedriver.exe驅(qū)動文件,將chromedriver.exe驅(qū)動文件放置到安裝Python的根目錄(與python.exe文件同一目錄)下。下載瀏覽器驅(qū)動打開瀏覽器并訪問頁面使用Selenium可以模擬用戶的行為,操控瀏覽器進(jìn)行相應(yīng)的動作。使用Selenium庫驅(qū)動瀏覽器打開網(wǎng)頁/。元素選取1.單個元素選取在Selenium4.7.2版本中,find_element_by_xx用法已被廢棄,當(dāng)前使用find_element()方法實(shí)現(xiàn)單個元素選取功能。find_element()方法的基本語法格式如下。WebDriver.find_element(by=By.ID,value:Optional[str]=None)定位的策略當(dāng)前定位策略對應(yīng)的值元素選取定位策略說明By.ID通過HTML標(biāo)簽的id屬性值定位元素By.NAME通過HTML標(biāo)簽的name屬性值定位元素By.CLASS_NAME通過HTML標(biāo)簽的class屬性值定位元素By.TAG_NAME通過HTML標(biāo)簽的標(biāo)簽名定位元素By.LINK_TEXT通過HTML標(biāo)簽的超鏈接文本定位元素By.PARTICAL_LINK_TEXT通過HTML標(biāo)簽的部分超鏈接文本定位元素By.CSS_SELECTOR通過HTML標(biāo)簽的CSS選擇器規(guī)則定位元素By.XPATH通過HTML標(biāo)簽的Xpath規(guī)則定位元素find_element()方法返回的結(jié)果是一個WebElement類型的對象,如果需要提取該對象標(biāo)簽中的文本信息,那么需要使用該對象的text屬性。如果需要提取該對象標(biāo)簽的某個屬性值,那么需要用到get_attribute()方法。除了使用Xpath定位之外,還可以使用其他的方式定位,如browser.find_element(By.CSS_SELECTOR,'div.row>a:nth-child(1)')、browser.find_element(By.LINK_TEXT,'首頁')等。元素選取多個元素的選取方法find_elements()與單個元素的選取方法find_element()的兩個參數(shù)作用是一致的,find_elements()方法的基本語法格式如下,其中,參數(shù)by的取值及說明可以參照前面的表。find_elements()方法返回的結(jié)果是一個列表,列表中的每個元素是WebElement類型的對象。元素選取2.多個元素選取WebDriver.find_elements(by=By.ID,value:Optional[str]=None)表示定位的策略表示當(dāng)前定位策略對應(yīng)的值當(dāng)使用find_element()方法定位單個元素時,若有多個符合條件的元素,則只返回符合條件的第一個元素;若沒有符合條件的元素被定位到,則程序會報錯。當(dāng)使用find_elements()方法定位多個元素時,返回的是符合條件的元素列表,若沒有符合條件的元素,則返回空列表。使用find_elements()方法定位多張圖片,并使用screenshot_as_png()方法對每個WebElement對象所選中的圖片標(biāo)簽的對應(yīng)圖片進(jìn)行截圖保存。如果需要通過<img>標(biāo)簽的src屬性值的對應(yīng)網(wǎng)址,將圖片保存下來,那么通常需要借助Requests庫發(fā)送請求,將得到的響應(yīng)的content值保存下來,即可得到原圖片。元素選取使用find_element()方法定位單個元素或find_elements()方法定位多個元素后,可以對不同WebElement對象進(jìn)行不同交互操作。例如,對于可單擊的<a>標(biāo)簽,進(jìn)行單擊操作;對于可以輸入文本的<input>標(biāo)簽,進(jìn)行輸入文字的操作等。元素交互在網(wǎng)頁中經(jīng)常有一些按鈕、超鏈接可以單擊,Selenium庫可以通過click()方法對定位到的元素進(jìn)行單擊。元素交互1.單擊在網(wǎng)頁中,各種文本輸入框十分常見,如各購物網(wǎng)站中用戶可以根據(jù)自己的需求進(jìn)行檢索。在網(wǎng)頁“/”的首頁也存在文本輸入框,用于檢索圖書。通過Selenium庫輸入文字,需要在定位到文本輸入框元素的前提下,使用send_keys()方法,向該文本輸入框中輸入內(nèi)容。在輸入結(jié)束后,通過使用“Enter”鍵或單擊“搜索”按鈕進(jìn)行搜索。在輸入文字之后,若需要從使用“Enter”鍵進(jìn)行搜索,則需要加載Keys模塊。元素交互2.輸入文字使用Selenium庫打開的瀏覽器窗口大小是默認(rèn)的,可以采用maximize_window()方法實(shí)現(xiàn)瀏覽器窗口的最大化。maximize_window()方法的基本語法格式如下。頁面操作1.頁面交互WebDriver.maximize_window()在瀏覽器打開后,即使程序執(zhí)行完成,瀏覽器仍不會自動關(guān)閉,此時,需要使用quit()或close()方法主動關(guān)閉瀏覽器。quit()方法表示關(guān)閉整個瀏覽器,即不管瀏覽器打開多少個窗口,都全部關(guān)閉。close()方法表示關(guān)閉當(dāng)前窗口,如果當(dāng)前瀏覽器僅打開一個窗口,那么效果和quit()方法的效果一樣。quit()方法與close()方法的基本語法格式如下。頁面操作WebDriver.quit()WebDriver.close()網(wǎng)頁操作中經(jīng)常需要滾動鼠標(biāo),瀏覽頁面中其他內(nèi)容,頁面滾動操作可以通過Selenium庫中的execute_script()方法執(zhí)行JavaScript代碼實(shí)現(xiàn),該方法的基本語法格式如下。頁面操作WebDriver.execute_script(script,*args)需要執(zhí)行的JavaScript代碼JavaScript代碼所用到的其他參數(shù)在對網(wǎng)頁進(jìn)行操作時,可以通過save_screenshot()方法對當(dāng)前標(biāo)簽頁面進(jìn)行截圖。save_screenshot()方法的基本語法格式如下。頁面操作WebDriver.save_screenshot(filename)要保存的文件完整路徑,要求文件擴(kuò)展名為.png當(dāng)單擊網(wǎng)頁鏈接時,瀏覽器經(jīng)常會以新的窗口呈現(xiàn)鏈接對應(yīng)的內(nèi)容。在Selenium庫中,需要通過窗口切換來控制當(dāng)前窗口,否則默認(rèn)當(dāng)前窗口是一直是最開始打開的窗口。而窗口切換需要先獲取到當(dāng)前瀏覽器的所有窗口的句柄,并返回一個窗口句柄列表,然后通過WebDriver.switch_to.window()方法切換到指定窗口。頁面操作2.頁面切換當(dāng)使用瀏覽器加載頁面時,一般要等待頁面元素加載完成后,才能執(zhí)行某些操作,否則會出現(xiàn)找不到某元素等錯誤。在這種要求下,某些場景需要加入等待時間。根據(jù)等待方式的不同,可以將頁面等待劃分為強(qiáng)制等待、隱式等待和顯式等待。頁面等待利用time模塊中的sleep()方法實(shí)現(xiàn),不管頁面是否加載完成,都要強(qiáng)制等待一段時間,時間到達(dá)后,才會執(zhí)行后續(xù)的代碼。但使用此等待方式,會比較呆板,影響代碼的執(zhí)行效率。頁面等待1.強(qiáng)制等待設(shè)置一個隱式等待時間后,如果在這個時間內(nèi),網(wǎng)頁加載完成,那么會執(zhí)行下一步操作,否則會一直等到超時,才執(zhí)行下一步操作。隱式等待方式也存在弊端,即用戶所需的元素已加載完成,而其他元素加載較慢,仍要等待所有元素加載完成后,才會執(zhí)行下一步操作,時間上有所增加。注意:當(dāng)使用隱式等待時,僅需要對某個窗口設(shè)置一次。頁面等待2.隱式等待顯式等待需要用到WebDriverWait類,其基本語法格式如下。頁面等待3.顯式等待WebDriverWait(driver,timeout:float,poll_frequency:float=POLL_FREQUENCY,ignored_exceptions:typing.Optional[WaitExcTypes]=None)用于接收一個WebDriver對象設(shè)置在調(diào)用過程中需要忽略的異常類超時時間設(shè)置每隔多少秒檢測一次WebDriverWait要結(jié)合該類的unitl()和unitl_not()方法來使用,還需要導(dǎo)入一個類expected_conditions,用于判斷預(yù)期條件是否達(dá)成。expected_conditions類的常見判斷方法如表。頁面等待方法作用title_is()判斷當(dāng)前頁面的標(biāo)題是否為某內(nèi)容title_contains()判斷當(dāng)前頁面的標(biāo)題是否包含某內(nèi)容presence_of_element_located()判斷某元素是否被加載出visibility_of_element_located()判斷某個地址是否可見visibility_of()判斷某個元素是否可見頁面等待方法作用presence_of_all_elements_located()判斷是否至少有一個元素加載出text_to_be_present_in_element()判斷某個元素文本是否包含某文字text_to_be_present_in_element_value()判斷某個元素值是否包含某文字frame_to_be_available_and_switch_to_it()判斷窗口是否加載并切換invisibility_of_element_located()判斷某個元素是否不存在或不可見element_to_be_clickable()判斷某個可單擊元素是否可見staleness_of()判斷一個元素是否仍在DOM中,可判斷頁面是否已經(jīng)刷新element_to_be_selected()判斷某個元是否被選擇,傳入元素對象(續(xù)上表)頁面等待方法作用element_located_to_be_selected()判斷某個元是否被選擇,傳入定位元組element_selection_state_to_be()判斷某個元素選中狀態(tài)是否與預(yù)期一致,一致返回True,否則返回Falseelement_located_selection_state_to_be()判斷某個地址選中狀態(tài)是否與預(yù)期一致,一致返回True,否則返回Falsealert_is_present()判斷當(dāng)前頁面是否出現(xiàn)Alert(續(xù)上表)1使用Selenium庫爬取動態(tài)網(wǎng)頁目錄使用逆向分析爬取動態(tài)網(wǎng)頁2存儲數(shù)據(jù)至MongoDB數(shù)據(jù)庫3爬蟲通過解析網(wǎng)頁獲取頁面中的數(shù)據(jù)后,可以將數(shù)據(jù)存放到MongoDB數(shù)據(jù)庫中。使用PyMongo庫將Selenium解析得到導(dǎo)航欄中標(biāo)題文字存儲至MongoDB數(shù)據(jù)庫中。任務(wù)描述了解MongoDB數(shù)據(jù)庫和MySQL數(shù)據(jù)庫的區(qū)別。使用PyMongo庫將解析得到的文本內(nèi)容存儲至MongoDB數(shù)據(jù)庫中。任務(wù)分析MongoDB數(shù)據(jù)庫是一個年輕的非結(jié)構(gòu)化數(shù)據(jù)庫產(chǎn)品,其穩(wěn)定性不及傳統(tǒng)的MySQL數(shù)據(jù)庫。MongoDB屬于典型的“空間換時間”類型的數(shù)據(jù)庫產(chǎn)品。數(shù)據(jù)庫擴(kuò)展是非常有挑戰(zhàn)性的,當(dāng)存儲的表格大小達(dá)到5~10GB時,如果需要分片并且分割數(shù)據(jù)庫,那么MySQL的性能會降低,但MongoDB很容易實(shí)現(xiàn)這一點(diǎn)。另外,MongoDB是以BSON(BinaryJSON,二進(jìn)制JSON)結(jié)構(gòu)進(jìn)行存儲的,對海量數(shù)據(jù)存儲有著很明顯的優(yōu)勢。傳統(tǒng)的MySQL數(shù)據(jù)庫一般由數(shù)據(jù)庫(database)、表(table)、記錄(record)3個層次組成,而MongoDB是由數(shù)據(jù)庫(database)、集合(collection)、文檔(document)這3個層次組成的。MongoDB數(shù)據(jù)庫和MySQL數(shù)據(jù)庫的區(qū)別MySQL中的概念和MongoDB中的概念的對比如表。MongoDB數(shù)據(jù)庫和MySQL數(shù)據(jù)庫的區(qū)別MySQL中的概念說明MongoDB中的概念說明database數(shù)據(jù)庫database數(shù)據(jù)庫table數(shù)據(jù)庫表collection數(shù)據(jù)庫文檔集合record數(shù)據(jù)庫表中的行/記錄document數(shù)據(jù)庫文檔column數(shù)據(jù)庫表中的列/字段field數(shù)據(jù)庫文檔域index索引index索引primarykey主鍵primarykey主鍵MySQL和MongoDB的基本操作命令的對比如表。MongoDB數(shù)據(jù)庫和MySQL數(shù)據(jù)庫的區(qū)別操作說明MySQLMongoDB顯示庫數(shù)據(jù)列表showdatabases;showdbs進(jìn)入數(shù)據(jù)庫usedbname;usemydb創(chuàng)建數(shù)據(jù)庫createdatabasename;無須單獨(dú)創(chuàng)建,使用show后,默認(rèn)創(chuàng)建庫創(chuàng)建表/集合createtabletname(idint);無須單獨(dú)創(chuàng)建,直接插入數(shù)據(jù)刪除表/集合droptabletname;db.tname.drop()刪除數(shù)據(jù)庫dropdatabasedbname;首先進(jìn)入該數(shù)據(jù)庫,然后使用db.dropDatabase()命令MongoDB數(shù)據(jù)庫和MySQL數(shù)據(jù)庫的區(qū)別操作說明MySQLMongoDB插入記錄/文檔insertintotname(id)value(1);db.tname.insert({id:1})刪除記錄/文檔deletefromtnamewhereid=1;db.tname.remove({id:1})查詢所有記錄/文檔select*fromtname;db.tname.find()條件查詢select*fromtnamewhereid=2;db.tname.find({id:2})多條件查詢select*fromtnamewhereid=2orname='python';db.tname.find($or:[{id:2},{name:'python'}])查詢一條數(shù)據(jù)select*fromtnamelimit1;db.tname.findone()獲取表記錄/文檔數(shù)selectcount(id)fromtname;db.tname.count()(續(xù)上表)要使用PyMongo操作MongoDB數(shù)據(jù)庫,首先需要初始化數(shù)據(jù)庫連接。如果MongoDB在本地電腦上運(yùn)行,而且也沒有修改端口或添加用戶名和密碼,那么初始化MongoClient的實(shí)例不需要帶任何參數(shù)。如果MongoDB在其他服務(wù)器上運(yùn)行,那么需要使用統(tǒng)一資源標(biāo)識符(Uni

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論