我有一个正在运行的scrapy项目,但它消耗带宽很大,因为它试图下载许多二进制文件(zip、tar、mp3等)。
我认为最好的解决方案是根据mimetype(Content-Type:) HTTP头过滤请求。我查看了scrapy代码,并找到了这个设置:
DOWNLOADER_HTTPCLIENTFACTORY = 'scrapy.core.downloader.webclient.ScrapyHTTPClientFactory'
我把它改为: DOWNLOADER_HTTPCLIENTFACTORY = 'myproject.webclients.ScrapyHTTPClientFactory'
并对ScrapyHTTPPageGetter进行了一些修改,这里是修改的部分:
class ScrapyHTTPPageGetter(HTTPClient):
# this is my edit
def handleEndHeaders(self):
if 'Content-Type' in self.headers.keys():
mimetype = str(self.headers['Content-Type'])
# Actually I need only the html, but just in
# case I've preserved all the text
if mimetype.find('text/') > -1:
# Good, this page is needed
self.factory.gotHeaders(self.headers)
else:
self.factory.noPage(Exception('Incorrect Content-Type'))
我觉得这样做是错误的,我需要更多Scrapy友好的方式来在确定不需要的MIME类型后立即取消/丢弃请求。而不是等待整个数据下载完毕。
编辑: 我特别询问这一部分代码self.factory.noPage(Exception('Incorrect Content-Type'))是否是取消请求的正确方式。
更新1: 我的当前设置已经导致Scrapy服务器崩溃,请不要尝试使用上面的代码来解决问题。
更新2: 我已经建立了一个基于Apache的测试网站,使用以下结构:
/var/www/scrapper-test/Zend -> /var/www/scrapper-test/Zend.zip (symlink)
/var/www/scrapper-test/Zend.zip
我注意到Scrapy会放弃带有.zip扩展名的文件,但是会获取没有.zip扩展名的文件,即使它只是一个指向该文件的符号链接。