📅  最后修改于: 2023-12-03 15:08:24.088000             🧑  作者: Mango
Scrapy 是一个高效的 Python 爬虫框架,其中一个强大的功能就是能够非常方便地下载网页中的文件,包括图片、音频、视频、文档等等。这篇文章就来介绍如何利用 Scrapy 来下载这些文件。
首先我们需要在 Scrapy 爬虫的代码中定义一个函数,用于下载图片。以下是一个非常简单的例子:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
def start_requests(self):
urls = [
'http://example.com/image1.jpg',
'http://example.com/image2.png',
'http://example.com/image3.gif',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_image)
def parse_image(self, response):
filename = response.url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.body)
self.logger.info('Saved file %s', filename)
在这个例子中,我们从三个 URL 获取图片,并通过 parse_image()
函数来处理每个响应。其中 response.url
表示图片的 URL,filename
表示图片的文件名,response.body
表示响应的二进制内容,也就是图片的实际内容。在最后一行日志中,我们打印出了图片的文件名,以此来确认图片是否成功下载。
除了图片,我们还可以通过类似的方式下载其他类型的文件,比如音频、视频、文档等等。以下是一个用于下载 PDF 文件的例子:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
def start_requests(self):
urls = [
'http://example.com/document1.pdf',
'http://example.com/document2.pdf',
'http://example.com/document3.pdf',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_pdf)
def parse_pdf(self, response):
filename = response.url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.body)
self.logger.info('Saved file %s', filename)
在这个例子中,我们从三个 URL 获取 PDF 文件,并通过 parse_pdf()
函数来处理每个响应。parse_pdf()
函数的实现方式与 parse_image()
函数基本相同,只是我们将函数名称改为了 parse_pdf()
,并将注释从“图片”改为了“PDF 文件”。
如果要下载大文件,比如视频或者音频文件,我们可能需要一些额外的配置来确保下载的稳定性和可用性。以下是一些可选的配置:
利用 Scrapy 的 HTTPCACHE_ENABLED
配置项,我们可以启用断点续传功能,以便在下载过程中出现错误时恢复下载进度。以下是一个例子:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
custom_settings = {
'HTTPCACHE_ENABLED': True,
}
def start_requests(self):
urls = [
'http://example.com/video1.mp4',
'http://example.com/video2.mp4',
'http://example.com/video3.mp4',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_video)
def parse_video(self, response):
filename = response.url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.body)
self.logger.info('Saved file %s', filename)
在这个例子中,我们通过 custom_settings
配置项启用了断点续传功能。如果下载过程中出现错误,程序会尝试自动恢复下载进度,并从上次下载失败的地方继续下载。
如果下载速度过快,可能会对目标网站的服务器造成压力,并导致网络连接变慢甚至中断。为了避免这种情况,我们可以通过 Scrapy 的 DOWNLOAD_DELAY
配置项来限制下载的速度。以下是一个例子:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
custom_settings = {
'DOWNLOAD_DELAY': 2.0,
}
def start_requests(self):
urls = [
'http://example.com/video1.mp4',
'http://example.com/video2.mp4',
'http://example.com/video3.mp4',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_video)
def parse_video(self, response):
filename = response.url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.body)
self.logger.info('Saved file %s', filename)
在这个例子中,我们通过 custom_settings
配置项将下载速度限制为每秒两个请求。这样可以减少服务器压力,同时也可以让程序更加健壮和可靠。
在本篇文章中,我们介绍了如何使用 Scrapy 下载文件,包括图片、PDF 文件、视频、音频等等。我们还介绍了一些额外的配置项,比如断点续传和下载速度限制。阅读本文后,相信读者已经能够非常熟练地使用 Scrapy 来下载各种类型的文件了。