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()