python网络爬虫之使用scrapy下载文件 (2)

程序运行成功。从保存路径来看,在download下面新建了一个full文件夹。然后下载的文件都保存在里面。但是文件名却是00f4d142b951f072.py这种形式的。这些文件名是由url的散列值的出来的。这种命名方式可以防止重名的文件相互冲突,但是这种文件名太不直观了,我们需要重新来定义下载的文件名名字

python网络爬虫之使用scrapy下载文件

在FilesPipeline中,下载文件的函数是file_path。主体代码如下

Return的值就是文件路径。从下面看到是文件都是建立在full文件下面

media_guid = hashlib.sha1(to_bytes(url)).hexdigest()
media_ext = os.path.splitext(url)[1] return \'full/%s%s\' % (media_guid, media_ext)

media_guid得到的是url的散列值,作为文件名

media_ext得到的是文件的后缀名也就是.py

下面我们来重新写file_path函数用于生成我们自己的文件名

我们可以看到有很多网址是下面的形式,widgets是大类。后面的py文件是这个大类下的文件。我们需要将属于一个大类的文件归档到同一个文件夹下面。

http://matplotlib.org/examples/widgets/rectangle_selector.py

比如网页为

urlparse(request.url).path 得到的结果是examples/widgets/span_selector.py dirname(path)得到的结果是examples/widgets basename(dirname(path))得到的结果是widgets join(basename(dirname(str)),basename(str))得到的结果是widgets\ span_selector.py 重写pipeline.py如下: from scrapy.pipelines.files import FilesPipeline
from urlparse import urlparse
from os.path import basename,dirname,join
class FileDownloadPipeline(FilesPipeline):
def file_path(self, request, response=None, info=None):
path=urlparse(request.url).path
temp=join(basename(dirname(path)),basename(path))
return \'%s/%s\' % (basename(dirname(path)), basename(path)) 运行程序发现生成的文件名还是散列值的。原因在于在之前的setting.py中,我们设置的是\'scrapy.pipelines.files.FilesPipeline\':1 这将会直接采用FilesPipeline。现在我们重写了FilesPipeline就需要更改这个设置,改为FileDownloadPipeline ITEM_PIPELINES = {
# \'file_download.pipelines.SomePipeline\': 300,
# \'scrapy.pipelines.files.FilesPipeline\':1,
\'file_download.pipelines.FileDownloadPipeline\':1,
} 再次运行,得到如下的结果:同一类的文件都被归类到了同一个文件夹下面。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfjsz.html