Scrapy1.5入门(一)——初识Scrapy

本文为译文,原文见地址:https://docs.scrapy.org/en/latest/intro/overview.html

初识Scrapy

Scrapy是一个用来爬取web网站和提取结构化数据的应用框架,可用于数据挖掘、信息的处理或者归档。

即使Scrapy最初是为web抓取(web scraping)而设计的,但它也可以使用api(如Amazon Associates web Services)提取数据,或者用作通用的web爬行器。

一个简单的爬虫(spider)示例

为了明确Scrapy能做什么,我们将实现一个最简单的Scrapy爬虫示例。

下面的代码实现了一个爬虫,用来爬取网站http://quotes.toscrape.com/上的名人名言:

import scrapy

class QuotesSpider(scrapy.Spider):
	name = "quotes"
	start_urls = [
		'http://quotes.toscrape.com/tag/humor/',
	]

	def parse(self, response):
		for quote in response.css('div.quote'):
			yield {
				'text': quote.css('span.text::text').extract_first(),
				'author': quote.xpath('span/small/text()').extract_first(),
			}
		next_page = response.css('li.next a::attr("href")').extract_first()
		if next_page is not None:
			yield response.follow(next_page, self.parse)

将上述代码保存在一个文本文件(这里命名为quotes_spider.py)中,然后使用runspider命令运行:

scrapy runspider quotes_spider.py -o quotes.json

当执行完毕以后,你会发现在quotes_spider.py文件所在文件夹下会多了一个JSON格式的文件quotes.json,内容如下:

[
{"text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d", "author": "Jane Austen"},
{"text": "\u201cA day without sunshine is like, you know, night.\u201d", "author": "Steve Martin"},
{"text": "\u201cAnyone who thinks sitting in church can make you a Christian must also think that sitting in a garage can make you a car.\u201d", "author": "Garrison Keillor"},
{"text": "\u201cBeauty is in the eye of the beholder and it may be necessary from time to time to give a stupid or misinformed beholder a black eye.\u201d", "author": "Jim Henson"},
{"text": "\u201cAll you need is love. But a little chocolate now and then doesn't hurt.\u201d", "author": "Charles M. Schulz"},
{"text": "\u201cRemember, we're madly in love, so it's all right to kiss me anytime you feel like it.\u201d", "author": "Suzanne Collins"},
{"text": "\u201cSome people never go crazy. What truly horrible lives they must lead.\u201d", "author": "Charles Bukowski"},
{"text": "\u201cThe trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.\u201d", "author": "Terry Pratchett"},
{"text": "\u201cThink left and think right and think low and think high. Oh, the thinks you can think up if only you try!\u201d", "author": "Dr. Seuss"},
{"text": "\u201cThe reason I talk to myself is because I\u2019m the only one whose answers I accept.\u201d", "author": "George Carlin"},
{"text": "\u201cI am free of all prejudice. I hate everyone equally. \u201d", "author": "W.C. Fields"},
{"text": "\u201cA lady's imagination is very rapid; it jumps from admiration to love, from love to matrimony in a moment.\u201d", "author": "Jane Austen"}
]

刚刚发生了啥?

当你运行了scrapy runspider quotes_spider.py这条命令后,Scrapy会在quotes_spider.py中去寻找一个定义了的爬虫(这里是QuotesSpider),并且使用Scrapy的爬行器引擎(crawler engine)来执行这个定义了的爬虫。

爬行通过向start_urls属性中定义的URL发出请求(在本示例中,仅向带有humor类别的URL发送请求),并且调用默认的回调函数parse,这个回调函数接收一个response对象。在parse回调函数中,通过使用CSS选择器,我们将对名人名言进行循环遍历,首先生成一个Python的字典,这个字典包含名言的内容和作者,然后寻找下一个的链接,最后调度另一个请求,这个请求同样包含了回调函数parse。

你应该注意到了Scrapy的主要优势:请求被调度,并且被异步处理。这意味着Scrapy不需要等待一个请求的完成和处理,就可以在同一时间发送另外一个请求或者做其他的事情。这也意味着其他请求可以保持执行状态,即使某些请求失败了或者在处理过程中出现了一个异常。

虽然这能使你非常快速地爬取网站(以一种容错的方式,在同一时间发送多个并发请求),但是Scrapy也为你提供了一些方法可以优雅地爬取网站:使用一些设置项。你可以通过这些设置项做一些事情,比如在每个请求之间设置一个下载延迟,限制每个域或者每个IP的并发请求数量,甚至可以使用一个自动限流的扩展来尝试自动地计算这些请求。

还有什么呢?

你已经知道了,怎样使用Scrapy来提取和存储一个网站的数据,但是这确实很肤浅的方式。Scrapy还提供了很多强大的特性,这些特性使爬取更加容易且有效率,比如:

  • 内置支持使用扩展的CSS选择器和XPath表达式从HTML/XML源选择和提取数据,以及使用正则表达式提取数据的辅助方法。
  • 交互式shell窗口(IPython aware),可以用来尝试通过CSS和XPath表达式抓取数据,在编写或调试爬虫的时候非常有用。
  • 内置支持以多种格式(JSON、CSV、XML)导出反馈,并将其存储在多个后台(FTP、S3、本地文件系统等)。
  • 健壮的编码支持和自动检测,用于处理外来的、非标准的和损坏的编码声明。
  • 强大的可扩展性支持,允许你使用信号和定义良好的API(中间件、扩展管道)来插入你所需的功能。
  • 处理各种内置扩展和中间件:
    • cookie和session的处理
    • HTTP特性,比如压缩、用户验证、缓存
    • user-agent的伪装
    • robot.txt
    • 深层爬取的重定向
    • 等等
  • Telnet控制台,用于连接到运行在Scrapy进程内部的Python控制台,以便自查和调试你的爬虫。
  • 其他好处,比如可重用的爬虫能够从站点地图和XML/CSV提要中爬取网站,用来自动下载图片(或者其他媒体)的媒体管道,缓存DNS解析器,等等。

接下来干什么呢?

下一步你需要安装Scrapy跟着这系列教程学习如何创建一个成熟的Scrapy项目,并且加入社区

猜你喜欢

转载自blog.csdn.net/ReganDu/article/details/85778066