저는 현재 웹 크롤러 봇을 작성 중입니다. 중복된 항목을 제거하고 행을 알파벳순으로 정렬해야 하는 URL 목록을 생성합니다. 내 코드는 다음과 같습니다
#! /bin/bash
URL="google.com"
while [ 1 ]; do
wget --output-document=dl.html $URL
links=($(grep -Po '(?<=href=")[^"]*' dl.html))
printf "%s\n" ${links[@]} >> results.db
sort results.db | uniq -u
URL=$(shuf -n 1 results.db)
echo $URL
done
특히 이 줄은:
sort results.db | uniq -u
답변1
POSIX설명하다 uniq -u
:
입력에 중복된 줄을 쓰는 것을 억제합니다.
이는 중복 행(원래 행 포함)이 필터링된다는 의미입니다. 당신은 아마도 (완료POSIX반품):
sort -u results.db
의 경우 sort -u
POSIX는 다음과 같이 말합니다.
고유: 제외 제외하나동일한 키를 가진 각 행 그룹에. -c 옵션과 함께 사용하면 입력 파일이 정렬되었는지 확인하는 것 외에도 중복 키가 포함된 행이 없는지 확인합니다.
두 경우 모두 다음 줄은
URL=$(shuf -n 1 results.db)
sort/uniq의 목적은 다음과 같다고 가정할 수 있습니다.고쳐 쓰다 results.db
(그렇지 않습니다). 이렇게 하려면 스크립트를 더 많이 수정해야 합니다.
sort -u results.db >results.db2 && mv results.db2 results.db
또는 (@drewbenn이 제안한 대로) 이전 줄과 결합하세요. 그러나 그 이후로추가파일에 (그의 답변에 표시된 명령을 결합해도 최신 printf와 파일 내용 간의 중복이 제거되지 않음) 별도의 명령 sort /mv 가 원본 스크립트에 더 가깝게 보입니다.
null 이 아닌지 확인하려면 $URL
(실제로는 또 다른 질문입니다.) test 를 통해 수행하세요 [
.
[ -n "$URL" ] && wget --output-document=dl.html $URL
단순히 루프를 종료하는 것이 더 간단할지라도:
[ -z "$URL" ] && break
답변2
이것은 스크립트의 향상된 버전입니다.
(초기 Google 검색의 최소한의 노력을 넘어) 정말 끔찍한 것을 처리하려고 시도하지 않기 때문에 여전히 나쁩니다. 불행히도 대부분의 웹 사이트는 A HREF
URL을 사용하여 수행합니다. 무능하거나 사용자를 추적하려고 하기 때문입니다. 둘 다.
#! /bin/sh
# exit on any error
set -e
dbfile="results.db"
# if "$dbfile" doesn't exist (or is empty), or if a URL has been
# provided as a command-line argument, fetch the initial URLs
# from "$1" (or a google search), and strip off the google-junk:
if [ ! -s "$dbfile" ] || [ -n "$1" ] ; then
URL="{$1:-https://www.google.com/search?q=interesting+stuff}"
lynx -accept_all_cookies -dump -listonly -nonumbers "$URL" |
sed -e '/^http.*url?/!d; s/^.*\/url?q=//; s/\&.*//' > "$dbfile"
fi
URL=$(shuf -n 1 "$dbfile")
while [ 1 ]; do
lynx -accept_all_cookies -dump -listonly -nonumbers "$URL" |
grep http >> "$dbfile"
tmpfile=$(mktemp) &&
sort -u "$dbfile" > "$tmpfile" &&
mv -f "$tmpfile" "$dbfile" &&
rm -f "$tmpfile"
URL=$(shuf -n 1 "$dbfile")
echo "$URL"
done
웹 스크래핑은 어려운데, 주로 HTML이 매우 느슨한 표준이기 때문일 뿐만 아니라 웹 디자이너가 일반적으로 무능하거나 의도적으로 페이지를 난독화하려고 하거나 둘 다이기 때문입니다. 비율이 필요합니다 bash
.
perl
개인적으로 저는 libwww-perl
aka를 사용하여 웹봇을 작성합니다 LWP
. 나는 특히 HTML::TokeParser
Perl 모듈을 좋아하는데, 이는 LWP
.