wget - 재귀적으로 다운로드하고 특정 MIME 유형/확장만 다운로드하는 방법(예: 텍스트만)

wget - 재귀적으로 다운로드하고 특정 MIME 유형/확장만 다운로드하는 방법(예: 텍스트만)

전체 웹사이트를 다운로드하지만 모든 바이너리를 무시하는 방법.

wget해당 플래그를 사용하면 효과가 있지만 -r모든 것을 다운로드하고 일부 사이트는 리소스가 부족한 컴퓨터에 비해 너무 많으며 사이트를 다운로드한 특정 이유로 유용하지 않습니다.

이것은 내가 사용하는 명령줄입니다: wget -P 20 -r -l 0 http://www.omardo.com/blog(내 블로그)

답변1

허용 목록을 지정할 수 있습니다. 허용되지 않는 파일 이름 패턴:

허용하다:

-A LIST
--accept LIST

허용되지 않음:

-R LIST
--reject LIST

LIST쉼표로 구분된 파일 이름 패턴/확장자 목록입니다.

다음 예약 문자를 사용하여 패턴을 지정할 수 있습니다.

  • *
  • ?
  • [
  • ]

예:

  • PNG 파일만 다운로드:-A png
  • CSS 파일을 다운로드하지 마세요:-R css
  • "아바타"로 시작하는 PNG 파일을 다운로드하지 마세요.-R avatar*.png

파일에 확장자가 없는 경우. 파일 이름에 사용할 수 있는 패턴이 없습니다. MIME 유형 확인이 필요한 것 같습니다(참조Lars Kothoff의 답변).

답변2

다음 명령을 사용하여 wget을 패치할 수 있습니다.이것(반품여기) MIME 유형으로 필터링합니다. 하지만 이 패치는 꽤 오래된 것이므로 더 이상 작동하지 않을 수 있습니다.

답변3

새로운 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는 아직 출시되지 않았지만 곧 출시될 예정입니다. Debian Unstable이 알파 버전을 출시했습니다.

보고 있다https://gitlab.com/gnuwget/wget2더 많은 정보를 알고 싶습니다. 질문/댓글을 직접 게시할 수 있습니다.[이메일 보호됨].

답변4

제가 시도한 완전히 다른 접근 방식은 Scrapy를 사용하는 것이었지만 동일한 문제가 있었습니다! 내가 해결한 방법은 다음과 같습니다.Python Scrapy - 텍스트가 아닌 파일 다운로드를 방지하기 위한 MIME 유형 기반 필터?

해결책은 프록시를 설정하고 Node.js환경 변수를 통해 이를 사용하도록 Scrapy를 구성하는 것입니다.http_proxy

무엇인가요대리인수행해야 할 작업은 다음과 같습니다.

  • Scrapy에서 HTTP 요청을 가져와 크롤링 중인 서버로 보냅니다. 그런 다음 모든 HTTP 트래픽을 가로채는 Scrapy의 응답을 반환합니다.
  • 바이너리의 경우(구현한 경험적 방법을 기반으로) 403 ForbiddenScrapy에 오류를 보내고 요청/응답을 즉시 닫습니다. 이는 시간과 트래픽을 절약하는 데 도움이 되며 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);

관련 정보