2010-05-10 16 views
46

Tôi đang tìm kiếm một cách để giả mạo một trang web. Điều quan trọng là tôi không thực sự muốn nội dung, mà là một danh sách các URI đơn giản. Tôi có thể lấy lý gần với ý tưởng này Wget sử dụng tùy chọn --spider, nhưng khi đường ống đầu ra thông qua một grep, tôi dường như không thể tìm thấy sự kỳ diệu ngay để làm cho nó làm việc:Nhện trang web và URL trả lại Chỉ

wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:' 

Bộ lọc grep dường hoàn toàn không ảnh hưởng đến đầu ra wget. Tôi đã có một cái gì đó sai hoặc là có một công cụ tôi nên thử đó là hướng tới việc cung cấp loại kết quả hạn chế này?

CẬP NHẬT

Vì vậy, tôi chỉ phát hiện ra ẩn đó, theo mặc định, wget ghi vào stderr. Tôi đã bỏ lỡ điều đó trong các trang của người đàn ông (trên thực tế, tôi vẫn chưa tìm thấy nó nếu nó ở trong đó). Khi tôi chuyển đường trở lại thành công trình chuẩn bị, tôi đã tiến gần hơn đến những gì tôi cần:

wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:' 

Tôi vẫn muốn có phương tiện tốt hơn để thực hiện loại điều này, nếu có.

+0

Xem câu hỏi/câu trả lời này theo cách khác bằng cách sử dụng tập lệnh python: http://stackoverflow.com/questions/9561020/how-do-i-use-the-python-scrapy-module-to-list-all- the-urls-from-my-website –

+0

có thể trùng lặp của [Nhận danh sách URL từ một trang web] (http://stackoverflow.com/questions/857653/get-a-list-of-urls-from-a- trang web) –

Trả lời

39

Các tuyệt đối cuối cùng điều tôi muốn làm là tải về và phân tích tất cả các nội dung bản thân mình (tức là tạo ra của tôi nhện riêng). Một khi tôi đã học được rằng Wget viết để stderr theo mặc định, tôi đã có thể chuyển hướng nó đến stdout và lọc đầu ra một cách thích hợp.

wget --spider --force-html -r -l2 $url 2>&1 \ 
    | grep '^--' | awk '{ print $3 }' \ 
    | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \ 
    > urls.m3u 

Điều này cung cấp cho tôi danh sách tài nguyên nội dung (tài nguyên không phải là hình ảnh, tệp CSS hoặc JS) URI bị xáo trộn. Từ đó, tôi có thể gửi các URI đến một công cụ của bên thứ ba để xử lý để đáp ứng nhu cầu của tôi.

Đầu ra vẫn cần được sắp xếp hợp lý một chút (nó tạo ra các bản sao như được hiển thị ở trên), nhưng nó gần như ở đó và tôi không phải tự mình phân tích cú pháp.

+3

'wget -r --spider -l1 -A mp3 http://example.com/page-with-mp3s 2> & 1 | grep -Eio http. + Mp3' là một vé phép thuật tốt cho tôi Cảm ơn! – AKX

+2

Tôi thường chuyển đầu ra đó sang 'sort | uniq' để xóa các bản sao, FYI. –

+1

Tôi biết 5 năm đã trôi qua kể từ khi câu trả lời này nhưng bạn có thể tăng tốc quá trình này không? Chỉ mất vài giây hoặc thậm chí vài phút cho các trang web có 200 url – erdomester

19

Tạo một vài biểu thức thông thường để trích xuất các địa chỉ từ tất cả

<a href="(ADDRESS_IS_HERE)">. 

Dưới đây là giải pháp tôi sẽ sử dụng:

wget -q http://example.com -O - | \ 
    tr "\t\r\n'" ' "' | \ 
    grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \ 
    sed -e 's/^.*"\([^"]\+\)".*$/\1/g' 

chí này ra tất cả http, https, ftp, và FTPS liên kết từ một trang web. Nó sẽ không cung cấp cho bạn url tương đối, chỉ url đầy đủ.

Giải thích về các tùy chọn được sử dụng trong hàng loạt các lệnh bằng đường ống:

wget -q làm cho nó không có đầu ra quá mức (chế độ im lặng). wget -O - làm cho nó để các tập tin tải về được lặp lại để stdout, chứ không phải là lưu vào đĩa.

tr là trình dịch ký tự unix, được sử dụng trong ví dụ này để dịch dòng mới và tab thành dấu cách, cũng như chuyển đổi dấu nháy đơn thành dấu ngoặc kép để chúng tôi có thể đơn giản hóa các biểu thức chính quy của chúng tôi.

grep -i làm cho trường hợp tìm kiếm không phân biệt chữ hoa chữ thường grep -o làm cho nó chỉ xuất các phần phù hợp.

sed là tiện ích unix Stream EDitor cho phép hoạt động lọc và chuyển đổi.

sed -e chỉ cho phép bạn cung cấp cho nó một biểu thức.

Chạy kịch bản này ít vào "http://craigslist.org" mang lại một danh sách khá dài các liên kết:

http://blog.craigslist.org/ 
http://24hoursoncraigslist.com/subs/nowplaying.html 
http://craigslistfoundation.org/ 
http://atlanta.craigslist.org/ 
http://austin.craigslist.org/ 
http://boston.craigslist.org/ 
http://chicago.craigslist.org/ 
http://cleveland.craigslist.org/ 
... 
+2

+1 để kiểm tra giải pháp của bạn :) – BenV

+0

cool: D .. đang tìm kiếm điều này! – Tathagata

+0

Rất hay. Nhưng các phiên bản Win32 của các công cụ đang bị nghẹt thở ... Một nơi nào đó. Bạn có thể nói cách sửa đổi chúng cho Cygwin hoặc Windows thẳng không? – Snowy

5

Tôi đã sử dụng một công cụ gọi là xidel

xidel http://server -e '//a/@href' | 
grep -v "http" | 
sort -u | 
xargs -L1 -I {} xidel http://server/{} -e '//a/@href' | 
grep -v "http" | sort -u 

Một chút hackish nhưng giúp bạn gần gũi hơn! Đây chỉ là cấp độ đầu tiên. Hãy tưởng tượng đóng gói này thành một kịch bản tự đệ quy!

+0

Cảm ơn ... trông hoàn hảo cho việc viết kịch bản cho vấn đề wget của tôi (http://opendata.stackexchange.com/q/4851/ 263) – Joe

Các vấn đề liên quan