我有一个正在运行的 scrapy 项目,但它占用大量带宽,因为它会尝试下载大量二进制文件(zip、tar、mp3、..etc)。
我认为最好的解决方案是根据 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'))
我觉得这是错误的,在确定它是不需要的 mimetype 之后,我需要更友好的方式来取消/删除请求。而不是等待整个数据被下载。
编辑:
我特别要求这部分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 的那个,即使它只是一个符号链接。