最近我決定做一個快速的網頁抓取和資料分析專案。因為我的大腦喜歡想出需要花費大量時間的大想法,所以我決定挑戰自己,想出一些可以在幾個小時內完成的簡單事情。
這是我想到的:
由於我的本科學位最初是外語(法語和西班牙語),我認為網絡抓取一些語言相關數據會很有趣。我想使用 BeautifulSoup 庫,它可以解析靜態 html,但無法處理需要 onclick 事件來顯示整個資料集的動態網頁(即,如果頁面已分頁,則單擊下一頁資料)。
我決定使用最常用語言的維基百科頁面。
我想做以下事情:
我決定將專案分成這些步驟以分離關注點,但我也想避免透過重新運行腳本來發出多個不必要的請求以從維基百科獲取 html。保存 html 文件,然後在單獨的腳本中使用它意味著您不需要不斷重新請求數據,因為您已經擁有了數據。
此專案的 github 儲存庫的連結為:https://github.com/gabrielrowan/Foreign-Languages-Analysis
首先,我檢索並輸出 html。使用 C# 和 C 後,我總是對 Python 程式碼如此簡短和簡潔感到新奇?
url = 'https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers' response = requests.get(url) html = response.text with open("languages_html.txt", "w", encoding="utf-8") as file: file.write(html)
為了用 Beautiful soup 解析 html 並選擇我感興趣的表,我做了:
with open("languages_html.txt", "r", encoding="utf-8") as file: soup = BeautifulSoup(file, 'html.parser') # get table top_languages_table = soup.select_one('.wikitable.sortable.static-row-numbers')
然後,我取得了表格標題文字來取得 pandas 資料框的列名稱:
# get column names columns = top_languages_table.find_all("th") column_titles = [column.text.strip() for column in columns]
之後,我建立了資料框,設定列名稱,檢索每個表格行並將每一行寫入資料框:
# get table rows table_data = top_languages_table.find_all("tr") # define dataframe df = pd.DataFrame(columns=column_titles) # get table data for row in table_data[1:]: row_data = row.find_all('td') row_data_txt = [row.text.strip() for row in row_data] print(row_data_txt) df.loc[len(df)] = row_data_txt
注意 - 不使用 strip() 時,文字中有 n 個不需要的字元。
最後,我將資料幀寫入 .csv。
事先,我從數據中提出了我想回答的這些問題:
雖然我不會透過程式碼來回答所有這些問題,但我會討論涉及圖表的兩個問題。
首先,我建立了一個資料框,僅包含分支名稱為「Romance」或「Germanic」的行
url = 'https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers' response = requests.get(url) html = response.text with open("languages_html.txt", "w", encoding="utf-8") as file: file.write(html)
然後我指定了圖表的 x 軸、y 軸和條形顏色:
with open("languages_html.txt", "r", encoding="utf-8") as file: soup = BeautifulSoup(file, 'html.parser') # get table top_languages_table = soup.select_one('.wikitable.sortable.static-row-numbers')
這創建了:
為了建立圓餅圖,我檢索了最常見的 3 個語系並將它們放入資料框中。
此代碼組取得每個語系的母語人士總數,按降序排序,並提取前 3 個條目。
# get column names columns = top_languages_table.find_all("th") column_titles = [column.text.strip() for column in columns]
然後我將資料放入圓餅圖中,指定「母語者」的 y 軸和圖例,這為圖表中顯示的每個語言系列建立顏色編碼標籤。
# get table rows table_data = top_languages_table.find_all("tr") # define dataframe df = pd.DataFrame(columns=column_titles) # get table data for row in table_data[1:]: row_data = row.find_all('td') row_data_txt = [row.text.strip() for row in row_data] print(row_data_txt) df.loc[len(df)] = row_data_txt
其餘問題的程式碼和答案可以在這裡找到。我在筆記本中使用 Markdown 寫下問題及其答案。
對於我的網頁抓取和資料分析專案的下一個迭代,我想讓事情變得更複雜:
儘管速度很快,但我很喜歡做這個專案。它提醒我,簡短、可管理的專案對於讓練習代表參與其中有多有用?另外,從互聯網提取數據並從中創建圖表,即使數據集很小,也很有趣?
以上是網路抓取與分析外語數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!