Поиск по блогу

понедельник, 17 ноября 2014 г.

Зачем нужны Scrapy Feed exports и CsvItemExporter

Первый вариант настройки в документации, второй - super(SlybotCSVItemExporter, self).init(args, *kwargs) - чемпион ГитХаба, для начала я воспроизвел второй вариант от github agrimrules/Python-Web-Crawler но воспроизвел в посте Пробовал "Scrapy feed exporter" ... а до первого варианта здесь так и не дошел... Зато в этом посте около 30 ссылок !

Оказалось, что весь сыр-бор только из-за того, чтобы упорядочить поля в сsv файле

Начинаем со второго варианта, пока не попробовал, не понимал, как он рбоатет

Начал пробовать здесь, но в итоге перенес все отсюда в отдельный пост (ссылка в summary к этому посту)

Здесь далее описан процесс установки и фрагменты кода...

1. В проверенном пауке для тестов отключил ITEM_PIPELINES , но втавил FEED_EXPORTERS, естественно, не забыл проверить путь
In [2]:
%load C:\Users\kiss\Documents\GitMyScrapy\scrapy_xml_1\XMLFeedSpider\XMLFeedSpider\\settings.py
In []:
# Scrapy settings for XMLFeedSpider project
#
# For simplicity, this file contains only the most important settings by
# default. All the other settings are documented here:
#
#     http://doc.scrapy.org/en/latest/topics/settings.html
#

BOT_NAME = 'XMLFeedSpider'

SPIDER_MODULES = ['XMLFeedSpider.spiders']
NEWSPIDER_MODULE = 'XMLFeedSpider.spiders'

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'XMLFeedSpider (+http://www.yourdomain.com)'
DOWNLOADER_MIDDLEWARES = {
        'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
        'XMLFeedSpider.middleware.RotateUserAgentMiddleware' :400
    }

#ITEM_PIPELINES = {
#'XMLFeedSpider.pipelines.XmlfeedspiderPipeline':300,
#'XMLFeedSpider.pipelines_filr1.ItemsFiltrsPipeline':350,
#'XMLFeedSpider.pipelines_tofile.ProxyListWriterPipeline':400
# }

FEED_EXPORTERS = {
 'csv': 'XMLFeedSpider.itemexport.CSVOptionRespectingItemExporter',
}
2. Скопировал из apple/contrib/itemexport.py в папку с файлами настроек паука
In [3]:
%load C:\Users\kiss\Documents\GitMyScrapy\scrapy_xml_1\XMLFeedSpider\XMLFeedSpider\itemexport.py
In []:
"""
Created on Tue Nov 11 17:13:41 2014

@author: kiss

This is the copy of https://github.com/chappyhome/qidian/blob/0d87f422a0172b0607d59c38e276de4b77618ff3/apple/contrib/itemexport.py
"""

from scrapy.conf import settings
from scrapy.contrib.exporter import CsvItemExporter

class CSVOptionRespectingItemExporter(CsvItemExporter):
    def __init__(self, *args, **kwargs):
        delimiter = settings.get('CSV_DELIMITER', ',')
        kwargs['delimiter'] = delimiter
        super(CSVOptionRespectingItemExporter, self).__init__(*args, **kwargs)
  1. Запустил из папки проекта паука с опцией записи результата в файл scrapy crawl njit -o ''.csv -t csv"
In []:
C:\Users\kiss\Documents\GitHub_2\Pythscrapy crawl njit -o ''.csv -t csv"on-Web-Crawler-master\Python-Web-Crawler-master\example>
In []:
from scrapy.contrib.exporter import CsvItemExporter
from scrapy.conf import settings

class SlybotCSVItemExporter(CsvItemExporter):
    def __init__(self, *args, **kwargs):
        kwargs['fields_to_export'] = settings.getlist('CSV_EXPORT_FIELDS') or None
        super(SlybotCSVItemExporter, self).__init__(*args, **kwargs)


Посты чуть ниже также могут вас заинтересовать

3 комментария:

  1. Перечитал пост, я тогда (в ноябре) не сформулировал, какие два вида "Scrapy Feed exports"
    Чемпион Гитхаба - это вариант, который я попробовал вот здесь http://pythonr.blogspot.ru/2014/11/scrapy-feed-exporter-python-web-crawler.html
    Путь к файлу задается из командной строки

    А в документации есть два разлела (странички) -
    http://doc.scrapy.org/en/latest/topics/feed-exports.html - это вспомогательная страничка, которая и сбивает с толку, если не прочиттал основную страницу.
    В ней бы пример привести.

    А вот здесь основная страница
    http://doc.scrapy.org/en/latest/topics/exporters.html#topics-exporters

    Читать надо обе вместе.
    Сейчас я пока юзаю свой вариант записи полуавтоматической записи в файл,
    И буду сравнивать его с "чемпионом..."

    ОтветитьУдалить
  2. https://github.com/ajenhl/inbuds-scraper/blob/master/inbuds/spiders/inbuds_spider.py

    ОтветитьУдалить
    Ответы
    1. # -*- coding: utf-8 -*-

      import os.path
      import urlparse

      from scrapy.contrib.spiders import CrawlSpider, Rule
      from scrapy.contrib.linkextractors import LinkExtractor

      from ..items import InbudsItem


      class InbudsSpider (CrawlSpider):

      name = 'INBUDS'
      allowed_domains = ['bauddha.dhii.jp']
      download_delay = 0.5

      rules = (
      Rule(LinkExtractor(allow=('search\.php\?m=trdd',)),
      callback='parse_item'),
      )

      def parse_item (self, response):
      self.log('Parsing response from %s as item' % response.url)
      item = InbudsItem()
      qs = urlparse.parse_qs(urlparse.urlsplit(
      response.request.headers['Referer'])[3])
      item['search_title'] = qs['uekey'][0]
      item['url'] = response.url
      for field, name in item.field_data.items():
      xpath = "//td[normalize-space(preceding-sibling::td)='%s']/text()" \
      % name
      data = response.xpath(xpath).extract()
      if data:
      item[field] = '; '.join([piece.strip() for piece in data])
      return item

      def start_requests (self):
      base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
      titles_path = os.path.join(base_path, 'search_titles.txt')
      for url in open(titles_path, 'rU').readlines():
      full_url = u'http://bauddha.dhii.jp/INBUDS/search.php?m=sch&a=&uekey=%s&ekey1=&lim=2000' % url.strip().decode('utf-8')
      yield self.make_requests_from_url(full_url)

      Удалить