下面是关于如何使用Scrapy中的ItemLoader提取数据的完整攻略。
1. ItemLoader简介
Scrapy中的ItemLoader是专门用于从网页中提取数据的工具,它可以根据规则从网页中提取数据,并把提取的数据存储到Scrapy的Item对象中。
ItemLoader的主要作用如下:
- 简化数据提取的过程,提高代码的复用性;
- 支持添加自定义的输入或输出处理器(如字符串清洗、时间格式化);
- 支持链式调用多个处理器;
- 使用默认的xpath或css选择器。
2. ItemLoader基本用法
ItemLoader的基本用法如下:
- 在Spider中定义Item,例如:
```python
import scrapy
class MyItem(scrapy.Item):
field1 = scrapy.Field()
field2 = scrapy.Field()
```
- 在Spider中定义ItemLoader,例如:
```python
from scrapy.loader import ItemLoader
from myproject.items import MyItem
class MyItemLoader(ItemLoader):
default_item_class = MyItem
default_input_processor = MapCompose(lambda s: s.strip(), unicode)
default_output_processor = TakeFirst()
```
- 在Spider中编写规则,例如:
```python
from scrapy.loader.processors import Join
loader.add_xpath('field1', '//div[@class="field1"]/text()')
loader.add_xpath('field2', '//div[@class="field2"]//text()', Join())
```
- 在Spider中生成Item对象,例如:
python
item = loader.load_item()
其中,default_input_processor
和default_output_processor
是默认的输入和输出处理器,add_xpath()
方法可添加xpath表达式或css选择器,Join()
方法可指定规则。
3. ItemLoader示例
下面给出两个ItemLoader的示例说明:
示例1:提取单个数据
假设有一个包含电影评分的网站(网址为https://movie.163.com/movie/top
),要提取排行榜中所有电影的名称和评分。
- 在Spider中定义Item,例如:
```python
import scrapy
class MovieItem(scrapy.Item):
name = scrapy.Field()
score = scrapy.Field()
```
- 在Spider中定义ItemLoader,例如:
```python
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose
from movie.items import MovieItem
class MovieLoader(ItemLoader):
default_item_class = MovieItem
default_output_processor = TakeFirst()
name_in = MapCompose(str.strip)
score_in = MapCompose(float)
```
- 在Spider中编写规则,例如:
python
loaders = response.xpath('//div[@class="movielist"]/ul[@class="list"]/li')
for loader in loaders:
item = MovieLoader(selector=loader)
item.add_xpath('name', 'div[@class="name"]/a/text()')
item.add_xpath('score', 'div[@class="score"]/text()')
yield item.load_item()
- 在Spider中生成Item对象,例如:
python
item = loader.load_item()
示例2:提取多个数据
假设有一个包含书籍信息的网站(网址为https://book.douban.com/latest
),要提取最新图书中所有书名、作者、出版社和价格。
- 在Spider中定义Item,例如:
```python
import scrapy
class BookItem(scrapy.Item):
title = scrapy.Field()
authors = scrapy.Field()
press = scrapy.Field()
price = scrapy.Field()
```
- 在Spider中定义ItemLoader,例如:
```python
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose
from book.items import BookItem
class BookLoader(ItemLoader):
default_item_class = BookItem
default_output_processor = TakeFirst()
title_in = MapCompose(str.strip)
authors_out = Join(',')
press_in = MapCompose(str.strip)
price_in = MapCompose(float)
```
- 在Spider中编写规则,例如:
python
loaders = response.xpath('//div[@class="book-detail"]')
for loader in loaders:
item = BookLoader(selector=loader)
item.add_xpath('title', 'h2/a/text()')
item.add_xpath('authors', 'div[@class="publishing"]/text()')
item.add_xpath('press', 'div[@class="publishing"]/text()')
item.add_xpath('price', 'div[@class="price"]/text()')
yield item.load_item()
- 在Spider中生成Item对象,例如:
python
item = loader.load_item()
以上是关于如何使用Scrapy中的ItemLoader提取数据的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何使用scrapy中的ItemLoader提取数据 - Python技术站