开发者社区> 技术小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

手把手:教你用Scrapy建立你自己的数据集

简介: 数据科学中,数据的爬取和收集是非常重要的一个部分。本文将以众筹网站FundRazr为例,手把手教你如何从零开始,使用Python中非常简便易学的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)。 进入所需的文件夹(如果需要帮助,请参阅下图)并键入

scrapy startproject fundrazr

<span style='display:block;text-align:center'>
![2](https://yqfile.alicdn.com/f382da3470ce6b28b98e56d8514b680c492d2044.png)
</span>

这就会生成一个含有如下内容的fundrazr目录:
<span style='display:block;text-align:center'>
![3](https://yqfile.alicdn.com/269302e81b494662a08cd0d55c59d7702f3ef375.png)
</span>

<span style='display:block;text-align:center'>
**使用Google Chrome浏览器(或Firefox)查找好起始URL**
</span>
在爬虫框架中,start_urls是当没有指定特定网址时爬虫开始抓取的网址列表。我们将使用start_urls列表中的元素来获取单个筹款活动链接。
1.下面的图片显示,根据您选择的类别,您将获得不同的起始网址。 黑色突出显示的部分是我们此次爬取的分类。
<span style='display:block;text-align:center'>
![4](https://yqfile.alicdn.com/0ebf9730340353e1db5c75a3ba9083bdf8630637.png)
</span>
对于本教程,列表start_urls中的第一个是:

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

2.这部分是关于获取更多的元素来放入start_urls列表。 我们需要找出如何去下一页,以便可以获得额外的url来放入start_urls。
<span style='display:block;text-align:center'>
![5](https://yqfile.alicdn.com/b1e8ca78675d250193c0cf684cffa720ef22273b.png)
</span>
第一幅图:在“Next”上点击鼠标右键(红色方框内)然后点击“Inspect”
第二幅图:蓝色高亮部分表示我们在我们的url后面加上了(如果我们想要另一页筹款活动:find?category=Health&page=2
(通过检查“下一步”按钮获取其他元素以放入start_urls列表)
第二个起始URL: 

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

下面的代码将在本教程后面的代码中用于爬虫。 它的作用是创建一个start_urls列表。变量npages代表的是我们想从多少个额外的页面(在第一页之后)中获取筹款活动链接。
(根据网站的现有结构生成额外的起始URL代码)
<span style='display:block;text-align:center'>
![6](https://yqfile.alicdn.com/4cd5343eb939cdd78a3838c2dbbe03654b1a18c9.png)
</span>

<span style='display:block;text-align:center'>
**查找单个筹款活动链接的Scrapy Shell**
</span>
学习如何使用Scrapy提取数据的最佳方法是使用Scrapy shell。我们将使用可用于从HTML文档中选择元素的XPath。
我们所要做的第一件事是尝试获得提取单个筹款活动链接的xpath表达式。 首先,我们查看筹款活动的链接大致分布在HTML的哪个位置。
<span style='display:block;text-align:center'>
![7](https://yqfile.alicdn.com/bcad0a8b75dcd60781359cc06b476ba5a7cecd3b.png)
</span>
第一幅图:右键点击你看到的第一个筹款活动链接,然后点击“inspect”
第二幅图:这个文本(红色方框内)是单个活动筹款URL 一部分
(查找到单个筹款活动系列的链接)
我们将使用XPath来提取包含在下面的红色矩形中的部分。
<span style='display:block;text-align:center'>
![8](https://yqfile.alicdn.com/fa3aac38401a524ae92cf3233e484313cb02ff58.png)
</span>

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

<span style='display:block;text-align:center'>
![9](https://yqfile.alicdn.com/6dd1d9c38c679db88de7b585272880c5f5525d41.png)
</span>
下面的代码是为了获取给定的初始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。
<span style='display:block;text-align:center'>
![10](https://yqfile.alicdn.com/6adf9a6c6119b455d17c65689f1ea2744e6ddf48.png)
</span>
<span style='display:block;text-align:center'>
**检查单个筹款活动**
</span>

我们已经了解了单个筹款活动链接的结构,本节将介绍各个筹款活动页面的内容。
1.接下来,我们打开一个单独的筹款活动页面(见下面的链接),以便爬取(我提醒一下,有些活动很难查看):https://fundrazr.com/savemyarm
2.使用与以前相同的检查过程,我们检查页面上的标题
<span style='display:block;text-align:center'>
![11](https://yqfile.alicdn.com/eb95ea8bfbf47c95b7f7460a38354acf5d77df24.png)
</span>
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]

<span style='display:block;text-align:center'>
![12](https://yqfile.alicdn.com/5c1a2c501d40b93d50afc90ead25266d13df5a99.png)
</span>
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()

<span style='display:block;text-align:center'>
**ITEMS**
</span>
爬取的主要目标是从非结构化数据源(通常是网页)中提取结构化数据。 Scrapy爬虫可以将提取的数据以Python dicts的形式返回。虽然非常方便,操作也很熟悉,但是Python dicts本身缺少结构化:容易造成字段名称中的输入错误或返回不一致的数据,特别是在具有许多爬虫的较大项目中(这一段几乎是直接从scrapy官方文档复制过来的)。
<span style='display:block;text-align:center'>
![13](https://yqfile.alicdn.com/a599e519624c665bb2a2e1e02212fc81ad446515.png)
</span>
items.py的代码在这里:

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




保存在fundrazr / fundrazr目录下(覆盖原始的items.py文件)。
本教程中使用的item类 (基本上是关于在输出以前,我们如何存储我们的数据的)看起来像这样。
<span style='display:block;text-align:center'>
![14](https://yqfile.alicdn.com/3fb53f92855010e2310b91250b75d2468e39cef8.png)
</span>

<span style='display:block;text-align:center'>
**爬虫**
</span>

爬虫是您所定义的类,Scrapy使用它来从一个网站或者一组网站爬取信息。我们的爬虫代码如下: 
<span style='display:block;text-align:center'>
![15](https://yqfile.alicdn.com/3dac521a113142bfc30a33cd9018520e3f081b1e.png)
</span>

在这里下载代码:

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

将它保存在fundrazr / spiders目录下,名为fundrazr_scrape.py的文件中。
目前项目应具有以下内容:
<span style='display:block;text-align:center'>
![16](https://yqfile.alicdn.com/fde0e87256377a94f6ba9fb929fc05245872bb5a.png)
</span>
<span style='display:block;text-align:center'>
**运行爬虫**
</span>
1.前往fundrazr / fundrazr目录,并输入:

scrapy crawl my_scraper -o MonthDay_Year.csv

<span style='display:block;text-align:center'>
![17](https://yqfile.alicdn.com/c7a9d674f9ed01d2e1b6a0d21ad61e17c30b067d.png)
</span>
2. 数据应该输出到fundrazr/fundrazr目录。
<span style='display:block;text-align:center'>
![18](https://yqfile.alicdn.com/684f45d4e8da1ce4c0b0adbecb579921c7306ce5.png)
</span>

<span style='display:block;text-align:center'>
**我们的数据**
</span>
本教程中输出的数据大致如下图所示。 随着网站不断更新,爬取出来的个别筹款活动将会有所不同。 此外,在excel读取csv文件的过程中,不同的活动数据间可能会出现空格
<span style='display:block;text-align:center'>
![19](https://yqfile.alicdn.com/201616e95d1c1f32115a52925bce835531dd092a.png)
</span>
2.如果要下载较大的文件(这个是通过将npages = 2更改为npages = 450并添加download_delay = 2来爬取得),您可以从我的github(```javascript
https://github.com/mGalarnyk/Python_Tutorials/tree/master/Scrapy/fundrazr/fundrazr)
上```  
下载包含大约6000个筹款活动的文件。 该文件称为MiniMorningScrape.csv(这是一个大文件)。
<span style='display:block;text-align:center'>
![20](https://yqfile.alicdn.com/9fa5d525dbd668659e87c36525bc0fbcdaebb6a3.png)
</span>
<span style='display:block;text-align:center'>
**结束语**
</span>
创建数据集需要大量的工作,而且往往是数据科学学习被忽略的一部分。还有一件没有解决的事情是,虽然我们已经爬取了大量的数据,我们还没有对数据进行足够的清洗,所以还不能做分析。不过那是另一个博客帖子的内容了。如果您有任何问题,可以在这里或者是Youtube页面(https://www.youtube.com/watch?v=O_j3OTXw2_E)留言告诉我! 

原文发布时间为:2017-10-28
本文来自云栖社区合作伙伴“[大数据文摘](https://mp.weixin.qq.com/s/A2QNr4-LTUNy-H8zE0OgXA)”,了解相关信息可以关注“[大数据文摘](https://mp.weixin.qq.com/s/A2QNr4-LTUNy-H8zE0OgXA)”微信公众号

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据科学系列:sklearn库主要模块功能简介
作为一名数据分析师,当我初次接触数据分析三剑客(numpy、pandas、matplotlib)时,感觉每个库的功能都很多很杂,所以在差不多理清了各模块功能后便相继推出了各自教程(文末附链接);后来,当接触了机器学习库sklearn之后,才发现三剑客也不外如是,相比sklearn简直是小巫见大巫;再后来,又开始了pyspark的学习之旅,发现无论是模块体积还是功能细分,pyspark又都完爆sklearn;最近,逐渐入坑深度学习(TensorFlow框架) 鉴于机器学习本身理论性很强,加之sklearn库功能强大API众多,自然不是总结
0 0
Django入门-5:模型的基本使用4-模型查询
Django入门-5:模型的基本使用4-模型查询
0 0
Django入门:第五章、模型建立与迁移
Django入门:第五章、模型建立与迁移
0 0
Py之scikit-learn:机器学习Sklearn库的简介、安装、使用方法(ML算法如何选择)、代码实现之详细攻略
Py之scikit-learn:机器学习Sklearn库的简介、安装、使用方法(ML算法如何选择)、代码实现之详细攻略
0 0
24、Python快速开发分布式搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图
【百度云搜索:http://www.lqkweb.com】 【搜网盘:http://www.swpan.cn】 1、基本概念 2、反爬虫的目的 3、爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图
5779 0
手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署
实用性教程!教你如何快速创建一个可用的机器学习程序!
2713 0
手把手教你如何新建scrapy爬虫框架的第一个项目(下)
前几天小编带大家学会了如何新建scrapy爬虫框架的第一个项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明。 在我们创建好Scrapy爬虫项目之后,会得到上图中的提示,大意是让我们直接根据模板进行创建Scrapy项目。
660 0
手把手教你如何新建scrapy爬虫框架的第一个项目(上)
前几天给大家分享了如何在Windows下创建网络爬虫虚拟环境及如何安装Scrapy还有Scrapy安装过程中常见的问题总结及其对应的解决方法感兴趣的小伙伴可以戳链接进去查看。关于Scrapy的介绍之前也在文章中提及过今天小编带大家进入Scrapy爬虫框架创建Scrapy爬虫框架的第一个项目具体过程如下所示。
1979 0
爬虫入门之Scrapy框架基础LinkExtractors(十一)
1 parse()方法的工作机制: 1. 因为使用的yield,而不是return。parse函数将会被当做一个生成器使用。
1539 0
+关注
技术小能手
云栖运营小编~
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载