共计 1799 个字符,预计需要花费 5 分钟才能阅读完成。
在咱们的初级教程中,咱们介绍了如何应用 Scrapy 创立和运行一个简略的爬虫。在这篇文章中,咱们将深刻理解 Scrapy 的弱小性能,学习如何应用 Scrapy 提取和解决数据。
一、数据提取:Selectors 和 Item
在 Scrapy 中,提取数据次要通过 Selectors 来实现。Selectors 基于 XPath 或 CSS 表达式的查询语言来选取 HTML 文档中的元素。你能够在你的爬虫中应用 response 对象的 xpath
或css
办法来创立一个 Selector 对象。
例如,咱们能够批改咱们的 QuotesSpider 爬虫,应用 Selectors 来提取每个援用的文本和作者:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://quotes.toscrape.com/page/1/',]
def parse(self, response):
for quote in response.css('div.quote'):
text = quote.css('span.text::text').get()
author = quote.css('span small::text').get()
print(f'Text: {text}, Author: {author}')
此外,Scrapy 还提供了 Item 类,能够定义你想要收集的数据结构。Item 类非常适合收集结构化数据,如咱们从 quotes.toscrape.com 中获取的援用:
import scrapy
class QuoteItem(scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
而后咱们能够批改 QuotesSpider 爬虫,使其生成和收集 QuoteItem 对象:
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://quotes.toscrape.com/page/1/',]
def parse(self, response):
for quote in response.css('div.quote'):
item = QuoteItem()
item['text'] = quote.css('span.text::text').get()
item['author'] = quote.css('span small::text').get()
yield item
二、数据处理:Pipelines
Scrapy 应用数据管道(pipelines)来解决爬虫从网页中抓取的 Item。当爬虫生成一个 Item,它将被发送到 Item Pipeline 进行解决。
Item Pipeline 是一些依照执行顺序排列的类,每个类都是一个数据处理单元。每个 Item Pipeline 组件都是一个 Python 类,必须实现一个 process_item 办法。这个办法必须返回一个 Item 对象,或者抛出 DropItem 异样,被抛弃的 item 将不会被之后的 pipeline 组件所解决。
例如,咱们能够增加一个 Pipeline,将收集的援用保留到 JSON 文件中:
import json
class JsonWriterPipeline(object):
def open_spider(self, spider):
self.file = open('quotes.jl', 'w')
def close_spider(self, spider):
self.file.close()
def process_item(self, item, spider):
line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
而后你须要在我的项目的设置文件(settings.py)中启用你的 Pipeline:
ITEM_PIPELINES = {'tutorial.pipelines.JsonWriterPipeline': 1,}
在这篇文章中,咱们更深刻地探讨了 Scrapy 的性能,包含如何应用 Selectors 和 Item 提取数据,如何应用 Pipelines 解决数据。在下一篇文章中,咱们将学习如何应用 Scrapy 解决更简单的状况,如登录、cookies、以及如何防止爬虫被网站辨认和封闭等问题。