受权转载自:数据派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
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