Lệnh Shell hoặc một loạt các lệnh tương tự như hành động của Trình tự động hóa Nhận các URL liên kết từ các trang web


1

Tôi có một danh sách dài các URL. Chứa trong mỗi trang web này, có những liên kết tôi cần trích xuất. Hành động Automator Nhận URL liên kết từ các trang web là một hành động rất hữu ích cho nhiệm vụ này. Thật không may, bản thân Automator không xử lý khối lượng công việc nặng rất tốt và rất thường xuyên bị treo hoặc treo vô thời hạn. Làm thế nào tôi có thể thực hiện điều này bằng cách sử dụng Bash thông qua ứng dụng Mac OS X Terminal?

Chỉnh sửa - đây là kịch bản hiện tại vì nó đứng ngay bây giờ.

#!/bin/bash

echo "Enter up to 3 words"
read -p "" v1 v2 v3 

web="$HOME/web.txt"
tmp="$HOME/tmp.txt"
err="$HOME/err.txt"
fin="$HOME/fin.txt"
arc="$HOME/arc.txt"

n="$(awk 'END {print NR}' "$web")"
echo "Processing $n URLs..."

grep 'http' "$web" | \
while read -r url; do
    lynx -nonumbers -hiddenlinks=merge -dump -listonly "$url" 2>>"$err" | awk '!a[$0]++' >> "$tmp"
    sleep 1
    n=$((n-1))
    [[ $n -gt 0 ]] &&  echo "$n URLs left to process..." || echo "Processing Completed!"
done

grep -e "$v1" -e "$v2" -e "$v3" "$tmp" | sort -u | cat > "$fin" 
cat "$fin" >> "$arc"

for r in "Results This Session"; do echo "$(cat "$fin" | wc -l)" "$r"; done
for a in "URL's Archived"; do echo "$(cat "$arc" | wc -l)" "$a"; done

Tôi đã thêm read -pvào phần đầu của kịch bản. Có giới hạn về số lượng biến có thể được sử dụng như thế này không? Tôi đã sử dụng thành công tới 9 trong thử nghiệm. Và có cách nào thực tế hơn để viết này? Tôi đã thử read -p "" {v1..v9}mà không làm việc. Tôi đã thêm một vài forvòng lặp ở cuối để cho biết có bao nhiêu dữ liệu được xử lý.

Các vấn đề hiện tại

  • đôi khi tôi gặp lỗi

    sort: string comparison failed: Illegal byte sequence
    sort: Set LC_ALL='C' to work around the problem.

    tuy nhiên khi thêm LS_ALL=Cvào tập lệnh thì có vẻ không đúng.


Tôi thực sự đã cài đặt lynx qua Homebrew.
I0_ol

Được thôi. IMO viết một tập lệnh bash bằng lynx để lấy các liên kết từ danh sách URL là cách để đi. Với các URL mục tiêu trong một tệp văn bản, mỗi dòng trên một dòng, tệp có thể được đọc thành một dòng tại một thời điểm và được xử lý trong một vòng lặp với bộ đếm thời gian để không làm hỏng Máy chủ nhanh nếu URL đang trỏ đến cùng một tên miền và hoặc chỉ để tăng tốc mọi thứ một cách thích hợp. Tất cả đầu ra được đưa vào một tệp khác sẽ được lọc khi cần để vào danh sách các URL mong muốn. Bạn có cần giúp đỡ với kịch bản?
dùng3439894

Vâng, đó sẽ là tuyệt vời nếu bạn có thể. Tôi đang bắt đầu học bash nhưng tôi rất mới với nó. Tôi đã có các URL trong một tệp văn bản đơn giản trên mỗi dòng. Chỉ không chắc chắn nơi để đi từ đó.
I0_ol

Câu trả lời:


1

Đây là một kịch bản để giúp bạn bắt đầu:

#!/bin/bash

urls="/path/to/Input_URLs_List.txt"
output="/path/to/Output_Link_URLs.txt"

n="$(awk 'END {print NR}' "$urls")"
echo "Processing $n URLs..."

cat "$urls" | \
while read url; do
    lynx -dump -listonly "$url" >> "$output"
    sleep 5
    n=$((n-1))
    echo "$n URLs left to process..."
done

Điều này sẽ kết xuất tất cả các liên kết vào một tệp mà bạn có thể xử lý thêm dựa trên những gì bạn đang tìm kiếm. bổ sung có thể được thêm vào để lọc và xử lý đầu ra tuy nhiên không cần biết bạn cần gì để làm việc với nó hoặc hỏi thêm một số câu hỏi.


Để làm sạch đầu ra , sử dụng như sau:

Sử dụng " https://www.google.com " làm một trong những URL mà đầu ra sẽ trông như sau:

$ lynx -dump -listonly "https://www.google.com"


References

    1. https://www.google.com/imghp?hl=en&tab=wi
    2. https://maps.google.com/maps?hl=en&tab=wl
    3. https://play.google.com/?hl=en&tab=w8
    4. https://www.youtube.com/?tab=w1

Tôi đã cắt bớt đầu ra, thực sự có 19 URL Liên kết.

Để có đầu ra chỉ là một danh sách các URL, không có số hoặc khoảng trắng, v.v., hãy sử dụng awkkết hợp với lynxhoặc sau đó.

$ lynx -dump -listonly "https://www.google.com" | awk '/:/{print $2}'
https://www.google.com/imghp?hl=en&tab=wi
https://maps.google.com/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?tab=w1

Vì vậy, nếu bạn muốn tệp đầu ra chỉ là URL Liên kết, hãy thay đổi lynxdòng lệnh thành:

lynx -dump -listonly "$url" | awk '/:/{print $2}' >> "$output"

Bạn luôn có thể xử lý nội dung của tệp đầu ra sau trong tập lệnh hoặc sau đó để đưa nó xuống URL Liên kết thực sự muốn và sử dụng một tham số tìm kiếm khác trong awk, ví dụ: tôi đã sử dụng ":" để loại bỏ các dòng trống trong lynx đầu ra và để hiển thị một ví dụ về cách nó có thể được lọc. Trong ví dụ này, chỉ các URL Liên kết được chuyển hướng vào tệp đầu ra vì chỉ các dòng có chứa :đầu ra nhận bởi awkvì tất cả các URL phải có dấu hai chấm trong đó. Việc {print $2}đơn giản hóa trong phần giải thích này sẽ xóa mọi thứ ở bên trái của URL Liên kết thực tế.


Đây là tập lệnh được cập nhật để sắp xếp và loại bỏ các URL Liên kết trùng lặp:

#!/bin/bash

urls="/path/to/Input_URLs_List.txt"
output="/path/to/Output_Link_URLs.txt"

n="$(awk 'END {print NR}' "$urls")"
echo "Processing $n URLs..."

cat "$urls" | \
while read url; do
    lynx -dump -listonly "$url" | awk '/:/{print $2}' | sort | uniq >> "$output"
    sleep 5
    n=$((n-1))
    [[ $n -gt 0 ]] &&  echo "$n URLs left to process..." || echo "Processing Completed!"
done

Cập nhật để nắm bắt stderr đầu ra từ lynxmột tệp:

Để nắm bắt stderr đầu ra từ lynxtệp, chuyển hướng stderrđến tệp đĩa, ví dụ: 2>>"$file"được thêm sau "$url", ví dụ:

lynx -dump -listonly "$url" 2>>"$file" >> "$output"

Thêm vào errlog="/path/to/Lynx_Errors.txt"dưới output="/path/to/Output_Link_URLs.txt"và sau đó thay đổi lynxdòng lệnh thành, ví dụ:

lynx -dump -listonly "$url" 2>>"$errlog" >> "$output"

Hoặc là:

lynx -dump -listonly "$url" 2>>"$errlog" | awk '/:/{print $2}' | sort | uniq >> "$output"

Thí dụ:

#!/bin/bash

urls="/path/to/Input_URLs_List.txt"
output="/path/to/Output_Link_URLs.txt"
errlog="/path/to/Lynx_Errors.txt"

n="$(awk 'END {print NR}' "$urls")"
echo "Processing $n URLs..."

cat "$urls" | \
while read url; do
    lynx -dump -listonly "$url" 2>>"$errlog" | awk '/:/{print $2}' | sort | uniq >> "$output"
    sleep 5
    n=$((n-1))
    [[ $n -gt 0 ]] &&  echo "$n URLs left to process..." || echo "Processing Completed!"
done

Tôi biết chúng ta không nên sử dụng các bình luận để nói lời cảm ơn nhưng đến địa ngục với các quy tắc .. Cảm ơn bạn rất nhiều! Bạn đã giúp tôi rất nhiều.
I0_ol

@ user556068, tôi đã thêm một ví dụ để lọc lynx đầu ra , do đó, outfile sẽ chỉ chứa URL Liên kết, không có số hoặc khoảng trắng, v.v.
user3439894

Quá nhiều thông tin. Tôi có thể nói rằng tôi sắp học được rất nhiều điều mới. Câu hỏi dành cho bạn - Làm cách nào để tạo nhật ký lỗi để theo dõi bất kỳ URL nào gây ra thông báo lỗi "lynx: Không thể truy cập startfile"?
I0_ol

@ user556068, Xem câu trả lời được cập nhật để nắm bắt stderr đầu ra từ lynxmột tệp.
dùng3439894

Thay vì lynx.... | awk.... | sort | uniqthửlynx -nonumbers -hiddenlinks=merge -dump -listonly "$url" | awk '!a[$0]++'
fd0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.