我是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?
非常感谢您的帮助
答案 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()