다음과 같이 페이지의 숫자 순서에서 링크를 추출하고 싶습니다.
http://example.com/page001.html
http://example.com/page002.html
http://example.com/page003.html
...
http://example.com/page329.html
출력에서 원하는 것은 다음 페이지의 링크에서 수집된 URL이 포함된 텍스트 파일입니다.
http://www.test.com/index.html
http://www.google.com
http://www.superuser.com/questions
명확히 하자면, 저는 페이지를 다운로드하고 싶지 않고 단지 링크 목록만 원합니다.
Windows 소프트웨어도 좋지만 Linux도 괜찮을 것입니다. 내가 생각할 수 있는 것은 Xidel을 사용하여 긴 배치 스크립트를 작성하는 것뿐이지만 오류가 발생하면 그다지 강력하지 않을 것입니다. Curl은 다양한 페이지를 다운로드할 수 있지만 어떻게든 이를 구문 분석해야 합니다.
나를 올바른 길로 인도해준 Enigman에게 감사드립니다. 나는 파일에서 URL을 읽고 $site에 저장된 문자열과 일치하는 링크를 내보내는 Perl 스크립트를 만들었습니다.
use warnings;
use LWP;
$site = "twitter.com";
my $browser = LWP::UserAgent->new;
my @ns_headers = (
'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36',
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language' => 'en-GB,en;q=0.8',
);
open (URLLIST, 'urls.txt');
while (<URLLIST>) {
chomp;
print "# $_\n";
my $response = $browser->get($_, @ns_headers);
die "Can't get $_ -- ", $response->status_line
unless $response->is_success;
my @urls = $response->content =~ /\shref="?([^\s>"]+)/gi ;
foreach $url(@urls) {
if ($url =~ /$site/) {
print("$url\n");
}
}
}
close(URLLIST);
URL 목록을 생성하기 위해 작은 배치 스크립트를 만들었습니다.
@echo off
for /l %%i in (0, 15, 75) do @echo http://www.example.com/page_%%i.html
Perl 스크립트는 오류가 발생하면 중지됩니다. 저는 이것을 선호합니다. 계속해서 수정하는 것은 쉽지 않습니다. 일부 사이트에서는 봇처럼 보이는 것을 좋아하지 않기 때문에 사용자 에이전트 및 수락 데이터가 Chrome에서 추출되었습니다. 귀하가 소유하지 않은 사이트를 스캔하려는 경우 robots.txt를 존중하고 사용자 정의 사용자 에이전트를 설정하십시오.
답변1
코드를 사용하여 이를 수행하려면 LWP::Simple 또는 Mechanize 모듈을 사용하여 Perl에서 수행할 수 있습니다.
다음은 당신이 추구하는 것일 수 있습니다LWP::Simple 모듈을 사용하여 웹 페이지에서 모든 링크 찾기
이는 Perl을 사용하는 명령줄 솔루션을 사용하는 데 익숙하다고 가정합니다. 이는 Windows 및 Linux 플랫폼 모두에서 동일하게 작동합니다. 구문 분석을 위해 명령줄에서 매개변수로 URL을 가져오도록 수정하는 데 많은 시간이 걸리지 않습니다.
답변2
네, 좋은 bash 스크립트입니다. 이는 Lynx 브라우저를 사용하여 페이지에서 URL을 추출하고 이를 텍스트 파일로 덤프합니다.
#!/bin/bash
#
# Usage:
#
# linkextract <start> <end> <pad> <url>
#
# <start> is the first number in the filename range. Must be an integer
# <stop> is the last number in the filename range. Must be an integer
# <pad> is the number of digits the number in the filename is zero-padded to.
# <url> is the URL. Insert "<num>" where you want the number to appear. You'll
# need to enclose the entire argument in quotes
for (( i=${1} ; i<=${2} ; i++ )); do {
num=$(printf "%04d" ${i})
url=$(echo ${4} | sed "s/<num>/${num}/")
lynx -dump -listonly "${url}" | sed -r -n "/^ +[0-9]/s/^ +[0-9]+\. //p"
}; done
데비안에서 'lynx' 패키지로 제공되는 lynx 브라우저를 설치해야 합니다. 스크립트는 추출된 URL을 stdout에 인쇄합니다. 따라서 귀하의 질문에 대한 예에서는 다음을 수행할 것입니다(링크추출이라는 파일에 스크립트를 저장한다고 가정).
$ linkextract 1 329 3 "http://example.com/page<num>.html"
답변3
당신은 사용할 수 있습니다사이트 시각화 도구 크롤러이 작업을 위해. 다운로드하여 설치한 후 클릭하세요.새 프로젝트, 웹사이트 URL을 입력하고 확인을 클릭한 다음크롤링 시작도구버튼.
크롤링이 완료되면 두 번 클릭하십시오.모든 링크보고서보고서탭. 웹사이트에 있는 모든 링크와 기타 정보(소스/대상 링크 URL, 콘텐츠 유형(HTML, 이미지, pdf, CSS 등), 응답 등)가 제공됩니다. 모든 테이블을 선택하고(컨텍스트 메뉴 또는 Ctrl+A 단축키)헤더가 있는 행 복사상황에 맞는 메뉴 항목. 그런 다음 데이터를 Excel 시트나 간단한 텍스트 문서에 붙여넣을 수 있습니다.
이 프로그램은 30일 평가판 기간이 있지만 모든 기능을 갖추고 있어 1개월 동안 무료로 사용할 수 있습니다.