0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Scrapy爬取网站数据

zhKF_jqr_AI 来源:未知 作者:李倩 2018-07-26 09:06 次阅读

编者按:斯克里普斯研究所数据科学家Michael Galarnyk介绍了如何使用Scrapy爬取网站数据。

我刚开始在业界工作时,首先意识到的一件事情是,有时候需要自己收集、整理、清洗数据。在这篇教程中,我们将从一个众筹网站FundRazr收集数据。和许多网站一样,这个网站有自己的结构、形式,还有众多有用的数据,但却没有一个结构化的API,所以获取数据并不容易。在这篇教程中,我们将爬取网站数据,将其整理为有序的形式,以创建我们自己的数据集。

我们将使用Scrapy,一个构建网页爬虫的框架。Scrapy可以帮助我们创建和维护网页爬虫。它让我们可以专注于使用CSS选择器和XPath表达式提取数据,更少操心爬虫的内部工作机制。这篇教程比Scrapy官方教程要深入一点,希望你在读完这篇教程后,碰到需要抓取有一定难度的数据的情况时,也能自行完成。好了,让我们开始吧。

预备

如果你已经安装了anaconda和google chrome(或Firefox),可以跳过这一节。

安装Anaconda。你可以从官网下载anaconda自行安装,也可以参考我之前写的anaconda安装教程(Mac、Windows、Ubuntu、环境管理)。

安装Scrapy。其实Anaconda已经自带了Scrapy,不过如果遇到问题,你也可以自行安装:

conda install -c conda-forge scrapy

确保你安装了chrome或firefox. 在这篇教程中,我将使用chrome.

创建新Scrapy项目

用startproject命令可以创建新项目:

该命令会创建一个fundrazr目录:

fundrazr/

scrapy.cfg # 部署配置文件

fundrazr/ # 项目的Python模块

__init__.py

items.py # 项目item定义

pipelines.py # 项目pipeline文件

settings.py # 项目设置文件

spiders/ # 爬虫目录

__init__.py

scrapy startproject fundrazr

使用chrome(或firefox)的开发者工具查找初始url

在爬虫框架中,start_urls是爬虫开始抓取的url列表。我们将通过start_urls列表中的每个元素得到单个项目页面的链接。

下图显示,选择的类别不同,初始url也不一样。黑框高亮的部分是待抓取的类别。

在本教程中,start_urls列表中的第一项是:

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

接下来,我们将看看如何访问下一页,并将相应的url加入start_urls。

第二个url是:

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

下面是创建start_urls列表的代码。其中,npages指定翻页的页数。

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

npages = 2

for i in range(2, npages + 2 ):

start_urls.append("https://fundrazr.com/find?category=Health&page="+str(i)+"")

使用Srapy shell查找单个项目页面

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

我们首先需要尝试获取单个项目页面链接的XPath。我们将利用浏览器的检查元素。

我们将使用XPath提取下图中红框内的部分。

我们首先启动Scrapy shell:

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

使用exit()退出Scrapy shell.

单个项目页面

之前我们介绍了如何提取单个项目页面链接。现在我们将介绍如何提取单个项目页面上的信息

首先我们前往将要抓取的单个项目页面(链接见下)。

使用上一节提到的方法,检查页面的标题。

现在我们将再次使用Scrapy shell,只不过这次是在单个项目页面启动。

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

提取标题的代码是:

response.xpath("//div[contains(@id, 'campaign-title')]/descendant::text()").extract()[0]

页面其他部分同理:

# 筹款总额

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

# url

response.xpath("//meta[@property='og:url']/@content").extract()

Items

网页抓取的主要目标是从无结构的来源提取出结构信息。Scrapy爬虫以Python字典的形式返回提取数据。尽管Python字典既方便又熟悉,但仍然不够结构化:字段名容易出现拼写错误,返回不一致的信息,特别是在有多个爬虫的大型项目中。因此,我们定义Item类来(在输出数据之前)存储数据。

import scrapy

classFundrazrItem(scrapy.Item):

campaignTitle = scrapy.Field()

amountRaised = scrapy.Field()

goal = scrapy.Field()

currencyType = scrapy.Field()

endDate = scrapy.Field()

numberContributors = scrapy.Field()

story = scrapy.Field()

url = scrapy.Field()

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

爬虫

我们定义爬虫类,供Scrapy使用,以抓取一个网站(或一组网站)的信息。

# 继承scrapy.Spider类

classFundrazr(scrapy.Spider):

# 指定爬虫名称,运行爬虫时要要到

name = "my_scraper"

# 定义start_urls、npages

# 具体定义见前

def parse(self, response):

for href in response.xpath("//h2[contains(@class, 'title headline-font')]/a[contains(@class, 'campaign-link')]//@href"):

# 加上协议名称

url = "https:" + href.extract()

# 异步抓取

yield scrapy.Request(url, callback=self.parse_dir_contents)

# 回调函数定义

def parse_dir_cntents(self, response):

item = FundrazrItem()

# 下面依次定义item的各字段,

# 具体定义参见前面的XPath表达式

yield item

为了节约篇幅,以上代码仅仅呈现了爬虫的大致结构,省略了导入依赖的语句以及前几节已经涉及的具体代码。完整代码可以从我的GitHub仓库获取:mGalarnyk/Python_Tutorials

爬虫代码保存在fundrazr/spiders目录下,文件命名为fundrazr_scrape.py。

运行爬虫

在fundrazr/fundrazr目录下输入:

scrapy crawl my_scraper -o MonthDay_Year.csv

数据输出文件位于fundrazr/fundrazr目录下。

我们的数据

输出的数据应该类似下面的图片。由于网站不断地更新,因此具体的众筹项目会不同。另外,项目记录间可能会有空行,这是excel解析csv文件时会出现的现象。

我将npages从2改到了450,并增加了download_delay = 2,抓取了约6000个项目,保存为MiniMorningScrape.csv文件。你可以从我的GitHu仓库直接下载这一文件:mGalarnyk/Python_Tutorials

结语

创建数据集可能需要大费周章,而在学习数据科学时却常常被忽略。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据集
    +关注

    关注

    4

    文章

    1178

    浏览量

    24348
  • 选择器
    +关注

    关注

    0

    文章

    103

    浏览量

    14321
  • 爬虫
    +关注

    关注

    0

    文章

    77

    浏览量

    6514

原文标题:使用Scrapy自建数据集

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Python爬虫与Web开发库盘点

    Python爬虫和Web开发均是与网页相关的知识技能,无论是自己搭建的网站还是爬虫去别人的网站,都离不开相应的Python库,以下是常用的Python爬虫与Web开发库。1.爬虫库
    发表于 05-10 15:21

    Crawler:基于urllib+requests库+伪装浏览器实现国内知名招聘网站信息(2018430之前)并保存在csv文件内

    Crawler:基于urllib+requests库+伪装浏览器实现国内知名招聘网站,上海地区与机器学习有关的***(2018430之前)并保存在csv文件内
    发表于 12-19 17:02

    Crawler之ScrapyScrapy简介、安装、使用方法之详细攻略

    Crawler之ScrapyScrapy简介、安装、使用方法之详细攻略
    发表于 12-21 10:43

    采用xpath网站内容

    xpathmooc网课程
    发表于 04-11 12:01

    基于Python3对携程网页上北京五星级酒店列表的

    Python3 携程网[1] 根据好评优先顺序,获取北京五星级酒店列表
    发表于 04-19 16:25

    基于Python实现一只小爬虫拉勾网职位信息的方法

    通俗易懂的分析如何用Python实现一只小爬虫,拉勾网的职位信息
    发表于 05-17 06:54

    python音频文件的步骤

    python爬虫音频文件
    发表于 08-22 14:23

    scrapy爬虫小说方法

    scrapy小说(一)
    发表于 09-19 06:29

    爬虫可以采集哪些数据

    一、爬虫可以采集哪些数据   1.图片、文本、视频   商品(店铺)评论以及各种图片网站,获得图片资源以及评论文本数据。   掌握正确的
    发表于 10-15 17:25

    如何提高爬虫采集效率

    一样了——这种情况下只能用分布式,一个Master存储队列,其他多个Slave各自来,这样共享一个队列,的情况下互斥也不会重复scrapy
    发表于 12-23 17:16

    Python豆瓣电影信息和存储数据

    Python——豆瓣电影信息并存储数据
    发表于 03-11 11:19

    scrapy框架是什么

    scrapy框架总结
    发表于 03-24 11:09

    豆瓣电影Top250信息

    ) # 判断是否取到数据,并调用解析函数 if html:for item in parsePage(html):writeFile(item)# 判断当前执行是否为主程序运行,并遍历调用主函数
    发表于 03-23 15:47

    Scrapy怎么爬取Python文件

    我们介绍了Scrapy框架运行基本原理,紧接着我们介绍了如何利用Scrapy爬取文本数据
    的头像 发表于 02-24 15:16 349次阅读
    <b class='flag-5'>Scrapy</b>怎么爬取Python文件

    使用Scrapy抓取房地产站点数据采集

    使用 Scrapy 抓取房地产站点数据采集
    的头像 发表于 07-05 16:30 351次阅读