Python 爬虫框架Scrapy ITEM PIPELINE

Scrapy的ITEM PIPELINE用于数据清洗、验证、去重和存储。它在Spider运行过程中执行,如清理HTML、检查字段、防止重复数据,并将数据存入数据库。核心方法包括open_spider、close_spider、from_crawler以及必需实现的process_item,后者对每个Item进行处理。要启用pipeline,需配置文件中设置,并可参考官方文档和相关教程进一步了解。
摘要由CSDN通过智能技术生成

Typical uses of item pipelines are:

  • cleansing HTML data
  • validating scraped data (checking that the items contain certain fields)
  • checking for duplicates (and dropping them)
  • storing the scraped item in a database

ITEM PIPELINE作用:

  • 清理HTML数据
  • 验证爬取的数据(检查item包含某些字段)
  • 去重(并丢弃)【预防数据去重,真正去重是在url,即请求阶段做】
  • 将爬取结果保存到数据库中

ITEM PIPELINE核心方法:

  • open_spider(spider):该方法非必需,在Spider开启时被调用,主要做一些初始化操作,如连接数据库等
  • close_spider(spider):该方法非必需,在Spider关闭时被调用,主要做一些如关闭数据库连接等收尾性质的工作
  • from_crawler(cls,crawler):该方法非必需,Spider启用时调用,早于open_spider()方法,是一个类方法,用@classmethod标识,它与__init__函有关,这里我们不详解(一般我们不对它进行修改)
  • process_item(item,spider):该方法必需实现,定义的Item pipeline会默认调用该方法对Item进行处理,它返回Item类型的值或者抛出DropItem异常

官方例子:

import scrapy
import hashlib
from urllib.parse import quote


class ScreenshotPipeline(object):
    """Pipeline that uses Splash to render screenshot of
    every Scrapy item."""

    SPLASH_URL = "http://localhost:8050/render.png?url={}"

    async def process_item(self, item, spider):
        encoded_item_url = quote(item["url"])
        screenshot_url = self.SPLASH_URL.format(encoded_item_url)
        request = scrapy.Request(screenshot_url)
        response = await spider.crawler.engine.download(request, spider)

        if response.status != 200:
            # Error happened, return item.
            return item

        # Save screenshot to file, filename will be hash of url.
        url = item["url"]
        url_hash = hashlib.md5(url.encode("utf8")).hexdigest()
        filename = "{}.png".format(url_hash)
        with open(filename, "wb") as f:
            f.write(response.body)

        # Store filename in item.
        item["screenshot_filename"] = filename
        return item

注意需要修改配置文件:

ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}

感觉像个拦截器。

可以参考:
https://doc.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports
https://www.cnblogs.com/518894-lu/p/9053939.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值