案例爬取的目标是seaborn案例的源文件
地址:http://seaborn.pydata.org/examples/index.html
点击图片进去往下拉一点,就会看到下载的目标链接,通过这个链接把文件下载
第一步:使用Item封装数据
注意属性名是固定的,如果需要改属性名,要在settings.py中设置(怎么设置这里就不写了)
第二步:编写解析函数
一共有两个解析函数,一个是获取并请求到详情页的函数,一个是在详情页里获取每个案例的下载路径
1.获取详情页的URL并请求
2.获取文件的下载URL
第三步:设定文件名和存储路径(可选)
、
出来效果是这样:
第四步:配置settings.py文件
1.不遵守robots协议和USER_AGENT,这个是基本操作
2.设置文件下载路径
3.启用pipelines
解析函数:file_spider.py完整代码
from scrapy import Request
from scrapy.spiders import Spider
from seaborn_file_download.items import SeabornFileDownloadItem
class FileDownloadSpider(Spider):
name = 'file'
def start_requests(self):
url = 'http://seaborn.pydata.org/examples/index.html'
yield Request(url)
#解析函数,获取案例列表中每个案例的URL地址
def parse(self, response):
#获取每个案例的链接地址
urls = response.xpath("//div[@class='figure align-center']/a/@href").extract()
for url in urls:
print("url:",url)
url = response.urljoin(url)
yield Request(url,
callback=self.parse_file)
#解析函数-获取源码文件的URL,将其放入key为file_urls的Item中
def parse_file(self,response):
href = response.xpath("//a[@class='reference download internal']/@href").extract_first()
url = response.urljoin(href)
item = SeabornFileDownloadItem()
item["file_urls"] = [url]
yield item
Pipeline完整代码
from scrapy.pipelines.files import FilesPipeline
from scrapy import Request
#定义新的文件管道,继承FilesPipeline
class SaveFilePipeline(FilesPipeline):
#设定文件名并返回
def file_path(self, request, response=None, info=None):
#获取文件名并返回,url最后一个“/”后面就是文件的名称
# return request.url.split("/")[-1]
#分别将每个文件保存到单独的文件夹下
#获取文件名
file_name = request.url.split("/")[-1]
#确定文件夹名称
folder_name = file_name.split(".")[0]
#返回文件夹和文件组合的字符串(相对路径)
return folder_name + "/" + file_name