首頁 > 後端開發 > Python教學 > 網路抓取與分析外語數據

網路抓取與分析外語數據

Susan Sarandon
發布: 2024-12-24 11:40:14
原創
946 人瀏覽過

最近我決定做一個快速的網頁抓取和資料分析專案。因為我的大腦喜歡想出需要花費大量時間的大想法,所以我決定挑戰自己,想出一些可以在幾個小時內完成的簡單事情。

這是我想到的:

由於我的本科學位最初是外語(法語和西班牙語),我認為網絡抓取一些語言相關數據會很有趣。我想使用 BeautifulSoup 庫,它可以解析靜態 html,但無法處理需要 onclick 事件來顯示整個資料集的動態網頁(即,如果頁面已分頁,則單擊下一頁資料)。

我決定使用最常用語言的維基百科頁面。

Web scraping and analysing foreign languages data

我想做以下事情:

  • 取得頁面的 html 並輸出到 .txt 檔案
  • 使用beautiful soup解析html檔案並擷取表格資料
  • 將表格寫入 .csv 檔案
  • 使用資料分析提出我想回答此資料集的 10 個問題
  • 用 pandas 和 Jupyter Notebook 回答這些問題

我決定將專案分成這些步驟以分離關注點,但我也想避免透過重新運行腳本來發出多個不必要的請求以從維基百科獲取 html。保存 html 文件,然後在單獨的腳本中使用它意味著您不需要不斷重新請求數據,因為您已經擁有了數據。

項目連結

此專案的 github 儲存庫的連結為:https://github.com/gabrielrowan/Foreign-Languages-Analysis

取得html

首先,我檢索並輸出 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)

登入後複製
登入後複製

解析 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。

分析數據

事先,我從數據中提出了我想回答的這些問題:

  1. 資料集中所有語言的母語總數是多少?
  2. 有多少種不同類型的語系?
  3. 每個語系的母語總數是多少?
  4. 最常用的 3 個語係是什麼?
  5. 建立一個圓餅圖,顯示最常用的 3 個語系
  6. 最常見的語系-分支對是什麼?
  7. 表中哪些語言屬於漢藏語系?
  8. 顯示所有羅曼語系和日耳曼語系語言的母語人士的長條圖
  9. 前 5 種語言佔母語使用者總數的百分比是多少?
  10. 哪個分支的母語使用者最多,哪個分支最少?

結果

雖然我不會透過程式碼來回答所有這些問題,但我會討論涉及圖表的兩個問題。

顯示所有羅曼語和日耳曼語母語的長條圖

首先,我建立了一個資料框,僅包含分支名稱為「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')


登入後複製
登入後複製

這創建了:

Web scraping and analysing foreign languages data

建立一個圓餅圖,顯示 3 個最常用的語系

為了建立圓餅圖,我檢索了最常見的 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 


登入後複製
登入後複製

Web scraping and analysing foreign languages data

其餘問題的程式碼和答案可以在這裡找到。我在筆記本中使用 Markdown 寫下問題及其答案。

下次:

對於我的網頁抓取和資料分析專案的下一個迭代,我想讓事情變得更複雜:

  • 網頁抓取動態頁面,點擊/捲動時會顯示更多資料
  • 分析較大的資料集,可能需要在分析之前進行一些資料清理工作

Web scraping and analysing foreign languages data

最後的想法

儘管速度很快,但我很喜歡做這個專案。它提醒我,簡短、可管理的專案對於讓練習代表參與其中有多有用?另外,從互聯網提取數據並從中創建圖表,即使數據集很小,也很有趣?

以上是網路抓取與分析外語數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板