在写 精通Scrapy网络爬虫 中的案例时,在写关于使用 FilesPipeline 案例时发现作者写的两行代码不怎么明白意思,在这做下笔记
代码如下:
from scrapy.pipelines.files import FilesPipeline
from urllib.parse import urlparse
from os.path import basename, dirname, join
# 实现一个FilesPipeline的子类,覆写file_path方法来实现所期望的文件命名规则
class MyFilePipeline(FilesPipeline):
def file_path(self, request, response=None, info=None):
path = urlparse(request.url).path
return join(basename(dirname(path)), basename(path))
python 中的 urlparse
urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接
1.urlparse.urlparse
将url分为6个部分,返回一个包含6个字符串项目的元组:协议、位置、路径、参数、查询、片段。
from urllib.parse import urlparse
url = 'https://matplotlib.org/mpl_examples/api/patch_collection.py '
print(urlparse(url))
结果如下:
ParseResult(scheme='https', netloc='matplotlib.org', path='/mpl_examples/api/patch_collection.py ', params='', query='', fragment='')
其中 scheme 是协议 netloc 是域名服务器 path 相对路径 params是参数,query是查询的条件
2.urlparse.urljoin
将相对的地址组合成一个url,对于输入没有限制,开头必须是http://,否则将不组合前面。
from urllib.parse import urljoin
print(urljoin('http://www.xiaobai.com', 'sdasad'))
# 结果:http://www.xiaobai.com/sdasad
basename(), dirname(), join()
basename() # 去掉目录路径, 返回文件名,
dirname() # 去掉文件名, 返回目录路径,
join() # 将分离的各部分组合成一个路径名
案例:
from urllib.parse import urlparse
from os.path import basename, dirname, join
url = 'https://matplotlib.org/mpl_examples/api/patch_collection.py '
print(urlparse(url))
path = urlparse(url).path
print(dirname(path))
print(basename(dirname(path)))
print(basename(path))
print("返回结果:", join(basename(dirname(path)), basename(path)))
结果如下,结合上面方法的介绍,可以很容易知道结果是什么