Stewartbury, AA
Table of Contents
What Is Web Scraping?
Reasons for Web Scraping
Challenges of Web Scraping
An Alternative to Web Scraping: APIs
Scrape the Fake Python Job Site
Step 1: Inspect Your Data Source
Explore the Website
Decipher the Information in URLs
Inspect the Site Using Developer Tools
Step 2: Scrape HTML Content From a Page
Static Websites
Hidden Websites
Dynamic Websites
Step 3: Parse HTML Code With Beautiful Soup
Find Elements by ID
Find Elements by HTML Class Name
Extract Text From HTML Elements
Find Elements by Class Name and Text Content
Pass a Function to a Beautiful Soup Method
Identify Error Conditions
Access Parent Elements
Extract Attributes From HTML Elements
Keep Practicing
Conclusion
Internet 上數量驚人的數據是任何研究領域或個人興趣的豐富資源。為了有效地收集這些數據,您需要熟練掌握網絡抓取。Python 庫requests和 Beautiful Soup 是完成這項工作的強大工具。如果您喜歡通過動手示例學習并且對 Python 和 HTML 有基本的了解,那么本教程適合您。
在本教程中,您將學習如何:
使用瀏覽器的開發工具檢查目標站點的HTML 結構
解密URL 中編碼的數據
使用requestsand Beautiful Soup從網絡上抓取和解析數據
通過一個步驟網頁抓取管道從開始到結束
構建一個從 Web 獲取工作機會并在您的控制臺中顯示相關信息的腳本
完成這個項目將使您了解在萬維網上抓取任何靜態網站所需的過程和工具。您可以點擊以下鏈接下載項目源代碼:
什么是網頁抓???
Web 抓取是從 Internet 收集信息的過程。甚至復制和粘貼您最喜歡的歌曲的歌詞也是一種網絡抓取形式!但是,“網頁抓取”一詞通常指的是涉及自動化的過程。一些網站不喜歡自動抓取工具收集他們的數據,而另一些網站則不介意。
如果您出于教育目的而恭敬地抓取頁面,那么您不太可能遇到任何問題。盡管如此,在開始大型項目之前,自己做一些研究并確保沒有違反任何服務條款是個好主意。
網頁抓取的原因
假設您是在線和現實生活中的沖浪者,并且您正在尋找工作。但是,您并不是在尋找任何工作。以沖浪者的心態,您正在等待一個完美的機會!
有一個工作網站可以準確地提供您想要的工作類型。不幸的是,一個新職位只會在藍月亮中彈出一次,并且該網站不提供電子郵件通知服務。你想每天檢查它,但這聽起來并不是最有趣和最有效的消磨時間的方式。
值得慶幸的是,世界提供了其他方式來應用沖浪者的心態!您可以使用 Python 來幫助自動化您求職中的重復部分,而不是每天查看工作現場。自動網頁抓取可以成為加快數據收集過程的解決方案。您編寫一次代碼,它將多次從許多頁面中獲取您想要的信息。
相比之下,當您嘗試手動獲取所需信息時,您可能會花費大量時間點擊、滾動和搜索,尤其是當您需要來自定期更新新內容的網站的大量數據時。手動網頁抓取可能需要大量時間和重復。
網絡上有如此多的信息,并且不斷添加新信息。您可能至少會對其中的一些數據感興趣,而且其中大部分只是為了獲取。無論您是真的在找工作還是想下載您最喜歡的藝術家的所有歌詞,自動網絡抓取都可以幫助您實現目標。
網頁抓取的挑戰
Web 已經從許多來源有機地發展起來。它結合了許多不同的技術、風格和個性,并且一直發展到今天。換句話說,Web 一團糟!因此,您在抓取 Web 時會遇到一些挑戰:
多樣性:每個網站都不同。雖然您會遇到重復的一般結構,但每個網站都是獨一無二的,如果您想提取相關信息,則需要對其進行個性化處理。
耐用性:網站不斷變化。假設您已經構建了一個閃亮的新網絡抓取工具,它會自動從您感興趣的資源中挑選出您想要的內容。第一次運行腳本時,它可以完美運行。但是,當您在不久之后運行相同的腳本時,您會遇到令人沮喪且冗長的回溯堆棧!
不穩定的腳本是一個現實的場景,因為許多網站都在積極開發中。一旦站點的結構發生變化,您的抓取工具可能無法正確導航站點地圖或找到相關信息。好消息是,對網站的許多更改都是 小的和增量的,因此您可能只需進行最少的調整就可以更新您的抓取工具。
但是,請記住,由于 Internet 是動態的,您將構建的抓取工具可能需要不斷維護。您可以設置持續集成以定期運行抓取測試,以確保您的主腳本不會在您不知情的情況下中斷。
網頁抓取的替代方案:API
一些網站提供商提供應用程序編程接口 (API),允許您以預定義的方式訪問他們的數據。使用 API,您可以避免解析 HTML。相反,您可以使用JSON和 XML等格式直接訪問數據。HTML 主要是一種以視覺方式向用戶呈現內容的方式。
當您使用 API 時,該過程通常比通過網絡抓取收集數據更穩定。那是因為開發人員創建的 API 是供程序而不是人眼使用的。
網站的前端呈現可能經常發生變化,但網站設計的這種變化不會影響其 API 結構。API 的結構通常更持久,這意味著它是更可靠的站點數據來源。
但是,API也可能會發生變化。多樣性和持久性的挑戰適用于 API,就像它們適用于網站一樣。此外,如果提供的文檔缺乏質量,則自己檢查 API 的結構要困難得多。
使用 API 收集信息所需的方法和工具超出了本教程的范圍。要了解更多信息,請查看Python 中的 API 集成。
抓取虛假的 Python 工作站點
在本教程中,您將構建一個 Web 抓取工具,從Fake Python Jobs站點獲取 Python 軟件開發人員的職位列表。這是一個帶有虛假招聘信息的示例網站,您可以隨意抓取這些信息以訓練您的技能。您的網絡抓取工具將解析網站上的 HTML 以挑選相關信息并針對特定詞過濾該內容。
注意:本教程的先前版本側重于抓取Monster工作板,此后已更改并且不再提供靜態 HTML 內容。本教程的更新版本側重于自托管靜態站點,該站點保證保持不變,并為您提供一個可靠的操場來練習網絡抓取所需的技能。
您可以抓取 Internet 上可以查看的任何站點,但這樣做的難度取決于站點。本教程向您介紹了網頁抓取,以幫助您了解整個過程。然后,您可以對要抓取的每個網站應用相同的過程。
步驟 1:檢查您的數據源
在編寫任何 Python 代碼之前,您需要了解要抓取的網站。這應該是您想要解決的任何網絡抓取項目的第一步。您需要了解站點結構才能提取與您相關的信息。首先使用您喜歡的瀏覽器打開您想要抓取的網站。
瀏覽網站
單擊該站點并與其進行交互,就像任何典型的求職者一樣。例如,您可以滾動瀏覽網站的主頁:
您可以看到許多卡片格式的招聘信息,每個招聘信息都有兩個按鈕。如果單擊應用,您將看到一個新頁面,其中包含所選工作的更詳細說明。您可能還會注意到,當您與網站交互時,瀏覽器地址欄中的 URL 會發生變化。
破譯 URL 中的信息
程序員可以在 URL 中編碼大量信息。如果您首先熟悉 URL 的工作原理以及它們的構成,您的網絡抓取之旅將會容易得多。例如,您可能會發現自己位于具有以下 URL 的詳細信息頁面上:
https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html
您可以將上述 URL 解構為兩個主要部分:
基本 URL表示網站搜索功能的路徑。在上面的示例中,基本 URL 是https://realpython.github.io/fake-jobs/.
以 結尾的特定站點位置.html是職位描述唯一資源的路徑。
本網站上發布的任何職位都將使用相同的基本 URL。但是,獨特資源的位置會有所不同,具體取決于您正在查看的具體職位發布。
URL 可以包含更多信息,而不僅僅是文件的位置。某些網站使用查詢參數對您在執行搜索時提交的值進行編碼。您可以將它們視為發送到數據庫以檢索特定記錄的查詢字符串。
您將在 URL 末尾找到查詢參數。例如,如果您轉到Indeed并通過他們的搜索欄在“澳大利亞”中搜索“軟件開發人員”,您將看到 URL 更改為包含這些值作為查詢參數:
https://au.indeed.com/jobs?q=software+developer&l=Australia
此 URL 中的查詢參數為?q=software+developer&l=Australia.?查詢參數由三部分組成:
開始:查詢參數的開頭用問號 (??) 表示。
信息:構成一個查詢參數的信息片段被編碼為鍵值對,其中相關的鍵和值通過等號 (?key=value)連接在一起。
分隔符:每個 URL 可以有多個查詢參數,由與符號 (?&)分隔。
有了這些信息,您就可以將 URL 的查詢參數分成兩個鍵值對:
q=software+developer?選擇作業類型。
l=Australia?選擇作業的位置。
嘗試更改搜索參數并觀察它如何影響您的 URL。繼續并在頂部的搜索欄中輸入新值:
接下來,嘗試直接更改 URL 中的值??纯磳⒁韵?URL 粘貼到瀏覽器地址欄中會發生什么:
https://au.indeed.com/jobs?q=developer&l=perth
如果您更改并提交網站搜索框中的值,那么它將直接反映在 URL 的查詢參數中,反之亦然。如果您更改其中任何一個,那么您將在網站上看到不同的結果。
如您所見,瀏覽網站的 URL 可以讓您深入了解如何從網站的服務器檢索數據。
回到Fake Python Jobs并繼續探索它。該站點是一個純靜態網站,不在數據庫之上運行,這就是為什么您不必在本抓取教程中使用查詢參數的原因。
使用開發人員工具檢查站點
接下來,您需要詳細了解數據的結構以進行顯示。您需要了解頁面結構,才能從接下來的步驟之一中收集的 HTML 響應中選擇您想要的內容。
開發人員工具可以幫助您了解網站的結構。所有現代瀏覽器都安裝了開發人員工具。在本節中,您將了解如何使用 Chrome 中的開發人員工具。該過程將與其他現代瀏覽器非常相似。
在 macOS 上的 Chrome 中,您可以通過選擇View?→?Developer?→?Developer Tools通過菜單打開開發者工具。在 Windows 和 Linux 上,您可以通過單擊右上角的菜單按鈕 (??) 并選擇更多工具→開發人員工具來訪問它們。您還可以通過右鍵單擊頁面并選擇“檢查”選項或使用鍵盤快捷鍵來訪問您的開發人員工具:
蘋果:?Cmd+?Alt+I
Windows/Linux:?Ctrl+Shift+I
開發人員工具允許您以交互方式探索站點的文檔對象模型 (DOM)以更好地了解您的來源。要深入了解頁面的 DOM,請在開發人員工具中選擇Elements選項卡。您將看到一個包含可點擊 HTML 元素的結構。您可以直接在瀏覽器中展開、折疊甚至編輯元素:
您可以將瀏覽器中顯示的文本視為該頁面的 HTML 結構。如果您有興趣,那么您可以在CSS-TRICKS上閱讀有關 DOM 和 HTML 之間差異的更多信息。
當您右鍵單擊頁面上的元素時,您可以選擇“檢查”以縮放到它們在 DOM 中的位置。您還可以將鼠標懸停在右側的 HTML 文本上,然后查看頁面上的相應元素亮起。
單擊以展開特定任務的練習塊以練習使用您的開發人員工具:
練習:探索 HTML顯示隱藏
四處玩耍和探索!您對正在使用的頁面了解得越多,抓取它就越容易。但是,不要被所有的 HTML 文本弄得不知所措。您將利用編程的力量逐步穿越這個迷宮并精心挑選與您相關的信息。
第 2 步:從頁面中抓取 HTML 內容
現在您已經了解了您正在使用的內容,現在是開始使用 Python 的時候了。首先,您需要將站點的 HTML 代碼放入您的 Python 腳本中,以便您可以與其進行交互。對于此任務,您將使用 Python 的requests庫。
在安裝任何外部包之前,為您的項目創建一個虛擬環境。激活新的虛擬環境,然后在終端中鍵入以下命令以安裝外部requests庫:
$ python -m pip install requests
然后在您喜歡的文本編輯器中打開一個新文件。檢索 HTML 所需的只是幾行代碼:
import requests URL = "https://realpython.github.io/fake-jobs/" page = requests.get(URL) print(page.text)
此代碼向給定的 URL發出HTTPGET請求。它檢索服務器發回的 HTML 數據并將該數據存儲在 Python 對象中。
如果您打印的.text屬性page,那么您會注意到它看起來就像您之前使用瀏覽器的開發人員工具檢查過的 HTML。您已成功從 Internet 獲取靜態站點內容!您現在可以從 Python 腳本中訪問站點的 HTML。
靜態網站
您在本教程中抓取的網站提供靜態 HTML 內容。在這種情況下,托管站點的服務器發回 HTML 文檔,這些 HTML 文檔已經包含您作為用戶可以看到的所有數據。
當您之前使用開發人員工具檢查頁面時,您發現招聘信息由以下長而雜亂的 HTML 組成:
Stewartbury, AA
將你的頭包裹在很長的 HTML 代碼塊中可能具有挑戰性。為了更容易閱讀,您可以使用HTML 格式化程序來自動清理它。良好的可讀性有助于您更好地理解任何代碼塊的結構。雖然它可能有助于也可能不會幫助改進 HTML 格式,但它總是值得一試。
注意:請記住,每個網站的外觀都不同。這就是為什么在繼續之前有必要檢查和了解您當前正在使用的站點的結構的原因。
您將遇到的 HTML 有時會令人困惑。幸運的是,此工作板的 HTML 對您感興趣的元素具有描述性類名稱:
class="title is-5"?包含職位發布的標題。
class="subtitle is-6 company"?包含提供該職位的公司名稱。
class="location"?包含您將工作的位置。
如果您在一大堆 HTML 中迷失了方向,請記住,您始終可以返回瀏覽器并使用開發人員工具以交互方式進一步探索 HTML 結構。
到目前為止,您已經成功地利用了 Pythonrequests庫的強大功能和用戶友好設計。僅用幾行代碼,您就成功地從 Web 中抓取了靜態 HTML 內容并使其可用于進一步處理。
但是,在抓取網站時可能會遇到更具挑戰性的情況。在您學習如何從剛剛抓取的 HTML 中挑選相關信息之前,您將快速了解其中兩個更具挑戰性的情況。
隱藏網站
某些頁面包含隱藏在登錄名后面的信息。這意味著您需要一個帳戶才能從頁面上抓取任何內容。從 Python 腳本發出 HTTP 請求的過程與從瀏覽器訪問頁面的方式不同。僅僅因為您可以通過瀏覽器登錄頁面并不意味著您可以使用 Python 腳本抓取它。
但是,該requests庫具有處理身份驗證的內置能力。使用這些技術,您可以在從 Python 腳本發出 HTTP 請求時登錄網站,然后抓取隱藏在登錄名后面的信息。您無需登錄即可訪問工作板信息,這就是本教程不涉及身份驗證的原因。
動態網站
在本教程中,您將學習如何抓取靜態網站。靜態站點易于使用,因為服務器會向您發送一個 HTML 頁面,該頁面已包含響應中的所有頁面信息。您可以解析該 HTML 響應并立即開始挑選相關數據。
另一方面,對于動態網站,服務器可能根本不會發回任何 HTML。相反,您可以接收JavaScript代碼作為響應。此代碼看起來與您使用瀏覽器的開發人員工具檢查頁面時看到的完全不同。
注意:在本教程中,術語動態網站是指不返回您在瀏覽器中查看頁面時看到的相同 HTML 的網站。
許多現代 Web 應用程序旨在與客戶端的瀏覽器協作提供其功能。這些應用程序不會發送 HTML 頁面,而是發送JavaScript代碼,指示您的瀏覽器創建所需的 HTML。Web 應用程序以這種方式提供動態內容,以將工作從服務器卸載到客戶端的計算機,并避免頁面重新加載并改善整體用戶體驗。
瀏覽器中發生的事情與腳本中發生的事情不同。您的瀏覽器會認真執行它從服務器接收到的 JavaScript 代碼,并在本地為您創建 DOM 和 HTML。但是,如果您在 Python 腳本中請求動態網站,那么您將無法獲得 HTML 頁面內容。
當您使用 時requests,您只會收到服務器發回的內容。對于動態網站,您最終會得到一些 JavaScript 代碼而不是 HTML。從您收到的 JavaScript 代碼轉到您感興趣的內容的唯一方法是執行代碼,就像您的瀏覽器一樣。該requests庫不能為你做的,但也有其他的解決方案,可以。
注意:另一個用于抓取動態內容的流行選擇是Selenium。您可以將 Selenium 視為一個精簡的瀏覽器,它會在將呈現的 HTML 響應傳遞給您的腳本之前為您執行 JavaScript 代碼。
在本教程中,您不會更深入地抓取動態生成的內容。現在,如果您需要抓取動態網站,只需記住查看上述選項之一就足夠了。
第 3 步:使用 Beautiful Soup 解析 HTML 代碼
您已經成功地從 Internet 上抓取了一些 HTML,但是當您查看它時,它似乎一團糟。到處都有成噸的 HTML 元素,散布著成千上萬的屬性——難道不也混入了一些 JavaScript 嗎?是時候在 Python 的幫助下解析這個冗長的代碼響應,使其更易于訪問并挑選出您想要的數據。
Beautiful Soup是一個用于解析結構化數據的 Python 庫。它允許您以類似于使用開發人員工具與網頁交互的方式與 HTML 交互。該庫公開了一些直觀的功能,您可以使用它們來探索您收到的 HTML。首先,使用您的終端安裝 Beautiful Soup:
$ python -m pip install beautifulsoup4
然后,在您的 Python 腳本中導入庫并創建一個 Beautiful Soup 對象:
import requests from bs4 import BeautifulSoup URL = "https://realpython.github.io/fake-jobs/" page = requests.get(URL) soup = BeautifulSoup(page.content, "html.parser")
添加突出顯示的兩行代碼后,您將創建一個 Beautiful Soup 對象page.content,該對象將,即您之前抓取的 HTML 內容,作為其輸入。
注意:您將希望通過page.content而不是page.text避免字符編碼問題。該.content屬性保存原始字節,可以比您之前使用該.text屬性打印的文本表示更好地解碼。
第二個參數"html.parser"確保您對 HTML 內容使用適當的解析器。
按 ID 查找元素
在 HTML 網頁中,每個元素都可以id分配一個屬性。顧名思義,該id屬性使元素在頁面上唯一可識別。您可以通過按 ID 選擇特定元素來開始解析您的頁面。
切換回開發人員工具并確定包含所有職位發布的 HTML 對象。通過將鼠標懸停在頁面的部分上并使用右鍵單擊Inspect來探索。
注意:定期切換回瀏覽器并使用開發人員工具交互式瀏覽頁面會有所幫助。這有助于您了解如何找到您正在尋找的確切元素。
您要查找的元素是具有值為
Beautiful Soup 允許您通過 ID 查找特定的 HTML 元素:
results = soup.find(id="ResultsContainer")
為了更容易查看,您可以在打印時美化任何 Beautiful Soup 對象。如果您調用上面剛剛分配.prettify()的results變量,那么您將看到包含在以下內容中的所有 HTML?
print(results.prettify())
當您使用元素的 ID 時,您可以從 HTML 的其余部分中挑選一個元素?,F在,您只能使用頁面 HTML 的這一特定部分。湯好像變稀了!然而,它仍然非常密集。
按 HTML 類名查找元素
您已經看到每個職位發布都包含在一個
job_elements = results.find_all("div", class_="card-content")
在這里,您調用.find_all()一個 Beautiful Soup 對象,它返回一個包含該頁面上顯示的所有工作列表的所有 HTML的可迭代對象。
看看所有這些:
for job_element in job_elements: print(job_element, end="\n"*2)
這已經很整潔了,但還有很多 HTML!您之前看到您的頁面在某些元素上具有描述性的類名。您可以使用.find()以下命令從每個職位發布中挑選出這些子元素:
for job_element in job_elements: title_element = job_element.find("h2", class_="title") company_element = job_element.find("h3", class_="company") location_element = job_element.find("p", class_="location") print(title_element) print(company_element) print(location_element) print()
每個job_element都是另一個BeautifulSoup()對象。因此,您可以對其使用與其父元素相同的方法,results.
使用此代碼片段,您會越來越接近您真正感興趣的數據。 盡管如此,所有這些 HTML 標記和屬性仍然存在很多問題:
Stewartbury, AA
接下來,您將學習如何縮小此輸出范圍以僅訪問您感興趣的文本內容。
從 HTML 元素中提取文本
您只想查看每個職位發布的標題、公司和地點??茨?!Beautiful Soup 已滿足您的需求。您可以添加.text到 Beautiful Soup 對象以僅返回該對象包含的 HTML 元素的文本內容:
for job_element in job_elements: title_element = job_element.find("h2", class_="title") company_element = job_element.find("h3", class_="company") location_element = job_element.find("p", class_="location") print(title_element.text) print(company_element.text) print(location_element.text) print()
運行上面的代碼片段,您將看到顯示的每個元素的文本。但是,您也可能會得到一些額外的whitespace。由于您現在正在使用Python 字符串,因此您可以.strip()使用多余的空格。您還可以應用任何其他熟悉的 Python 字符串方法來進一步清理您的文本:
for job_element in job_elements: title_element = job_element.find("h2", class_="title") company_element = job_element.find("h3", class_="company") location_element = job_element.find("p", class_="location") print(title_element.text.strip()) print(company_element.text.strip()) print(location_element.text.strip()) print()
結果最終看起來好多了:
Senior Python Developer Payne, Roberts and Davis Stewartbury, AA Energy engineer Vasquez-Davidson Christopherville, AA Legal executive Jackson, Chambers and Levy Port Ericaburgh, AA
這是一個可讀的工作列表,其中還包括公司名稱和每個工作的位置。但是,您正在尋找軟件開發人員的職位,這些結果還包含許多其他領域的招聘信息。
按類名和文本內容查找元素
并非所有職位列表都是開發人員職位。您將首先使用關鍵字過濾它們,而不是打印出網站上列出的所有工作。
您知道頁面中的職位名稱保存在
python_jobs = results.find_all("h2", string="Python")
此代碼查找
>>>
>>> print(python_jobs) []
還有就是在搜索結果中一個Python的工作,所以為什么不顯示出來?
當您string=像上面那樣使用時,您的程序會準確地查找該字符串。拼寫、大寫或空格的任何差異都會阻止元素匹配。在下一節中,您將找到一種使搜索字符串更通用的方法。
將函數傳遞給美麗的湯方法
除了字符串之外,您有時還可以將函數作為參數傳遞給 Beautiful Soup 方法。您可以更改前一行代碼以使用函數:
python_jobs = results.find_all( "h2", string=lambda text: "python" in text.lower() )
現在您將匿名函數傳遞給string=參數。該lambda函數看起來在每個文本
>>>
>>> print(len(python_jobs)) 10
您的程序找到10了"python"在其職位名稱中包含該詞的匹配職位!
根據文本內容查找元素是過濾 HTML 響應以獲取特定信息的有效方法。Beautiful Soup 允許您使用精確的字符串或函數作為參數來過濾 Beautiful Soup 對象中的文本。
但是,當您嘗試運行刮板以打印過濾后的 Python 作業的信息時,您將遇到錯誤:
AttributeError: 'NoneType' object has no attribute 'text'
此消息是您在從 Internet 抓取信息時經常遇到的常見錯誤。檢查python_jobs列表中元素的 HTML?。它是什么樣子的?你認為錯誤來自哪里?
識別錯誤情況
當您查看 中的單個元素時python_jobs,您會看到它僅
當您重新訪問用于選擇項目的代碼時,您會看到這就是您的目標。您只篩選了
您之前收到的錯誤消息與此有關:
AttributeError: 'NoneType' object has no attribute 'text'
您試圖在 中的每個元素中查找職位名稱、公司名稱和職位位置python_jobs,但每個元素僅包含職位名稱文本。
您的勤奮解析庫仍然會尋找其他的,但None由于找不到它們而返回。然后,print()當您嘗試.text從這些None對象之一中提取屬性時,失敗并顯示錯誤消息。
您要查找的文本嵌套在
訪問父元素
訪問您需要的所有信息的一種方法是從
Stewartbury, AA
考慮到這些信息,您現在可以使用 中的元素python_jobs并獲取它們的曾祖父元素來訪問您想要的所有信息:
python_jobs = results.find_all( "h2", string=lambda text: "python" in text.lower() ) python_job_elements = [ h2_element.parent.parent.parent for h2_element in python_jobs ]
您添加了一個列表推導式,它對您通過 lambda 表達式過濾獲得的每個
當您查看單個職位發布的 HTML 時,您發現這個具有類名的特定父元素card-content包含您需要的所有信息。
現在,您可以修改for循環中的代碼以迭代父元素:
for job_element in python_job_elements: # -- snip --
當您再次運行腳本時,您會看到您的代碼再次可以訪問所有相關信息。那是因為您現在循環的是
使用.parent每個 Beautiful Soup 對象附帶的屬性,您可以直觀地瀏覽 DOM 結構并處理所需的元素。您還可以以類似的方式訪問子元素和同級元素。閱讀導航樹以獲取更多信息。
從 HTML 元素中提取屬性
此時,您的 Python 腳本已經抓取了該站點并過濾了其 HTML 以查找相關職位發布。做得好!但是,仍然缺少申請工作的鏈接。
在檢查頁面時,您會在每張卡片的底部發現兩個鏈接。如果您以與處理其他元素相同的方式處理鏈接元素,您將不會獲得您感興趣的 URL:
for job_element in python_job_elements: # -- snip -- links = job_element.find_all("a") for link in links: print(link.text.strip())
如果您運行此代碼片段,那么您將獲得鏈接文本Learn而Apply不是關聯的 URL。
這是因為該.text屬性只留下 HTML 元素的可見內容。它去除了所有 HTML 標簽,包括包含 URL 的 HTML 屬性,只留下鏈接文本。要改為獲取 URL,您需要提取 HTML 屬性之一的值而不是丟棄它。
鏈接元素的 URL 與href屬性相關聯。您要查找的特定 URL是單個職位發布的 HTML 底部href第二個標簽的屬性值:
首先獲取工作卡中的所有元素。然后,href使用方括號表示法提取它們的屬性值:
for job_element in python_job_elements: # -- snip -- links = job_element.find_all("a") for link in links: link_url = link["href"] print(f"Apply here: {link_url}\n")
在此代碼段中,您首先從每個過濾后的職位發布中獲取所有鏈接。然后您提取href包含 URL的屬性,使用["href"]并將其打印到您的控制臺。
在此代碼段中,您首先從每個過濾后的職位發布中獲取所有鏈接。然后您提取href包含 URL的屬性,使用["href"]并將其打印到您的控制臺。
在下面的練習塊中,您可以找到挑戰的說明以優化您收到的鏈接結果:
練習:優化你的結果顯示隱藏
單擊解決方案塊以閱讀本練習的可能解決方案:
解決方案:優化您的結果顯示隱藏
您也可以使用相同的方括號表示法來提取其他 HTML 屬性。
保持練習
如果您在本教程中編寫了代碼,那么您可以按原樣運行腳本,您將在終端中看到虛假的工作信息彈出。您的下一步是處理現實生活中的工作委員會!要繼續練習您的新技能,請使用以下任何或所有站點重新訪問網絡抓取過程:
PythonJobs
Remote(dot)co
Indeed
鏈接的網站將其搜索結果作為靜態 HTML 響應返回,類似于 Fake Python 工作板。因此,您可以僅使用requests美麗的湯來刮掉它們。
使用這些其他站點之一從頂部重新開始閱讀本教程。您會看到每個網站的結構都不同,您需要以稍微不同的方式重新構建代碼以獲取所需的數據。應對這一挑戰是練習剛剛學到的概念的好方法。雖然它可能會讓你經常出汗,但你的編碼技能會因此而更強!
在您第二次嘗試時,您還可以探索 Beautiful Soup 的其他功能。使用文檔作為您的指南和靈感。額外的練習將幫助您更熟練地使用 Python、requests.. 和 Beautiful Soup進行網頁抓取。
為了結束您的網絡抓取之旅,您可以對代碼進行最終改造并創建一個命令行界面 (CLI)應用程序,該應用程序可以抓取一個工作板并通過您可以在每次執行時輸入的關鍵字過濾結果.?您的 CLI 工具可以讓您搜索特定類型的工作或特定位置的工作。
如果您有興趣學習如何將腳本調整為命令行界面,請查看如何使用 argparse 在 Python 中構建命令行界面。
結論
該requests庫為您提供了一種用戶友好的方式來使用 Python 從 Internet 獲取靜態 HTML。然后,您可以使用另一個名為 Beautiful Soup 的包解析 HTML。這兩個軟件包都是您的網絡抓取冒險值得信賴和有用的伴侶。您會發現 Beautiful Soup 將滿足您的大部分解析需求,包括導航和高級搜索。
在本教程中,您學習了如何使用 Python?requests、 和 Beautiful Soup從 Web 抓取數據。您構建了一個從 Internet 獲取職位發布的腳本,并從頭到尾完成了完整的網絡抓取過程。
你學會了如何:
通過一個步驟網頁抓取管道從開始到結束
使用瀏覽器的開發工具檢查目標站點的HTML 結構
解密URL 中編碼的數據
使用 Python 的庫下載頁面的HTML 內容requests
用Beautiful Soup解析下載的 HTML提取相關信息
構建一個從 Web 獲取工作機會并在您的控制臺中顯示相關信息的腳本
考慮到這個廣泛的管道和工具包中的兩個強大的庫,您可以出去看看還有哪些其他網站可以抓取。玩得開心,永遠記住要尊重并負責任地使用你的編程技能。
Python 網站 網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。