翻譯:田曉寧
校對:丁楠雅
本文約2900字,建議閱讀10分鐘。
本教程以在Fast Track上收集百強公司的數據為例,教你抓取網頁信息。
作為一名數據科學家,我在工作中所做的第一件事就是網絡數據採集。使用代碼從網站收集數據,當時對我來說是一個完全陌生的概念,但它是最合理、最容易獲取的數據來源之一。經過幾次嘗試,網絡抓取已經成為我的第二天性,也是我幾乎每天使用的技能之一。
在本教程中,我將介紹一個簡單的例子,說明如何抓取一個網站,我將從Fast Track上收集2018年百強公司的數據:
Fast Track:http://www.fasttrack.co.uk/使用網絡爬蟲將此過程自動化,避免了手工收集數據,節省了時間,還可以讓所有數據都放在一個結構化文件中。
用Python實現一個簡單的網絡爬蟲的快速示例,您可以在GitHub上找到本教程中所介紹的完整代碼。
GitHub鏈接:https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py以下是本文使用Python進行網頁抓取的簡短教程概述:
- 連接到網頁
- 使用BeautifulSoup解析html
- 循環通過soup對象找到元素
- 執行一些簡單的數據清理
- 將數據寫入csv
準備開始
在開始使用任何Python應用程序之前,要問的第一個問題是:我需要哪些庫?
對於web抓取,有一些不同的庫需要考慮,包括:
- Beautiful Soup
- Requests
- Scrapy
- Selenium
在本例中我們使用Beautiful Soup。你可以使用Python包管理器 pip 安裝Beautiful Soup:
pip install BeautifulSoup4安裝好這些庫之後,讓我們開始吧!
檢查網頁
要知道在Python代碼中需要定位哪些元素,首先需要檢查網頁。
要從Tech Track Top 100 companies收集數據,可以通過右鍵單擊感興趣的元素來檢查頁面,然後選擇檢查。這將打開HTML代碼,我們可以在其中看到每個字段包含在其中的元素。
Tech Track Top 100 companies鏈接:http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/
右鍵單擊感興趣的元素並選擇“Inspect”,顯示html元素。
由於數據存儲在一個表中,因此只需幾行代碼就可以直接獲取數據。如果您想練習抓取網站,這是一個很好的例子,也是一個好的開始,但請記住,它並不總是那麼簡單!
所有100個結果都包含在
League Table網頁上顯示了包含100個結果的表。檢查頁面時,很容易在html中看到一個模式。結果包含在表格中的行中:
Rank | Company | Location | Year end | Annual sales rise over 3 years | Latest sales £000s | Staff | Comment |
---|---|---|---|---|---|---|---|
1 | Personalised children's books | East London | Apr-17 | 294.27% | *25,860 | 80 | Has sold nearly 3m customisable children’s books in 200 countries | 元素來寫入csv或JSON。 循環遍歷元素並保存變量 在Python中,將結果附加到一個列表中是很有用的,然後將數據寫到一個文件中。我們應該在循環之前聲明列表並設置csv的頭文件,如下所示: # create and write headers to a list rows = []rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])print(rows)這將打印出我們添加到包含標題的列表的第一行。 你可能會注意到表格中有一些額外的字段Webpage和Description不是列名,但是如果你仔細看看我們打印上面的soup變量時的html,那麼第二行不僅僅包含公司名稱。我們可以使用一些進一步的提取來獲取這些額外信息。 下一步是循環結果,處理數據並附加到可以寫入csv的rows。 在循環中查找結果: # loop over resultsfor result in results: # find all columns per result data = result.find_all('td') # check that columns have data if len(data) == 0: continue由於表中的第一行僅包含標題,因此我們可以跳過此結果,如上所示。它也不包含任何 | 元素,因此在搜索元素時,不會返回任何內容。然後,我們可以通過要求數據的長度為非零來檢查是否只處理包含數據的結果。 然後我們可以開始處理數據並保存到變量中。 # write columns to variables rank = data[0].getText() company = data[1].getText() location = data[2].getText() yearend = data[3].getText() salesrise = data[4].getText() sales = data[5].getText() staff = data[6].getText() comments = data[7].getText()以上只是從每個列獲取文本並保存到變量。但是,其中一些數據需要進一步清理以刪除不需要的字符或提取更多信息。 數據清理 如果我們打印出變量company,該文本不僅包含公司名稱,還包含描述。我們然後打印sales,它包含不需要的字符,如腳註符號,最好刪除。 print('Company is', company) # Company is WonderblyPersonalised children's books print('Sales', sales) # Sales *25,860我們希望將company 分為公司名稱和描述,我們可以用幾行代碼實現。再看一下html,對於這個列,有一個 元素只包含公司名稱。此列中還有一個鏈接指向網站上的另一個頁面,其中包含有關該公司的更多詳細信息。我們將在稍後使用它! | Personalised children's books |
閱讀更多 THU數據派 的文章