Scrapy получить имя загруженного файла

Я новичок в Scrapy, пожалуйста, потерпите меня.

У меня есть паук, который посещает страницу и загружает файл. В конечном итоге я хочу записать имя файла вместе с другой полезной информацией в таблицу БД.

-> Сейчас я пытаюсь получить имя файла:

из items.py:

import scrapy
from scrapy.item import Item, Field

class NdrItem(scrapy.Item):
    district = Field()
    file_urls = Field()
    file_name = Field()
    files = Field()

от паука:

import scrapy
from ndr.items import NdrItem

class CentralBedfordshireSpider(scrapy.Spider):
    name = 'central_bedfordshire2'
    allowed_domains = ['centralbedfordshire.gov.uk']
    start_urls = ['http://centralbedfordshire.gov.uk/business/rates/paying/published.aspx']

    def parse(self, response):

        relative_url = response.xpath("//article[@class='page-content__article']/div[@class='editor']/p[3]/a/@href").extract_first()
        download_url = response.urljoin(relative_url)
        item = NdrItem()
        item['district'] = 'central bedfordshire'
        item['file_urls'] = [download_url]
        print('------------------ Print the info I want to eventually go in db --------------------------')
        print(item['district'])
        print(item['files'])
    return item

Редактировать: файл загружается нормально и имеет имя файла sha1 при загрузке. Я хотел бы иметь имя файла sha1.

Изменить: я получаю следующую ошибку при запуске этого паука:

2017-08-22 10:39:42 [scrapy.core.scraper] ERROR: Spider error processing <GET http://centralbedfordshire.gov.uk/business/rates/paying/published.aspx> (referer: None)
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:\Users\MichaelAnderson\GDrive\Python\ndr\ndr\spiders\central_bedfordshire2.py", line 19, in parse
    print(item['files'])
  File "c:\python27\lib\site-packages\scrapy\item.py", line 59, in __getitem__
    return self._values[key]
KeyError: 'files'

Как правило, если у людей есть несколько пауков, сохраняющих данные в одной и той же папке, как люди ссылаются на загруженные файлы и сохраняют их ссылки на исходный URL?

Большое спасибо за любую помощь

2 ответа

Решение

Для ваших конкретных требований, я бы, вероятно, использовал конвейер файлов Scrapy вместе с заказным конвейером, заказанным после конвейера файлов. Из документации по конвейеру файлов:

Когда файлы загружены, другое поле (files) будет заполнен результатами. Это поле будет содержать список сообщений с информацией о загруженных файлах, таких как загруженный путь, исходный очищенный URL-адрес (взятый из file_urls поле) и контрольная сумма файла. Файлы в списке files поле сохранит тот же порядок оригинала file_urls поле. Если какой-либо файл не удалось загрузить, будет зарегистрирована ошибка, и файл не будет присутствовать в files поле.

В вашем пауке, заполните поле file_urls с местоположениями файлов, которые вы хотите скачать. Затем, после обработки элемента стандартным Файлом конвейера, он будет содержать поле files с именами файлов SHA1 для каждого местоположения в file_urlsв том же порядке. Затем напишите другой пользовательский конвейер, который будет обрабатывать элементы после Files Pipeline и будет использовать эту информацию.

Вы хотите получить его из самого URL. Если вы используете Python 3 ниже будет работать

from urllib.parse import urlparse
url = "http://centralbedfordshire.gov.uk/Images/business-rates-live-account-list-2017-07_tcm3-9033.csv"

print(urlparse(url).path.split("/")[-1])
'business-rates-live-account-list-2017-07_tcm3-9033.csv'

Edit-1

Если вам нужно получить хэш SHA1

import hashlib
sha1 = hashlib.sha1()
sha1.update(url.encode("utf-8"))
sha1_hash = sha1.hexdigest()
Другие вопросы по тегам