閱讀649 返回首頁    go 阿裏雲 go 技術社區[雲棲]


手把手:教你用Scrapy建立你自己的數據集

數據科學中,數據的爬取和收集是非常重要的一個部分。本文將以眾籌網站FundRazr為例,手把手教你如何從零開始,使用Python中非常簡便易學的Scrapy庫來爬取網絡數據。
當我開始工作時,我很快意識到有時你必須收集、組織和清理數據。 本教程中,我們將收集一個名為FundRazr的眾籌網站的數據。像許多網站一樣,該網站具有自己的結構、形式,並具有大量可訪問的有用數據,但由於沒有結構化的API,很難從站點獲取數據。 因此,我們將爬取這個網站,獲得非結構化的網站數據,並以有序的形式建立我們自己的數據集。

為了爬取網站,我們將使用Scrapy。簡而言之,Scrapy是一個框架,可以更輕鬆地構建網絡爬蟲並降低護它們的難度。基本上,它可以讓您更專注於使用CSS選擇器進行數據提取,選取XPath表達式,而不必了解爬蟲工作的具體細節。這篇博客文章略微超出Scrapy文檔中官方教程的教學範疇,如果您需要更多地爬取某些東西,可以看著這篇文章自己做。 現在,讓我們開始吧。如果您感到迷惑,可以在新標簽頁打開這個視頻。
https://www.youtube.com/watch?v=O_j3OTXw2_E)


入門(先決條件)

如果您已經擁有anaconda和穀歌Chrome(或Firefox),請跳到創建新的Scrapy項目。
1. 在您的操作係統上安裝Anaconda(Python)。 您可以從官方網站下載anaconda,還可以自行安裝,或者您可以按照下麵的這些anaconda安裝教程進行安裝。

1

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

conda install -c conda-forge scrapy

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


<span style='display:block;text-align:center'>
**創建一個新的爬取項目**
</span>
打開終端(mac / linux)或命令行(windows)。 進入所需的文件夾(如果需要幫助,請參閱下圖)並鍵入
```javascript
scrapy startproject fundrazr


2

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

3


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

在爬蟲框架中,start_urls是當沒有指定特定網址時爬蟲開始抓取的網址列表。我們將使用start_urls列表中的元素來獲取單個籌款活動鏈接。
1.下麵的圖片顯示,根據您選擇的類別,您將獲得不同的起始網址。 黑色突出顯示的部分是我們此次爬取的分類。

4

對於本教程,列表start_urls中的第一個是:

https://fundrazr.com/find?category=Health

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

5

第一幅圖:在“Next”上點擊鼠標右鍵(紅色方框內)然後點擊“Inspect”
第二幅圖:藍色高亮部分表示我們在我們的url後麵加上了(如果我們想要另一頁籌款活動:find?category=Health&page=2
(通過檢查“下一步”按鈕獲取其他元素以放入start_urls列表)
第二個起始URL:

https://fundrazr.com/find?category=Health&page=2

下麵的代碼將在本教程後麵的代碼中用於爬蟲。 它的作用是創建一個start_urls列表。變量npages代表的是我們想從多少個額外的頁麵(在第一頁之後)中獲取籌款活動鏈接。
(根據網站的現有結構生成額外的起始URL代碼)

6


查找單個籌款活動鏈接的Scrapy Shell

學習如何使用Scrapy提取數據的最佳方法是使用Scrapy shell。我們將使用可用於從HTML文檔中選擇元素的XPath。
我們所要做的第一件事是嚐試獲得提取單個籌款活動鏈接的xpath表達式。 首先,我們查看籌款活動的鏈接大致分布在HTML的哪個位置。

7

第一幅圖:右鍵點擊你看到的第一個籌款活動鏈接,然後點擊“inspect”
第二幅圖:這個文本(紅色方框內)是單個活動籌款URL 一部分
(查找到單個籌款活動係列的鏈接)
我們將使用XPath來提取包含在下麵的紅色矩形中的部分。

8

在終端(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()


9

下麵的代碼是為了獲取給定的初始URL所包含的所有活動鏈接(在First Spider部分會更詳細地說明)

for href in response.xpath("//h2[contains(@class, 'title headline-font')]/a[contains(@class, 'campaign-link')]//@href"):
# add the scheme, eg https://
url  = "https:" + href.extract()

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

10


檢查單個籌款活動

我們已經了解了單個籌款活動鏈接的結構,本節將介紹各個籌款活動頁麵的內容。
1.接下來,我們打開一個單獨的籌款活動頁麵(見下麵的鏈接),以便爬取(我提醒一下,有些活動很難查看):https://fundrazr.com/savemyarm
2.使用與以前相同的檢查過程,我們檢查頁麵上的標題

11

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]


12

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()

  1. 退出scrapy shell: javascript exit()
    ITEMS 爬取的主要目標是從非結構化數據源(通常是網頁)中提取結構化數據。 Scrapy爬蟲可以將提取的數據以Python dicts的形式返回。雖然非常方便,操作也很熟悉,但是Python dicts本身缺少結構化:容易造成字段名稱中的輸入錯誤或返回不一致的數據,特別是在具有許多爬蟲的較大項目中(這一段幾乎是直接從scrapy官方文檔複製過來的)。 13 items.py的代碼在這裏:
https://github.com/mGalarnyk/Python_Tutorials/raw/master/Scrapy/fundrazr/fundrazr/items.py

保存在fundrazr / fundrazr目錄下(覆蓋原始的items.py文件)。
本教程中使用的item類 (基本上是關於在輸出以前,我們如何存儲我們的數據的)看起來像這樣。

14


爬蟲

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

15

在這裏下載代碼:

https://raw.githubusercontent.com/mGalarnyk/Python_Tutorials/master/Scrapy/fundrazr/fundrazr/spiders/fundrazr_scrape.py

將它保存在fundrazr / spiders目錄下,名為fundrazr_scrape.py的文件中。
目前項目應具有以下內容:

16


運行爬蟲

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

scrapy crawl my_scraper -o MonthDay_Year.csv


17

2. 數據應該輸出到fundrazr/fundrazr目錄。

18


我們的數據

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

19

2.如果要下載較大的文件(這個是通過將npages = 2更改為npages = 450並添加download_delay = 2來爬取得),您可以從我的github(javascript
https://github.com/mGalarnyk/Python_Tutorials/tree/master/Scrapy/fundrazr/fundrazr)

下載包含大約6000個籌款活動的文件。 該文件稱為MiniMorningScrape.csv(這是一個大文件)。

20


結束語

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

原文發布時間為:2017-10-28
本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“大數據文摘”微信公眾號

最後更新:2017-10-30 14:04:07

  上一篇:go  WCF技術剖析之十:調用WCF服務的客戶端應該如何進行異常處理
  下一篇:go  一體化人力資源係統構建,加快企業人才建設