scrapy爬虫抓取并下载文件
时间:2022-06-26
本文章向大家介绍scrapy爬虫抓取并下载文件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
scrapy 内部提供了专门用于下载文件的 FilesPipeline , 我们可以将其视为特殊的下载器,只需要将要下载的文件 url 传递过去,下载器就会自动将文件下载到本地
简易流程
我们用伪代码说明下载器的流程,假设我们要下载以下页面中的文件
<body>
<h3>GEM专辑</h3>
<a href="/music/1.mp3">下载《偶尔》</a>
<a href="/music/2.mp3">下载《一路逆风》</a>
<a href="/music/3.mp3">下载《来自天堂的魔鬼》</a>
</body>
下载以上 mp3 文件的步骤如下:
- 在
settings.py
中开启 FilesPipeline 以及指定下载路径
ITEM_PIPELINES = {'scrapy.pipelines.files.FilesPipeline': 1}
FILES_STORE = '/music_downloads'
FilesPipeline 要置于其他 Item Pipeline 之前
- Spider 解析页面,提取要下载的 url 赋给 item 的 file_urls 字段
伪代码如下:
class DownloadMusicSpider(scrapy.Spider):
# ...
def parse(response):
item = {}
# 提取 url 组装成列表,并赋给 item 的 file_urls 字段
for url in response.xpath('//a/@href').extract():
download_url = response.urljoin(url)
item['file_urls'].append(download_url)
yield item
项目实战需求分析
https://matplotlib.org/examples/index.html
是著名的 python 绘图库,每个示例都有相应的源码下载,如:https://matplotlib.org/examples/animation/basic_example_writer.html
下载源码
我们的需求就是要抓取 matplotlib 的示例代码,并分门别类下载存放到本地
正式写代码之前,先用 scrapy shell 分析源码结构
$ scrapy shell http://matplotlib.org/examples/index.html
# ...
In [1]: view(response) # 将页面下载到本地,分析其 html 结构
Out[1]: True
分析页面 html 结构
分析可知,所有例子链接都在 <div class="toctree-wrapper compound">
下的每一个 <li class="toctree-l2">
中
在 scrapy shell 中提取链接
In [2]: from scrapy.linkextractors import LinkExtractor
In [3]: le = LinkExtractor(restrict_css='div.toctree-wrapper.compound li.toctree-l2')
In [4]: links = le.extract_links(response)
In [5]: [link.url for link in links]
Out[5]:
['https://matplotlib.org/examples/animation/animate_decay.html',
'https://matplotlib.org/examples/animation/basic_example.html',
'https://matplotlib.org/examples/animation/basic_example_writer.html',
'https://matplotlib.org/examples/animation/bayes_update.html',
# ...
]
然后再来分析具体的例子页面,提取下载源码的 url
In [6]: fetch('https://matplotlib.org/examples/animation/animate_decay.html')
2019-07-21 22:15:22 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://matplotlib.org/examples/animation/animate_decay.html> (referer: None)
In [7]: view(response)
Out[7]: True
下载页面 html 结构
分析可知,下载 url 在 <a class="reference external">
元素中获取
In [8]: href = response.css('a.reference.external::attr(href)').extract_first()
In [9]: href
Out[9]: 'animate_decay.py'
In [10]: response.urljoin(href) # 组装成绝对地址
Out[10]: 'https://matplotlib.org/examples/animation/animate_decay.py'
具体编码实现
创建项目
- 利用Centos或RedHat的iso镜像搭建本地yum仓库
- QUIC协议初探-iOS实践
- Golang语言社区--【基础知识】常量
- 服务器日志备份超节省空间的思路
- 《企鹅电竞weex实践—— iOS SDK的小九九》
- Linux操作系统DNS解析(nameserver)监控脚本
- 不给“爸爸”添麻烦 - iTOP iOS 动态库改造
- 移动SEO分享:php自动提交复合型Sitemap到百度搜索
- 《Android外部存储》
- Android JNI出坑指南
- 《iPhone X ARKit Face Tracking》
- 结合标签广告,定制一个QQ邮箱订阅
- SecureCRT全局发送相同命令,快速抓取服务器信息的方法
- [不定期更新]简单的shell脚本练习实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法