原文標題:Using Scrapy to Build your Own Dataset
作者:Michael Galarnyk
翻譯:李清揚
全文校對:丁楠雅
本文長度為2400字,建議閱讀5分鐘
數據科學中,數據的爬取和收集是非常重要的一個部分。本文將以眾籌網站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
李清揚,清華大學工商管理研究生在讀,主修管理學。對大數據、人工智慧在經濟金融領域的應用感興趣。希望能在數據派平臺獲得大數據前沿知識,找到志同道合的朋友,一起研究和應用數據分析工具於企業管理實踐當中。
工作內容:將選取好的外文前沿文章準確地翻譯成流暢的中文。如果你是數據科學/統計學/計算機專業的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友,數據派翻譯組歡迎你們加入!
你能得到:提高對於數據科學前沿的認知,提高對外文新聞來源渠道的認知,海外的朋友可以和國內技術應用發展保持聯繫,數據派團隊產學研的背景為志願者帶來好的發展機遇。
其他福利:和來自於名企的數據科學工作者,北大清華以及海外等名校學生共同合作、交流。
點擊文末「閱讀原文」加入數據派團隊~
為保證發文質量、樹立口碑,數據派現設立「錯別字基金」,鼓勵讀者積極糾錯。
若您在閱讀文章過程中發現任何錯誤,請在文末留言,或到後臺反饋,經小編確認後,數據派將向檢舉讀者發8.8元紅包。
同一位讀者指出同一篇文章多處錯誤,獎金不變。不同讀者指出同一處錯誤,獎勵第一位讀者。
感謝一直以來您的關注和支持,希望您能夠監督數據派產出更加高質的內容。
轉載須知
如需轉載,請在開篇顯著位置註明作者和出處(轉自:數據派THUID:DatapiTHU),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】至聯繫郵箱,申請白名單授權並按要求編輯。
發布後請將連結反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。