我是 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?
非常感谢您的帮助
对于您的具体要求,我可能会使用 Scrapy Files Pipeline 以及在文件管道之后订购的自定义管道。来自文件管道文档:
下载文件后,另一个字段 (
) 将填充结果。该字段将包含一个字典列表,其中包含有关下载文件的信息,例如下载路径、原始抓取的 url(取自files
字段)以及文件校验和。file_urls
字段列表中的文件将保留原始files
字段的相同顺序。如果某些文件下载失败,则会记录错误,并且该文件不会出现在file_urls
字段中。files
在您的蜘蛛中,用您要下载的文件位置填充字段
file_urls
。然后,在使用标准文件管道处理该项目后,它将包含字段 files
以及 file_urls
中每个位置的 SHA1 文件名,顺序相同。然后编写另一个自定义管道,它将在文件管道之后处理项目并使用此信息。
您希望从 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()
您可以从标题中获取文件名:
filename = response.headers.get("Content-Disposition").decode("utf-8")
filename = filename.split("filename=")[-1].split('"')[1]