爬虫基础5(框架Scrapy中做持久化(items/pipelines)【以文件保存】)

框架Scrapy中做持久化(items/pipelines)【以文件保存】

步骤:

a. 先写pipeline类

from scrapy.exceptions import DropItem

        class FilePipeline(object):

            def __init__(self,path):
                """
                类的初始化
                """
                self.f = None
                self.path = path

            @classmethod
            def from_crawler(cls, crawler):
                """
                初始化时候,用于创建pipeline对象
                :param crawler:有一个方法可以点出所有的配置
                :return:
                """
                print('File.from_crawler')
                # 在整个项目中找HREF_FILE_PATH的配置【因为settings.py文件中的配置是不全的】
                path = crawler.settings.get('HREF_FILE_PATH')  # HREF_FILE_PATH自定义文件存储路径配置
                return cls(path)

            def open_spider(self,spider):
                """
                爬虫开始执行时,调用
                :param spider:
                :return:
                """
                print('File.open_spider')
                self.f = open(self.path,'a+')

            def process_item(self, item, spider):
                """
                爬虫中每一次 yield item 都会调用一次
                """
                # f = open('xx.log','a+')
                # f.write(item['href']+'\n')
                # f.close()
                print('File',item['href'])
                self.f.write(item['href']+'\n')
                
                # return item      # 交给下一个pipeline的process_item方法【可以在不同的类中定义多个process_item方法】
                raise DropItem()# 后续的 pipeline的process_item方法不再执行

            def close_spider(self,spider):
                """
                爬虫关闭时,被调用
                :param spider:
                :return:
                """
                print('File.close_spider')
                self.f.close()


    # 注意:pipeline是所有爬虫公用,如果想要给某个爬虫定制需要使用spider参数自己进行处理。

b. 写Item类

 class XdbItem(scrapy.Item):
                """
                规则化/实例化几个对象就定义几个
                """
                href = scrapy.Field()
                title = scrapy.Field()

c. 配置(settings.py)

 ITEM_PIPELINES = {
                # 数越小越先执行
                'xdb.pipelines.XdbPipeline': 300,
            }
# 文件存储位置配置
HREF_FILE_PATH = 'new0log'

d. 爬虫,yield每执行一次,process_item就调用一次。

# -*- coding: utf-8 -*-
import scrapy
import sys, os, io
from scrapy.http import Request
from scrapy.http.response.html import HtmlResponse
# 引入items文件中的类
from xdb.items import XdbItem

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')


class ChoutiSpider(scrapy.Spider):
    name = 'chouti'
    allowed_domains = ['chouti.com']
    start_urls = ['http://chouti.com/']

    def parse(self, response):
        # 去子孙中找div并且id="content-list
        item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]')
        for item in item_list:
            text = item.xpath('.//a/text()').extract_first()
            hraf = item.xpath('.//a/@href').extract_first()
            # 每yield一次process_item就调用一次
            yield XdbItem(title=text, href=hraf)

 

转载于:https://www.cnblogs.com/L5251/articles/9259658.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值