Загрузка файлов с помощью ItemLoaders () в Scrapy - PullRequest
0 голосов
/ 08 декабря 2018

Я создал паук сканирования для загрузки файлов.Однако паук загружал только URL-адреса файлов, а не сами файлы.Я загрузил вопрос здесь Паук Scrapy crawl не загружает файлы? .Хотя основной паук, любезно предложенный в ответах, работает отлично, когда я пытаюсь загрузить файлы с item или item loader , паук не работает!Оригинальный вопрос не включает items.py.Итак, вот оно:

ПУНКТЫ

import scrapy
from scrapy.item import Item, Field


class DepositsusaItem(Item):
    # main fields
    name = Field()
    file_urls = Field()
    files = Field()
    # Housekeeping Fields
    url = Field()
    project = Field()
    spider = Field()
    server = Field()
    date = Field()
    pass

РЕДАКТИРОВАТЬ: добавлен оригинальный код РЕДАКТИРОВАТЬ : дальнейшие исправления

SPIDER

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import datetime
import socket
from us_deposits.items import DepositsusaItem
from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose
from urllib.parse import urljoin


class DepositsSpider(CrawlSpider):
    name = 'deposits'
    allowed_domains = ['doi.org']
    start_urls = ['https://minerals.usgs.gov/science/mineral-deposit-database/#products', ]

    rules = (
        Rule(LinkExtractor(restrict_xpaths='//*[@id="products"][1]/p/a'),
             callback='parse_x'),
    )

    def parse_x(self, response):
        i = ItemLoader(item=DepositsusaItem(), response=response)
        i.add_xpath('name', '//*[@class="container"][1]/header/h1/text()')
        i.add_xpath('file_urls', '//span[starts-with(@data-url, "/catalog/file/get/")]/@data-url',
                    MapCompose(lambda i: urljoin(response.url, i))
                    )
        i.add_value('url', response.url)
        i.add_value('project', self.settings.get('BOT_NAME'))
        i.add_value('spider', self.name)
        i.add_value('server', socket.gethostname())
        i.add_value('date', datetime.datetime.now())
        return i.load_item()

НАСТРОЙКИ

BOT_NAME = 'us_deposits'
SPIDER_MODULES = ['us_deposits.spiders']
NEWSPIDER_MODULE = 'us_deposits.spiders'
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
    'us_deposits.pipelines.UsDepositsPipeline': 1,
    'us_deposits.pipelines.FilesPipeline': 2
}

FILES_STORE = 'C:/Users/User/Documents/Python WebCrawling Learning Projects'

ТРУБОПРОВОДЫ

class UsDepositsPipeline(object):
    def process_item(self, item, spider):
        return item


class FilesPipeline(object):
    def process_item(self, item, spider):
        return item

1 Ответ

0 голосов
/ 08 декабря 2018

Мне кажется, что использование элементов и / или загрузчиков элементов не имеет ничего общего с вашей проблемой.

Единственные проблемы, которые я вижу, находятся в вашем файле настроек:

  • FilesPipeline не активирован (только us_deposits.pipelines.UsDepositsPipeline is)
  • FILES_STORE должен быть строкой, а не набором (исключение возникает при активации конвейера файлов)
  • ROBOTSTXT_OBEY = Trueпредотвратит загрузку файлов

Если я исправлю все эти проблемы, загрузка файла будет работать как положено.

...