手把手:教你用Scrapy建立你自己的資料集(附視訊)

大資料文摘發表於2017-10-28

手把手:教你用Scrapy建立你自己的資料集(附視訊)

授權轉載自:資料派THUID:DatapiTHU

資料科學中,資料的爬取和收集是非常重要的一個部分。本文將以眾籌網站FundRazr為例,手把手教你如何從零開始,使用Python中非常簡便易學的Scrapy庫來爬取網路資料。

用Python進行網頁爬取

當我開始工作時,我很快意識到有時你必須收集、組織和清理資料。 本教程中,我們將收集一個名為FundRazr(https://fundrazr.com/)的眾籌網站的資料。像許多網站一樣,該網站具有自己的結構、形式,並具有大量可訪問的有用資料,但由於沒有結構化的API,很難從站點獲取資料。 因此,我們將爬取這個網站,獲得非結構化的網站資料,並以有序的形式建立我們自己的資料集。

為了爬取網站,我們將使用Scrapy(https://scrapy.org/)。簡而言之,Scrapy是一個框架,可以更輕鬆地構建網路爬蟲並降低護它們的難度。基本上,它可以讓您更專注於使用CSS選擇器進行資料提取,選取XPath表示式,而不必瞭解爬蟲工作的具體細節。這篇部落格文章略微超出Scrapy文件中官方教程(https://doc.scrapy.org/en/latest/intro/tutorial.html)的教學範疇,如果您需要更多地爬取某些東西,可以看著這篇文章自己做。 現在,讓我們開始吧。如果您感到迷惑,可以在新標籤頁開啟這個視訊(https://www.youtube.com/watch?v=O_j3OTXw2_E)。

入門(先決條件)

如果您已經擁有anaconda和谷歌Chrome(或Firefox),請跳到建立新的Scrapy專案。

1. 在您的作業系統上安裝Anaconda(Python)。 您可以從官方網站下載anaconda,還可以自行安裝,或者您可以按照下面的這些anaconda安裝教程進行安裝。

Operating System

Blog Post

Youtube Video

Mac

Install Anaconda on Mac

Youtube Video

Windows

Install Anaconda on Windows

Youtube Video

Ubuntu

Install Anaconda on Ubuntu

Youtube Video

All

Environment Management with Conda (Python 2 + 3, Configuring Jupyter Notebooks)

Youtube Video

安裝Anaconda

2.安裝Scrapy(anaconda附帶Scrapy,但以防萬一)。 您還可以在終端(mac / linux)或命令列(windows)上安裝。 您可以鍵入以下內容:

conda install -c conda-forge scrapy

3.確保您有Google Chrome或Firefox。 在本教程中,我使用的是Google Chrome。 如果您沒有Google Chrome,可以使用此連結安裝(https://support.google.com/chrome/answer/95346?co=GENIE.Platform%3DDesktop&hl=en)

建立一個新的爬取專案

開啟終端(mac / linux)或命令列(windows)。 進入所需的資料夾(如果需要幫助,請參閱下圖)並鍵入

scrapy startproject fundrazr

手把手:教你用Scrapy建立你自己的資料集(附視訊)

scrape起始專案fundrazr

這就會生成一個含有如下內容的fundrazr目錄:

手把手:教你用Scrapy建立你自己的資料集(附視訊)

fundrazr專案目錄

使用Google Chrome瀏覽器(或Firefox)查詢好起始URL

在爬蟲框架中,start_urls是當沒有指定特定網址時爬蟲開始抓取的網址列表。我們將使用start_urls列表中的元素來獲取單個籌款活動連結。

1.下面的圖片顯示,根據您選擇的類別,您將獲得不同的起始網址。 黑色突出顯示的部分是我們此次爬取的分類。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

找到一個很好的第一個start_url

對於本教程,列表start_urls中的第一個是:https://fundrazr.com/find?category=Health

2.這部分是關於獲取更多的元素來放入start_urls列表。 我們需要找出如何去下一頁,以便可以獲得額外的url來放入start_urls。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

第一幅圖:在“Next”上點選滑鼠右鍵(紅色方框內)然後點選“Inspect”

第二幅圖:藍色高亮部分表示我們在我們的url後面加上了(如果我們想要另一頁籌款活動:find?category=Health&page=2

(通過檢查“下一步”按鈕獲取其他元素以放入start_urls列表)

第二個起始URL:https://fundrazr.com/find?category=Health&page=2

下面的程式碼將在本教程後面的程式碼中用於爬蟲。 它的作用是建立一個start_urls列表。變數npages代表的是我們想從多少個額外的頁面(在第一頁之後)中獲取籌款活動連結。

(根據網站的現有結構生成額外的起始URL程式碼)

手把手:教你用Scrapy建立你自己的資料集(附視訊)

查詢單個籌款活動連結的Scrapy Shell

學習如何使用Scrapy提取資料的最佳方法是使用Scrapy shell。我們將使用可用於從HTML文件中選擇元素的XPath。

我們所要做的第一件事是嘗試獲得提取單個籌款活動連結的xpath表示式。 首先,我們檢視籌款活動的連結大致分佈在HTML的哪個位置。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

第一幅圖:右鍵點選你看到的第一個籌款活動連結,然後點選“inspect”

第二幅圖:這個文字(紅色方框內)是單個活動籌款URL 一部分

(查詢到單個籌款活動系列的連結)

我們將使用XPath來提取包含在下面的紅色矩形中的部分。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

被框住的部分是我們將單獨拎出來的部分網址

在終端(mac / linux)中輸入:

scrapy shell ‘https://fundrazr.com/find?category=Health'

命令列輸入(windows):

scrapy shell “https://fundrazr.com/find?category=Health”

輸入以下內容到scrapy shell(以幫助瞭解程式碼,請參見視訊):

response.xpath("//h2[contains(@class, 'title headline-font')]/a[contains(@class, 'campaign-link')]//@href").extract()

手把手:教你用Scrapy建立你自己的資料集(附視訊)

隨著時間的推移,隨著網站的更新,您有可能會獲得不同的URL

下面的程式碼是為了獲取給定的初始URL所包含的所有活動連結(在First Spider部分會更詳細地說明) 

for href in response.xpath("//h2[contains(@class, 'title headline-font')]/a[contains(@class, 'campaign-link')]//@href"):

# add the scheme, eg http://

url  = "https:" + href.extract()

通過輸入exit()退出Scrapy Shell。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

退出scrapy shell

檢查單個籌款活動

我們已經瞭解了單個籌款活動連結的結構,本節將介紹各個籌款活動頁面的內容。

1.接下來,我們開啟一個單獨的籌款活動頁面(見下面的連結),以便爬取(我提醒一下,有些活動很難檢視):https://fundrazr.com/savemyarm

2.使用與以前相同的檢查過程,我們檢查頁面上的標題

手把手:教你用Scrapy建立你自己的資料集(附視訊)

檢查籌款活動標題

3.現在我們要再次使用scrapy shell,但這次是通過一個單獨的籌款活動。 我們這樣做是因為我們想要了解各個籌款活動頁面的格式(包括瞭解如何從網頁中提取標題)

在終端輸入 (mac/linux):

scrappy shell 'https://fundrazr.com/savemyarm'

在命令列輸入 (windows):

scrapy shell “https://fundrazr.com/savemyarm"

獲取籌款活動標題的程式碼是:

response.xpath("//div[contains(@id, ‘campaign-title')]/descendant::text()").extract()[0]

手把手:教你用Scrapy建立你自己的資料集(附視訊)

4.我們可以對頁面的其他部分做同樣的事情。

籌集的額度:

response.xpath("//span[contains(@class,'stat')]/span[contains(@class, 'amount-raised')]/descendant::text()").extract()

目標:

response.xpath("//div[contains(@class, 'stats-primary with-goal')]//span[contains(@class, 'stats-label hidden-phone')]/text()").extract()

貨幣的型別:

response.xpath("//div[contains(@class, 'stats-primary with-goal')]/@title").extract()

籌款活動結束日期:

response.xpath("//div[contains(@id, 'campaign-stats')]//span[contains(@class,'stats-label hidden-phone')]/span[@class='nowrap']/text()").extract()

貢獻者數量:

response.xpath("//div[contains(@class, 'stats-secondary with-goal')]//span[contains(@class, 'donation-count stat')]/text()").extract()

故事:

response.xpath("//div[contains(@id, 'full-story')]/descendant::text()").extract()

網址:

response.xpath(“//meta[@property='og:url']/@content").extract()

5. 退出scrapy shell:

exit()

ITEMS

爬取的主要目標是從非結構化資料來源(通常是網頁)中提取結構化資料。 Scrapy爬蟲可以將提取的資料以Python dicts的形式返回。雖然非常方便,操作也很熟悉,但是Python dicts本身缺少結構化:容易造成欄位名稱中的輸入錯誤或返回不一致的資料,特別是在具有許多爬蟲的較大專案中(這一段幾乎是直接從scrapy官方文件複製過來的)。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

我們將修改的檔案

items.py的程式碼在這裡:

https://github.com/mGalarnyk/Python_Tutorials/raw/master/Scrapy/fundrazr/fundrazr/items.py

儲存在fundrazr / fundrazr目錄下(覆蓋原始的items.py檔案)。

本教程中使用的item類 (基本上是關於在輸出以前,我們如何儲存我們的資料的)看起來像這樣。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

items.py的程式碼

爬蟲

爬蟲是您所定義的類,Scrapy使用它來從一個網站或者一組網站爬取資訊。我們的爬蟲程式碼如下: 

手把手:教你用Scrapy建立你自己的資料集(附視訊)

Fundrazr Scrapy的程式碼

在這裡下載程式碼:https://raw.githubusercontent.com/mGalarnyk/Python_Tutorials/master/Scrapy/fundrazr/fundrazr/spiders/fundrazr_scrape.py

將它儲存在fundrazr / spiders目錄下,名為fundrazr_scrape.py的檔案中。

目前專案應具有以下內容:

手把手:教你用Scrapy建立你自己的資料集(附視訊)

我們將建立/新增的檔案

執行爬蟲

1.前往fundrazr / fundrazr目錄,並輸入:

scrapy crawl my_scraper -o MonthDay_Year.csv

手把手:教你用Scrapy建立你自己的資料集(附視訊)

scrapy crawl my_scraper -o MonthDay_Year.csv

2. 資料應該輸出到fundrazr/fundrazr目錄。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

我們的資料

本教程中輸出的資料大致如下圖所示。 隨著網站不斷更新,爬取出來的個別籌款活動將會有所不同。 此外,在excel讀取csv檔案的過程中,不同的活動資料間可能會出現空格。 

手把手:教你用Scrapy建立你自己的資料集(附視訊)

資料應該大致為這種格式

2.如果要下載較大的檔案(這個是通過將npages = 2更改為npages = 450並新增download_delay = 2來爬取得),您可以從我的github(https://github.com/mGalarnyk/Python_Tutorials/tree/master/Scrapy/fundrazr/fundrazr)上下載包含大約6000個籌款活動的檔案。 該檔案稱為MiniMorningScrape.csv(這是一個大檔案)。

手把手:教你用Scrapy建立你自己的資料集(附視訊)

大約6000個籌款活動被爬取

結束語

建立資料集需要大量的工作,而且往往是資料科學學習被忽略的一部分。還有一件沒有解決的事情是,雖然我們已經爬取了大量的資料,我們還沒有對資料進行足夠的清洗,所以還不能做分析。不過那是另一個部落格帖子的內容了。如果您有任何問題,可以在這裡或者是Youtube頁面(https://www.youtube.com/watch?v=O_j3OTXw2_E)留言告訴我! 

原文連結:

https://medium.com/towards-data-science/using-scrapy-to-build-your-own-dataset-64ea2d7d4673


相關文章