框架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)