Scrapy简述
Scrapy是一个爬虫应用框架,所谓爬虫,即是用来爬取web网页并从中提取结构化数据,这些爬来的数据可以被应用在广泛的有用的应用中,像数据挖掘,信息处理和历史存档等。
尽管Scrapy起初被设计用于web scraping,但是它也能被用于使用APIs提取数据(例如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: next_page = response.urljoin(next_page) yield scrapy.Request(next_page, callback=self.parse)
将上述代码写到一个text文件中,例如quotes_spider.py文件,使用 runspider 命令运行spider。
scrapy runspider quotes_spider.py -o quotes.json
当执行完成后,你将看到一个JSON文件quotes.json,包含文本和作者,如下(这里重新格式化了文件,为了提高可读性):
[{ "author": "Jane Austen", "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d" }, { "author": "Groucho Marx", "text": "\u201cOutside of a dog, a book is man‘s best friend. Inside of a dog it‘s too dark to read.\u201d" }, { "author": "Steve Martin", "text": "\u201cA day without sunshine is like, you know, night.\u201d" }, ...]
刚才发生了什么?
当你运行命令 scrapy runspider quotes_spider.py,Scrapy查找定义在它里面的一个Spider,并通过它的crawler引擎运行它。
crawl开始,通过向定义在start_urls属性里的URLs(在这个例子里,只有humor category的quotes的URL)提出请求,并且调用默认的反馈函数parse,通过回复对象做为一个参数。在反馈函数parse中,我们使用一个CSS Selector 遍历quote元素,生成一个提取了quote内容和作者的Python字典,查找子页面的链接,并使用同样的parse方法做为反馈函数依次提出请求。
这里你能看到Scrapy的一个主要优点之一:请求是可调度的并且可以异步处理。这意味着Scrapy不需要等待一个请求结束和处理完成,在这期间,它可以发送另一个请求或者做其他的事情。这也意味着其他请求可以保持进行,即是一些请求失败或者一些错误发生。
Scrapy使你有能力非常快速的爬取(以容错的方式,同时发送多条请求),与此同时,你也可以通过a few settings进行爬取配置。你可以做一些配置,比如设置两个请求之间的下载延迟,限制每个域或者每个IP的并发请求数量,甚至学习using an auto-throttling extension来自动计算出这些。