使用Scrapy构建自己的数据集

一、说明

        当我第一次开始在工业界工作时,我很快意识到的一件事是,有时你必须收集、组织和清理自己的数据。在本教程中,我们将从一个名为FundRazr的众筹网站收集数据。像许多网站一样,该网站有自己的结构、形式,并有大量可访问的有用数据,但由于它没有结构化的 API,很难从网站获取数据。因此,我们将通过网络抓取网站以获取非结构化网站数据,并放入有序形式以构建我们自己的数据集。

        为了抓取网站,我们将使用Scrapy。简而言之,Scrapy 是一个框架,旨在更轻松地构建网络爬虫并减轻维护它们的痛苦。基本上,它允许您专注于使用 CSS 选择器和选择 XPath 表达式的数据提取,而不是蜘蛛应该如何工作的复杂内部。这篇博文超出了抓取文档中的出色官方教程,希望如果您需要更难地抓取一些东西,您可以自己完成。有了这个,让我们开始吧。如果您迷路了,我建议您在单独的选项卡中打开视频

二、安装入门(先决条件)

        如果您已经拥有 anaconda 和谷歌浏览器(或 Firefox),请跳到创建新的 Scrapy 项目。

        1. 在你的操作系统上安装 Anaconda (Python)。您可以从官方网站下载 anaconda 并自行安装,也可以按照下面的这些 anaconda 安装教程进行操作。

    Installing Anaconda

        2. 安装Scrapy(anaconda 附带它,但以防万一)。您还可以在终端 (mac/linux) 或命令行 (windows) 上安装。您可以输入以下内容:

conda install -c conda-forge scrapy 

        3.确保您拥有谷歌浏览器或火狐浏览器。在本教程中,我使用的是谷歌浏览器。如果您没有谷歌浏览器,可以使用此链接在此处安装它。

三、创建一个新的 Scrapy 项目

        1.打开终端(mac/linux)或命令行(窗口)。导航到所需的文件夹(如果需要帮助,请参阅下图)并键入

    scrapy startproject fundrazr 

scrapy的开始项目基金,这将创建一个包含以下内容的fundrazr目录:

Fundrazr项目目录

四、使用谷歌浏览器(或火狐浏览器)上的检查查找良好的开始网址

        在爬虫框架中,start_urls是蜘蛛将开始爬行的URL列表,当没有指定特定的URL时。我们将使用start_urls列表中的每个元素作为获取单个广告系列链接的方法。

        1.下图显示,根据您选择的类别,您将获得不同的起始URL。黑色突出显示的部分是可能抓取的基金类别。

找到一个好的start_url

        对于本教程,列表start_urls中的第一个是:

        Raise money for Health, Illness & Medical Treatments - FundRazr

        2.这部分是关于获取要放入start_urls列表中的其他元素。我们正在了解如何转到下一页,以便我们可以获取其他 url 以放入start_urls

通过检查“下一步”按钮获取要放入列表中的其他元素 start_urls

        第二个起始网址是:Raise money for Health, Illness & Medical Treatments - FundRazr

        下面的代码将在本教程后面的蜘蛛代码中使用。它所做的只是列出start_urls。变量 npages 只是我们希望从中获取广告系列链接的其他页面数量(在第一页之后)。

start_urls = ["https://fundrazr.com/find?category=Health"]

npages = 2

# This mimics getting the pages using the next button. 
for i in range(2, npages + 2 ):
	start_urls.append("https://fundrazr.com/find?category=Health&page="+str(i)+"")

        根据网站当前结构生成其他起始 URL 的代码

五、用于查找单个广告系列链接的刮擦外壳

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

        我们将尝试获取xpath的第一件事是各个广告系列链接。首先,我们检查广告系列在HTML中的大致位置。

查找指向单个广告系列的链接

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

        随附的部分是我们将隔离的部分网址

        在终端类型 (mac/linux) 中:

scrapy shell 'https://fundrazr.com/find?category=Health'

在命令行类型(窗口)中:

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

        随着网站随着时间的推移而更新,您很有可能会得到不同的部分网址

        下面的代码用于获取给定起始网址的所有活动链接(稍后在第一个蜘蛛部分详细介绍)

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. 接下来,我们转到单个广告系列页面(请参阅下面的链接)进行抓取(我应该注意,其中一些广告系列很难查看)

Please help to save Yvonne by Yvonne Foong

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

检查广告系列标题

3.现在我们将再次使用刮擦外壳,但这次是个人活动。我们这样做是因为我们想了解各个广告系列的格式(包括了解如何从网页中提取标题)。

在终端类型 (mac/linux) 中:

scrapy shell 'https://fundrazr.com/savemyarm'

在命令行类型(窗口)中:

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(<a data-cke-saved-href="http://twitter.com/id" href="http://twitter.com/id" class="af ov">@id</a>, 'full-story')]/descendant::text()").extract() 

网址:

response.xpath("//meta[<a data-cke-saved-href="http://twitter.com/property" href="http://twitter.com/property" class="af ov">@property</a>='og:url']/@content").extract() 

5. 通过键入退出刮擦外壳:

 exit() 

七、项目

        抓取的主要目标是从非结构化源(通常是网页)中提取结构化数据。Scrapy Spiders可以将提取的数据作为Python字典返回。虽然方便和熟悉,但 Python 词典缺乏结构:很容易在字段名称中输入错误或返回不一致的数据,尤其是在具有许多蜘蛛的大型项目中(几乎是从伟大的刮擦官方文档中逐字复制的!

我们将要修改的文件items.py 的代码在这里

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

本教程中使用的 item 类(基本上是我们在输出数据之前存储数据的方式)如下所示。

items.py 代码

八、蜘蛛

        蜘蛛是您定义的类,Scrapy 使用它从网站(或一组网站)中抓取信息。我们的蜘蛛的代码如下。

        Fundrazr 刮擦代码,在此处下载代码。

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

        当前项目现在应具有以下内容:

我们将创建/添加的文件

九、运行蜘蛛

  1. 转到fundrazr/fundrazr目录并键入:
scrapy crawl my_scraper -o MonthDay_Year.csv 

        刮擦爬行my_scraper -o MonthDay_Year.csv

        2. 数据应输出在基金/基金目录中。

数据输出位置

十、我们的数据

  1. 本教程中输出的数据应大致如下图所示。抓取的各个广告系列会随着网站的不断更新而有所不同。此外,每个单独的广告系列之间可能会有空格,因为 excel 正在解释 csv 文件。

数据应大致采用此格式。

        2.如果您想下载一个更大的文件(它是通过将npages = 2更改为npages = 450并添加download_delay = 2来完成的),您可以通过从我的github下载文件来下载一个更大的文件,其中包含大约6000个广告系列。该文件称为MiniMorningScrape.csv(它是一个大文件)。

大约 6000 个广告系列被抓取

十一、结语

        创建数据集可能是一项繁重的工作,并且经常是学习数据科学中被忽视的部分。我们没有回顾的一件事是,虽然我们抓取了大量数据,但我们仍然没有清理足够的数据来进行分析。不过,这是另一篇博客文章。

猜你喜欢

转载自blog.csdn.net/gongdiwudu/article/details/132262815