Scrapy获取下载的文件名

问题描述 投票:0回答:3

我是 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?

非常感谢您的帮助

python scrapy
3个回答
1
投票

对于您的具体要求,我可能会使用 Scrapy Files Pipeline 以及在文件管道之后订购的自定义管道。来自文件管道文档:

下载文件后,另一个字段 (

files
) 将填充结果。该字段将包含一个字典列表,其中包含有关下载文件的信息,例如下载路径、原始抓取的 url(取自
file_urls
字段)以及文件校验和。
files
字段列表中的文件将保留原始
file_urls
字段的相同顺序。如果某些文件下载失败,则会记录错误,并且该文件不会出现在
files
字段中。

在您的蜘蛛中,用您要下载的文件位置填充字段

file_urls
。然后,在使用标准文件管道处理该项目后,它将包含字段
files
以及
file_urls
中每个位置的 SHA1 文件名,顺序相同。然后编写另一个自定义管道,它将在文件管道之后处理项目并使用此信息。


1
投票

您希望从 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'

编辑-1

如果您需要获取SHA1哈希值

import hashlib
sha1 = hashlib.sha1()
sha1.update(url.encode("utf-8"))
sha1_hash = sha1.hexdigest()

0
投票

您可以从标题中获取文件名:

filename = response.headers.get("Content-Disposition").decode("utf-8")
filename = filename.split("filename=")[-1].split('"')[1]
© www.soinside.com 2019 - 2024. All rights reserved.