獨家 | 教你用Scrapy建立你自己的數據集(附視頻)

2021-02-19 數據派THU

原文標題: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】至聯繫郵箱,申請白名單授權並按要求編輯。

發布後請將連結反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。

相關焦點

  • 手把手:教你用Scrapy建立你自己的數據集(附視頻)
    數據科學中,數據的爬取和收集是非常重要的一個部分。本文將以眾籌網站FundRazr為例,手把手教你如何從零開始,使用Python中非常簡便易學的Scrapy庫來爬取網絡數據。用Python進行網頁爬取當我開始工作時,我很快意識到有時你必須收集、組織和清理數據。
  • scrapy爬蟲如何穿越表單,採集你想要的數據
    很多時候在進行數據採集的時候,是需要登錄該網站的,這樣涉及到了表單登錄,你需要輸入用戶名密碼,還有驗證碼,多數情況我們在向一個靜態網站發起get請求就可以拿到其數據。但在需要提交登錄表單這種情況就需要用到post請求。除了提交用戶密碼之外,圖形驗證也是非常的複雜。
  • 如何用Python和Scrapy將Web轉化為數據
    它們都充滿了有趣的數據,每個人只要能訪問網際網路和web瀏覽器就可以獲得這些數據。但是,如果我們想通過編程獲得任何特定的數據呢?如果你像我一樣使用pipenv,請使用:pipenv run scrapy startproject web_scraper .
  • 大數據開發神器——Scrapy Spider框架
    當然你可以使用lxml、BeautifulSoup、Request等第三方庫來編寫自己的爬蟲。但是當需要爬取海量數據,特別是大數據的實際應用中,若自己編寫爬蟲,是一件特別困難的事情。還好Python提供了類似Scrapy等類似的爬蟲框架(人生苦短,我用Python)
  • python爬蟲-- Scrapy入門
    前言轉行做python程式設計師已經有三個月了,這三個月用Scrapy爬蟲框架寫了兩百多個爬蟲,不能說精通了Scrapy,但是已經對Scrapy有了一定的熟悉
  • Scrapy 爬取七麥 app數據排行榜
    re(): 根據傳入的正則表達式對數據進行提取,返回unicode字符串list列表。下面我們用xpath()選擇節點,xpath的語法可參考w3c的http://www.w3school.com.cn/xpath/xpath_nodes.asp 學習,需要熟悉語法、運算符、函數等。
  • 獨家 | 教你用Pytorch建立你的第一個文本分類模型!
    我肯定你在想-為什麼我們要用PyTorch處理文本數據?接下來我們討論一下PyTorch的一些令人難以置信的特性,這些特性使它不同於其他框架,特別是在處理文本數據時。1. 處理Out of Vocabulary words問題文本分類模型是在固定數據大小的文本數據集上進行訓練的。但是對於推理問題,可能會遇到有些詞並不涵蓋在詞彙集內,這些詞叫做Out of Vocabulary words。忽略Out of Vocabulary words可能會導致信息丟失,因此這是一個重要的問題。
  • 獨家 :教你用Pytorch建立你的第一個文本分類模型!
    我肯定你在想-為什麼我們要用PyTorch處理文本數據?接下來我們討論一下PyTorch的一些令人難以置信的特性,這些特性使它不同於其他框架,特別是在處理文本數據時。1. 處理Out of Vocabulary words問題文本分類模型是在固定數據大小的文本數據集上進行訓練的。但是對於推理問題,可能會遇到有些詞並不涵蓋在詞彙集內,這些詞叫做Out of Vocabulary words。忽略Out of Vocabulary words可能會導致信息丟失,因此這是一個重要的問題。
  • Scrapy源碼剖析:Scrapy是如何運行起來的?
    在上篇文章:Scrapy 源碼剖析:架構概覽,我們主要從整體上了解了 Scrapy 的架構和數據流轉,並沒有深入分析每個模塊。從這篇文章開始,我將帶你詳細剖析 Scrapy 的運行原理。這篇文章,我們先從最基礎的運行入口來講,來看一下 Scrapy 究竟是如何運行起來的。scrapy 命令從哪來?當我們基於 Scrapy 寫好一個爬蟲後,想要把我們的爬蟲運行起來,怎麼做?
  • 使用Scrapy網絡爬蟲框架小試牛刀
    scrapy 介紹標準介紹Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高性能異步下載,隊列,分布式,解析,持久化等)的具有很強通用性的項目模板。對於框架的學習,重點是要學習其框架的特性、各個功能的用法即可。
  • Scrapy爬蟲框架結構介紹(各部分組件功能,常用命令)
    Python之srcapy介紹Scrapy是一個健壯的爬蟲框架,可以從網站中提取需要的數據。是一個快速、簡單、並且可擴展的方法。Scrapy使用了異步網絡框架來處理網絡通訊,可以獲得較快的下載速度,因此,我們不需要去自己實現異步框架。並且,Scrapy包含了各種中間件接口,可以靈活的完成各種需求。
  • 中國技術大牛,首次公開Scrapy項目開發過程,是否帶來新的趨勢
    Item實例是用於收集數據的簡單容器,您可以將其視為Python dict的包裝,但它具有比原生Python Dict更有用的功能。如果您不熟悉Scrapy,可以在項目中使用Python Dict,但是,如果您的項目很大或者您在Scrapy方面有一些經驗,請使用Scrapy Item來使您的項目保持一致。
  • Python之初識Scrapy框架
    Scrapy 是 Python 開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取 web 站點並從頁面中提取結構化的數據。Scrapy 用途廣泛,可以用於數據挖掘、監測和自動化測試。為什麼需要使用它?
  • 使用 Scrapy 快速抓取網頁
    現在你可以其用下面的命令創建一個新的 Scrapy 項目:這裡是對上面文件及目錄的簡單介紹:items.py 是被解析數據的模型。你也可以繼承 scrapy 中的 item 類創建自定義的模型(比如 Product)。
  • 教你用Python入門年薪百萬的數據AI行業
    教你用Python入門年薪百萬的數據AI行1.機器學習這是圍繞機器學習建立實用直覺的最快方法之一。這個項目很棒,主要有三個原因:首先,你將建立模型與問題契合的直覺。哪些模型對缺失數據很有效?哪些型號能很好地處理分類功能?是的,您可以通過教科書來尋找答案,但通過觀察它可以更好地學習。其次,這個項目將教你快速模型化原型的寶貴技能。在現實世界中,通常很難知道哪種模型在不嘗試它們的情況下表現最佳。
  • scrapy爬蟲框架的運用
    # scrapy# 爬蟲框架- 框架- 爬蟲框架- scrapy- pyspider- crawley- scrapy框架介紹- https://doc.scrapy.org/en/latest/- http://scrapy-chs.readthedocs.io
  • 第76天:Scrapy 模擬登陸
    想爬取網站數據?先登錄網站!對於大多數大型網站來說,想要爬取他們的數據,第一道門檻就是登錄網站。下面請跟隨我的步伐來學習如何模擬登陸網站。為什麼進行模擬登陸?網際網路上的網站分兩種:需要登錄和不需要登錄。(這是一句廢話!)那麼,對於不需要登錄的網站,我們直接獲取數據即可,簡單省事。
  • (原創)Scrapy爬取美女圖片續集
    上一篇咱們講解了Scrapy的工作機制和如何使用Scrapy爬取美女圖片,而今天接著講解Scrapy爬取美女圖片,不過採取了不同的方式和代碼實現,對Scrapy
  • 【Scrapy】走進成熟的爬蟲框架
    所以只能自己來簡單寫一下了,也算是自己一個學習記錄。定義介紹我也不複製粘貼了。簡單來說,Scrapy是一個中大型的爬蟲框架,框架的意義就在於幫你預設好了很多可以用的東西,讓你可以從複雜的數據流和底層控制中抽離出來,專心於頁面的解析即可完成中大項目爬蟲,甚至是分布式爬蟲。
  • Scrapy源碼剖析:Scrapy有哪些核心組件?
    如果你想探究這些隊列是如何實現的,可以參考 Scrapy 作者寫的 scrapy/queuelib 項目,在 Github 上就可以找到,在這裡有這些隊列的具體實現。.S3DownloadHandler',    'ftp': 'scrapy.core.downloader.handlers.ftp.FTPDownloadHandler',}看到這裡你應該能明白了,下載處理器會根據下載資源的類型,選擇對應的下載器去下載資源。