授權轉載自:資料派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
scrape起始專案fundrazr
這就會生成一個含有如下內容的fundrazr目錄:
fundrazr專案目錄
使用Google Chrome瀏覽器(或Firefox)查詢好起始URL
在爬蟲框架中,start_urls是當沒有指定特定網址時爬蟲開始抓取的網址列表。我們將使用start_urls列表中的元素來獲取單個籌款活動連結。
1.下面的圖片顯示,根據您選擇的類別,您將獲得不同的起始網址。 黑色突出顯示的部分是我們此次爬取的分類。
找到一個很好的第一個start_url
對於本教程,列表start_urls中的第一個是:https://fundrazr.com/find?category=Health
2.這部分是關於獲取更多的元素來放入start_urls列表。 我們需要找出如何去下一頁,以便可以獲得額外的url來放入start_urls。
第一幅圖:在“Next”上點選滑鼠右鍵(紅色方框內)然後點選“Inspect”
第二幅圖:藍色高亮部分表示我們在我們的url後面加上了(如果我們想要另一頁籌款活動:find?category=Health&page=2
(通過檢查“下一步”按鈕獲取其他元素以放入start_urls列表)
第二個起始URL:https://fundrazr.com/find?category=Health&page=2
下面的程式碼將在本教程後面的程式碼中用於爬蟲。 它的作用是建立一個start_urls列表。變數npages代表的是我們想從多少個額外的頁面(在第一頁之後)中獲取籌款活動連結。
(根據網站的現有結構生成額外的起始URL程式碼)
查詢單個籌款活動連結的Scrapy Shell
學習如何使用Scrapy提取資料的最佳方法是使用Scrapy shell。我們將使用可用於從HTML文件中選擇元素的XPath。
我們所要做的第一件事是嘗試獲得提取單個籌款活動連結的xpath表示式。 首先,我們檢視籌款活動的連結大致分佈在HTML的哪個位置。
第一幅圖:右鍵點選你看到的第一個籌款活動連結,然後點選“inspect”
第二幅圖:這個文字(紅色方框內)是單個活動籌款URL 一部分
(查詢到單個籌款活動系列的連結)
我們將使用XPath來提取包含在下面的紅色矩形中的部分。
被框住的部分是我們將單獨拎出來的部分網址
在終端(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()
隨著時間的推移,隨著網站的更新,您有可能會獲得不同的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 shell
檢查單個籌款活動
我們已經瞭解了單個籌款活動連結的結構,本節將介紹各個籌款活動頁面的內容。
1.接下來,我們開啟一個單獨的籌款活動頁面(見下面的連結),以便爬取(我提醒一下,有些活動很難檢視):https://fundrazr.com/savemyarm
2.使用與以前相同的檢查過程,我們檢查頁面上的標題
檢查籌款活動標題
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]
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官方文件複製過來的)。
我們將修改的檔案
items.py的程式碼在這裡:
https://github.com/mGalarnyk/Python_Tutorials/raw/master/Scrapy/fundrazr/fundrazr/items.py
儲存在fundrazr / fundrazr目錄下(覆蓋原始的items.py檔案)。
本教程中使用的item類 (基本上是關於在輸出以前,我們如何儲存我們的資料的)看起來像這樣。
items.py的程式碼
爬蟲
爬蟲是您所定義的類,Scrapy使用它來從一個網站或者一組網站爬取資訊。我們的爬蟲程式碼如下:
Fundrazr Scrapy的程式碼
在這裡下載程式碼:https://raw.githubusercontent.com/mGalarnyk/Python_Tutorials/master/Scrapy/fundrazr/fundrazr/spiders/fundrazr_scrape.py
將它儲存在fundrazr / spiders目錄下,名為fundrazr_scrape.py的檔案中。
目前專案應具有以下內容:
我們將建立/新增的檔案
執行爬蟲
1.前往fundrazr / fundrazr目錄,並輸入:
scrapy crawl my_scraper -o MonthDay_Year.csv
scrapy crawl my_scraper -o MonthDay_Year.csv
2. 資料應該輸出到fundrazr/fundrazr目錄。
我們的資料
本教程中輸出的資料大致如下圖所示。 隨著網站不斷更新,爬取出來的個別籌款活動將會有所不同。 此外,在excel讀取csv檔案的過程中,不同的活動資料間可能會出現空格。
資料應該大致為這種格式
2.如果要下載較大的檔案(這個是通過將npages = 2更改為npages = 450並新增download_delay = 2來爬取得),您可以從我的github(https://github.com/mGalarnyk/Python_Tutorials/tree/master/Scrapy/fundrazr/fundrazr)上下載包含大約6000個籌款活動的檔案。 該檔案稱為MiniMorningScrape.csv(這是一個大檔案)。
大約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