Scrapy 是一个强大的 Python 爬虫框架。它不仅提供了许多方便的工具来爬取网站,还提供了 ItemLoader 工具来方便地从网页中提取数据。
ItemLoader 是 Scrapy 提供的用来加载 Item 对象的工具。它相当于一个中间层,可以轻松地从网页中提取并整理需要的数据。
首先,需要在 Spider 中引入 ItemLoader,它的使用方法很简单:
from scrapy.loader import ItemLoader
from myproject.items import ArticleItem
然后,定义好需要提取的数据项及其对应的 CSS 选择器或者 XPath,添加到 ItemLoader 对象中:
class ArticleSpider(scrapy.Spider):
name = 'article'
start_urls = ['https://example.com/blog']
def parse(self, response):
loader = ItemLoader(item=ArticleItem(), response=response)
loader.add_css('title', 'h1::text')
loader.add_css('content', 'article > p')
loader.add_css('author', '.author::text')
return loader.load_item()
在 parse 方法中,首先构造 ItemLoader 对象并且指定要填充的 Item 类型。然后,通过 add_css 或者 add_xpath 方法,将需要提取的数据项与对应的 HTML 元素进行绑定。add_css 方法接受两个参数,第一个参数是要填充的属性名,第二个参数是 CSS 选择器。add_xpath 方法同理。
最后,调用 loader.load_item() 方法将提取后的数据填充到 Item 对象中,然后返回即可。在 Item 对象中,可以定义各种属性,用来存储从网页提取后的数据:
from scrapy import Item, Field
class ArticleItem(Item):
title = Field()
content = Field()
author = Field()
除了 add_css 和 add_xpath 方法,ItemLoader 还提供了一些其他的方法,可以进一步对提取的数据进行筛选、清理、容错处理等。比如,可以使用 default_output_processor 来设置输出格式。可以使用 MapCompose 来进行文本清理和转换。可以使用 Join 来将多个文本合并成一个文本。可以使用 TakeFirst 来取列表中的第一个值。
ItemLoader 的使用举例:
# 提取数字列表,只保留大于等于 0 的数字
loader.add_css('numbers', 'ul.numbers li::text', MapCompose(float), lambda x: x >= 0)
# 合并多个文本为一个文本,并使用字符串替换
loader.add_css('description', 'ul.description li::text', Join(' '), replace_entities)
除了 ItemLoader,Scrapy 还提供了其他许多方便的工具,可以让我们更加便捷地爬取数据。具体使用方法可以参考官方文档:https://docs.scrapy.org/en/latest/index.html