Scrapy 是用于抓取网站并提取结构化数据的应用程序框架,其应用很是普遍,如数据挖掘,信息处理或历史存档。css
尽管 Scrapy 最初设计用于网络数据采集(web scraping),但它也可用于使用 API(如 Amazon Associates Web Services)提取数据或用做通用的网络爬虫。html
为了向您展现 Scrapy 带给您的是什么,咱们将使用最简单的方式运行一个爬虫,向您展现一个 Scrape Spider 的例子。web
这是一个爬虫的代码,用于从网站 http://quotes.toscrape.com 中抓取名人名言(famous quotes):正则表达式
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 命令启动爬虫:shell
scrapy runspider quotes_spider.py -o quotes.json
运行完成后,您将在 quotes.json 文件中看到 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 定义,并经过抓取引擎运行它。json
经过对 start_urls 属性中定义的 URL(在里,只有一个URL,为标签(tag)为幽默(humor)的名言)发起请求(making requests)启动爬虫,并调用默认的回调方法 parse,参数为响应对象(response)。在 parse 回调方法中,咱们使用 CSS 选择器循环遍历名言(quote)所在的元素,产生(yield)一个包含名人名言的 Python 字典,而后查找下一页的连接,并使用一样的回调方法 parse 发起另外一个请求。后端
在这里,您或许注意到了 Scrapy 的主要优势之一:请求和处理是异步的。 这意味着 Scrapy 不须要等待一个请求返回的结果被处理完毕,就能够在此期间发起另外一个请求或执行其余操做。 这也意味着即便某些请求失败了或在处理它时发生错误,其余请求仍然能够继续进行。api
虽然这样可使您进行很是快速的抓取(以容错方式同时发起多个请求),Scrapy 也可让您经过一些设置来控制爬网的速度。 您能够在每一个请求之间设置下载延迟,限制每一个域或每一个 IP 的并发请求数量,甚至使用自动调节扩展来自动计算这些延迟。缓存
注意
这里使用了 feed exports 来生成 JSON 文件,您能够轻松地更改导出格式(例如,XML 或 CSV)和存储后台(例如,FTP 或 Amazon S3)。您还能够编写一个项目管道(item pipeline)以将项目存储在数据库中。
您已经看到如何使用 Scrapy 从网站中提取和存储数据,但这只是表面的。Scrapy 提供了许多强大的功能使爬取更容易高效,如:
接下来的步骤是安装 Scrapy,根据教程建立一个完整的 Scrapy 项目并加入社区。 感谢您的关注!