전체 이진 파일을 무시하고 전체 웹 사이트를 다운로드하는 방법
wget
이 기능은 -r
플래그를 사용하지만 모든 것을 다운로드하며 일부 웹 사이트는 리소스가 부족한 시스템에는 너무 많으며 사이트를 다운로드하는 특정 이유로 사용되지 않습니다.
여기 내가 사용하는 명령 줄이 있습니다 : wget -P 20 -r -l 0 http://www.omardo.com/blog
(나만의 블로그)
답변
허용 된 resp 목록을 지정할 수 있습니다. 허용되지 않는 파일 이름 패턴 :
허용됨 :
-A LIST
--accept LIST
허용되지 않음 :
-R LIST
--reject LIST
LIST
쉼표로 구분 된 파일 이름 패턴 / 확장명 목록입니다.
다음 예약 문자를 사용하여 패턴을 지정할 수 있습니다.
*
?
[
]
예 :
- PNG 파일 만 다운로드 :
-A png
- CSS 파일을 다운로드하지 마십시오 :
-R css
- “avatar”로 시작하는 PNG 파일을 다운로드하지 마십시오 :
-R avatar*.png
파일 확장자가없는 경우 resp. 파일 이름에는 사용할 수있는 패턴이 없으며 MIME 유형 구문 분석이 필요합니다 ( Lars Kotthoffs answer 참조 ).
답변
답변
새로운 Wget (Wget2)에는 이미 기능이 있습니다.
--filter-mime-type Specify a list of mime types to be saved or ignored`
### `--filter-mime-type=list`
Specify a comma-separated list of MIME types that will be downloaded. Elements of list may contain wildcards.
If a MIME type starts with the character '!' it won't be downloaded, this is useful when trying to download
something with exceptions. For example, download everything except images:
wget2 -r https://<site>/<document> --filter-mime-type=*,\!image/*
It is also useful to download files that are compatible with an application of your system. For instance,
download every file that is compatible with LibreOffice Writer from a website using the recursive mode:
wget2 -r https://<site>/<document> --filter-mime-type=$(sed -r '/^MimeType=/!d;s/^MimeType=//;s/;/,/g' /usr/share/applications/libreoffice-writer.desktop)
Wget2는 오늘 릴리스되지 않았지만 곧 출시 될 예정입니다. 데비안 불안정은 이미 알파 버전을 가지고 있습니다.
자세한 내용 은 https://gitlab.com/gnuwget/wget2 를 참조하십시오. 질문 / 의견은 bug-wget@gnu.org에 직접 게시 할 수 있습니다.
답변
완전히 다른 접근법을 시도했지만 Scrapy를 사용하는 것이지만 동일한 문제가 있습니다! SO : Python Scrapy-텍스트가 아닌 파일 다운로드를 피하는 mimetype 기반 필터?
해결책은
Node.js
프록시 를 설정하고http_proxy
환경 변수를 통해 프록시를 사용하도록 Scrapy를 구성하는 것 입니다.무엇 프록시가 해야 할 것은 :
- Scrapy에서 HTTP 요청을 가져와 크롤링중인 서버로 보냅니다. 그런 다음 Scrapy에 대한 응답, 즉 모든 HTTP 트래픽을 차단합니다.
- 구현하는 휴리스틱을 기반으로 바이너리 파일의 경우
403 Forbidden
Scrapy에 오류를 보내고 요청 / 응답을 즉시 닫습니다. 이를 통해 시간과 트래픽을 절약 할 수 있으며 Scrapy는 중단되지 않습니다.실제로 작동하는 샘플 프록시 코드!
http.createServer(function(clientReq, clientRes) {
var options = {
host: clientReq.headers['host'],
port: 80,
path: clientReq.url,
method: clientReq.method,
headers: clientReq.headers
};
var fullUrl = clientReq.headers['host'] + clientReq.url;
var proxyReq = http.request(options, function(proxyRes) {
var contentType = proxyRes.headers['content-type'] || '';
if (!contentType.startsWith('text/')) {
proxyRes.destroy();
var httpForbidden = 403;
clientRes.writeHead(httpForbidden);
clientRes.write('Binary download is disabled.');
clientRes.end();
}
clientRes.writeHead(proxyRes.statusCode, proxyRes.headers);
proxyRes.pipe(clientRes);
});
proxyReq.on('error', function(e) {
console.log('problem with clientReq: ' + e.message);
});
proxyReq.end();
}).listen(8080);