Scrapy获取下载的文件名

时间:2017-08-21 16:16:22

标签: python scrapy scrapy-spider

我是Scrapy的新手,请耐心等待。

我有一个访问页面的蜘蛛,并下载文件。 最后,我想将文件的名称以及其他有用信息写入db表。

- >现在,我正在努力获取文件名:

来自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 个答案:

答案 0 :(得分:1)

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

  

下载文件后,将使用结果填充另一个字段(files)。该字段将包含一个dicts列表,其中包含有关下载文件的信息,例如下载的路径,原始的已删除URL(取自file_urls字段)和文件校验和。 files字段列表中的文件将保留原始file_urls字段的相同顺序。如果某个文件下载失败,将记录一个错误,该文件将不会出现在files字段中。

在您的蜘蛛中,使用您要下载的文件位置填充字段file_urls。然后,在使用标准文件管道处理项目后,它将包含字段files,其中包含file_urls中每个位置的SHA1文件名,顺序相同。然后编写另一个自定义管道,它将在Files Pipeline之后处理项目并将使用此信息。

答案 1 :(得分:0)

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