정렬이 작동하지 않는 것 같습니다.

정렬이 작동하지 않는 것 같습니다.

저는 현재 웹 크롤러 봇을 작성 중입니다. 중복된 항목을 제거하고 행을 알파벳순으로 정렬해야 하는 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 -uPOSIX는 다음과 같이 말합니다.

고유: 제외 제외하나동일한 키를 가진 각 행 그룹에. -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 HREFURL을 사용하여 수행합니다. 무능하거나 사용자를 추적하려고 하기 때문입니다. 둘 다.

#! /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-perlaka를 사용하여 웹봇을 작성합니다 LWP. 나는 특히 HTML::TokeParserPerl 모듈을 좋아하는데, 이는 LWP.

관련 정보