目录
定义一个 item
参数要设置为 file_urls 和 files
调用时 files 可以不写,有默认值
class PipelineFilepipelines(scrapy.Item):
file_urls = scrapy.Field()
files = scrapy.Field()
启用默认的 FilesPipeline
把这串代码在 settings 加入 ITEM_PIPELINES 的字典里
'scrapy.pipelines.files.FilesPipeline': 300,
配置一个下载路径(FILE_STORE)
在 settings 里设置的,随便找个位置放就行了,记得看好自己写的目录是在哪,别最后找不到了。
FILES_STORE = './files'
调用 items
在自己的爬虫主文件里导入,我这里是 douban.py
from ..items import PipelineFilepipelines
主文件下载做法
def parse(self, response):
...
files_urls = ['https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp']
yield PipelineFilepipelines(
file_urls=files_urls,
)
...
在 parse() 里放进这样格式的内容就行了。
需要注意的有
- 调用时 files 可以不写,有默认值,我这里就没写
- file_urls 接收的是列表,所以得传一个列表过去
精细化操作
以上做法简单却也简陋,很多事情做不了,比如更改下载的文件名,设置请求头等
所以还是自己创建一个 pipelines,然后对接 FilesPipeline 更好。
如下代码。
from scrapy.pipelines.files import FilesPipeline
class PipelinesTest(FilesPipeline):
def file_path(self, request, response=None, info=None, *, item=None):
'''
设置下载文件名称的
'''
# https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp
return request.url.split('/')[-1]
def get_media_requests(self, item, info):
'''
设置一个下载请求信息的, 有些文件设置了防盗链的时候,可以在这里设置请求头之类的。
'''
for url in item['file_urls']:
print('运行中')
yield scrapy.Request(
url,
headers={
"referer": "https://movie.douban.com/"
}
)
注意的有
- 记得去启用这个自己创建的管道 'SpriderTest.pipelines.PipelinesTest': 300,
- 记得导入 FilesPipeline
from scrapy.pipelines.files import FilesPipeline