手把手:教你用Scrapy创建你本身的数据集(附视频)

d919283a77ea2134dd4ff52bf4b66dc5x687x238x11.webp


受权转载自:数据派THUID:DatapiTHUhtml

数据科学中,数据的爬取和收集是很是重要的一个部分。本文将以众筹网站FundRazr为例,手把手教你如何从零开始,使用Python中很是简便易学的Scrapy库来爬取网络数据。
linux


用Python进行网页爬取git


当我开始工做时,我很快意识到有时你必须收集、组织和清理数据。 本教程中,咱们将收集一个名为FundRazr(https://fundrazr.com/)的众筹网站的数据。像许多网站同样,该网站具备本身的结构、形式,并具备大量可访问的有用数据,但因为没有结构化的API,很难从站点获取数据。 所以,咱们将爬取这个网站,得到非结构化的网站数据,并以有序的形式创建咱们本身的数据集。
github


为了爬取网站,咱们将使用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)。web


入门(先决条件) chrome


若是您已经拥有anaconda和谷歌Chrome(或Firefox),请跳到建立新的Scrapy项目。shell


1. 在您的操做系统上安装Anaconda(Python)。 您能够从官方网站下载anaconda,还能够自行安装,或者您能够按照下面的这些anaconda安装教程进行安装。windows


Operating Systemapi

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


1527a9c13d59c3b4862f1558cf1e88a8x640x97x6.webp


scrape起始项目fundrazr


这就会生成一个含有以下内容的fundrazr目录:


909145725b7ba382c7a10953d3092072x640x205x10.webp


fundrazr项目目录


使用Google Chrome浏览器(或Firefox)查找好起始URL


在爬虫框架中,start_urls是当没有指定特定网址时爬虫开始抓取的网址列表。咱们将使用start_urls列表中的元素来获取单个筹款活动连接。


1.下面的图片显示,根据您选择的类别,您将得到不一样的起始网址。 黑色突出显示的部分是咱们这次爬取的分类。


3f4a3b3d6e3b6bfff9f761eb7de179acx640x222x15.webp


找到一个很好的第一个start_url


对于本教程,列表start_urls中的第一个是:https://fundrazr.com/find?category=Health


2.这部分是关于获取更多的元素来放入start_urls列表。 咱们须要找出如何去下一页,以即可以得到额外的url来放入start_urls。


c69f2700cf7e56ddc2b25c7e22f089b5x640x317x17.webp


第一幅图:在“Next”上点击鼠标右键(红色方框内)而后点击“Inspect”

第二幅图:蓝色高亮部分表示咱们在咱们的url后面加上了(若是咱们想要另外一页筹款活动:find?category=Health&page=2

(经过检查“下一步”按钮获取其余元素以放入start_urls列表)


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


下面的代码将在本教程后面的代码中用于爬虫。 它的做用是建立一个start_urls列表。变量npages表明的是咱们想从多少个额外的页面(在第一页以后)中获取筹款活动连接。

(根据网站的现有结构生成额外的起始URL代码)


b88a50f2989a58e6bfc8685e67a221f8x640x188x6.webp



查找单个筹款活动连接的Scrapy Shell


学习如何使用Scrapy提取数据的最佳方法是使用Scrapy shell。咱们将使用可用于从HTML文档中选择元素的XPath。


咱们所要作的第一件事是尝试得到提取单个筹款活动连接的xpath表达式。 首先,咱们查看筹款活动的连接大体分布在HTML的哪一个位置。


0c14831e9ed6791b79c212406dc63754x640x307x21.webp



第一幅图:右键点击你看到的第一个筹款活动连接,而后点击“inspect”

第二幅图:这个文本(红色方框内)是单个活动筹款URL 一部分

(查找到单个筹款活动系列的连接)


咱们将使用XPath来提取包含在下面的红色矩形中的部分。


91a12981c78101833907abe0caeace72x640x79x6.webp


被框住的部分是咱们将单独拎出来的部分网址


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


21db1ffe09de667112691fa0b98cefa5x640x153x7.webp


随着时间的推移,随着网站的更新,您有可能会得到不一样的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。


d7f429ea709f65f2c817257a7f9ea14cx640x107x5.webp


退出scrapy shell


检查单个筹款活动


咱们已经了解了单个筹款活动连接的结构,本节将介绍各个筹款活动页面的内容。


1.接下来,咱们打开一个单独的筹款活动页面(见下面的连接),以便爬取(我提醒一下,有些活动很难查看):https://fundrazr.com/savemyarm


2.使用与之前相同的检查过程,咱们检查页面上的标题


44c10746eea533f4ef9efc2705ffaa16x640x350x14.webp


检查筹款活动标题


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]


118ef73ce2834357b7f0817c7d4aaf86x640x43x4.webp



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官方文档复制过来的)。

a802afca5491c0b45fd458e70dfdc68ax640x218x10.webp


咱们将修改的文件


items.py的代码在这里:

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


保存在fundrazr / fundrazr目录下(覆盖原始的items.py文件)。


本教程中使用的item类 (基本上是关于在输出之前,咱们如何存储咱们的数据的)看起来像这样。


2f29101562202651202b0e27a85f8455x640x406x21.webp


items.py的代码


爬虫


爬虫是您所定义的类,Scrapy使用它来从一个网站或者一组网站爬取信息。咱们的爬虫代码以下: 


5a248791b3471226051427bd3f9ca95bx640x388x13.webp


Fundrazr Scrapy的代码


在这里下载代码:https://raw.githubusercontent.com/mGalarnyk/Python_Tutorials/master/Scrapy/fundrazr/fundrazr/spiders/fundrazr_scrape.py


将它保存在fundrazr / spiders目录下,名为fundrazr_scrape.py的文件中。

目前项目应具备如下内容:


0ab3de71b91bada20afe1e7b1a518441x640x240x11.webp


咱们将建立/添加的文件


运行爬虫


1.前往fundrazr / fundrazr目录,并输入:


scrapy crawl my_scraper -o MonthDay_Year.csv


bdf94f421e961fa848c6f9782a2a73e3x640x391x28.webp


scrapy crawl my_scraper -o MonthDay_Year.csv


2. 数据应该输出到fundrazr/fundrazr目录。


1ff340d2cb7c8aa23fd19517af48cd94x640x283x15.webp



咱们的数据


本教程中输出的数据大体以下图所示。 随着网站不断更新,爬取出来的个别筹款活动将会有所不一样。 此外,在excel读取csv文件的过程当中,不一样的活动数据间可能会出现空格。 


a3427e89f18a43887e907ef783127da3x640x474x57.webp


数据应该大体为这种格式


2.若是要下载较大的文件(这个是经过将npages = 2更改成npages = 450并添加download_delay = 2来爬取得),您能够从个人github(https://github.com/mGalarnyk/Python_Tutorials/tree/master/Scrapy/fundrazr/fundrazr)上下载包含大约6000个筹款活动的文件。 该文件称为MiniMorningScrape.csv(这是一个大文件)。


f04a4a14e9cf0408f50ef5346d2e5ce9x637x400x51.webp


大约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