มีเครื่องมือในการแยกทั้งหมด .zip ลิงก์จากเว็บไซต์และบันทึกลงใน .txt ไฟล์. ฉันใช้ลินุกซ์มินต์
ฉันต้องการทั้งหมด .zip ลิงก์จากเว็บไซต์นี้:
http://all-free-download.com/free-photos/
มีเครื่องมือในการแยกทั้งหมด .zip ลิงก์จากเว็บไซต์และบันทึกลงใน .txt ไฟล์. ฉันใช้ลินุกซ์มินต์
ฉันต้องการทั้งหมด .zip ลิงก์จากเว็บไซต์นี้:
http://all-free-download.com/free-photos/
คำตอบ:
ฉันมีวิธีแก้ปัญหาแม้ว่ามันจะไม่สมบูรณ์และคุณต้องมี curl และ perl ติดตั้งแล้วทั้งคู่ควรมี Linux Mint อยู่แล้วถึงแม้ว่าโซลูชันของฉันจะมีโมดูล Perl ที่ฉันเขียนซึ่งมีอยู่ใน CPAN อีกครั้ง cpan ควรจะพร้อมใช้งานและติดตั้งบน Linux Mint แล้วคุณอาจต้องกำหนดค่าหากคุณยังไม่ได้ตั้งค่า
สำหรับโมดูล App :: ExtractLinks คุณสามารถติดตั้งแบบนี้ได้:
$ cpan App::ExtractLinks
ตราบใดที่การตั้งค่า Perl ของคุณถูกต้องและโมดูล CPAN ใด ๆ สามารถมองเห็นได้ในเส้นทางของคุณตอนนี้คุณควรจะสามารถรันได้ extract-links ใน terminal ของคุณ หากคุณทำเช่นนั้นโดยไม่มีการวางท่อใด ๆ คุณจะไม่เห็นอะไรเลยเพราะคาดว่าจะมีกระแสข้อมูลของ HTML และจะส่งออกไปยังมาตรฐาน (พิมพ์ไปยังเทอร์มินัลของคุณ) URL ใด ๆ ที่ปรากฏใน href="" หรือ src="" คุณลักษณะดังนั้นมันง่ายมาก แต่เมื่อรวมเข้ากับสิ่งต่าง ๆ ในเทอร์มินัลเราเกือบจะบรรลุสิ่งที่คุณถาม
หากคุณบันทึกสคริปต์ทุบตีต่อไปนี้ลงในไฟล์และให้สิทธิ์อนุญาตการใช้งาน chmod 755 หรือเรียกใช้เช่นนี้ bash filename:
#!/usr/bin/env bash
while read url
do
while read id
do
curl -s -I "http://files.all-free-download.com/free_download_graphic_$id.html" | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
done < <(curl -s "$url" | extract-links | grep "_download" | grep -Eo '[0-9]*')
done < <(curl -s http://all-free-download.com/free-photos/ | extract-links | grep "\/download\/")
ตอนนี้ฉันลองและอธิบายทีละบรรทัด
ก่อนอื่นเราทำการส่งออกคำสั่งต่อไปนี้ไปยัง a while read ห่วง
curl -s http://all-free-download.com/free-photos/ | extract-links | grep "\/download\/")
นี่จะได้รับ HTML จาก URL ที่คุณให้ไว้ไปป์ส่งกระแสข้อมูลไปยัง extract-links, -s ทะเลาะกับ curl แค่หมายถึง curl ทำสิ่งนี้อย่างเงียบ ๆ ) ซึ่งจะแสดงลิงก์ทั้งหมดที่พบในหน้า จากนั้นเราจะนำลิสต์ของลิสต์นี้ไปค้นหาลิ้งค์ที่มี /download/ ในพวกเขานี่คือสิ่งที่ grep คำสั่งกำลังทำ แน่นอนว่านี่ไม่ใช่วิธีแก้ปัญหาทั่วไปฉันต้องดูที่แหล่ง HTML ของไซต์ที่คุณระบุและหาตรรกะของ URL
หลังจากเราได้รับลิงค์ด้วยเท่านั้น /download/ ในนั้นพวกเราส่งต่อพวกเขาไปยัง while read วนรอบซึ่งใช้ทีละครั้งและกำหนดลิงก์ไปยังตัวแปร $url. ต่อไปเราทำการดำเนินการที่คล้ายกันอีกครั้ง:
curl -s "$url" | extract-links | grep "_download" | grep -Eo '[0-9]*'
สิ่งนี้ทำงานแบบเดียวกับที่เราทำ แต่ผ่านลิงค์นี้โดยเฉพาะคราวนี้จะทำการกรองลิงก์ที่มีอยู่ _download ในนั้นแล้วใช้เฉพาะตัวเลขจากลิงค์ นี่เป็นอีกครั้งที่ฉันค้นพบโครงร่างที่พวกเขาต้องใช้เพื่อจัดเรียงลิงก์และดาวน์โหลด
ให้ฉันบอกว่า ณ จุดนี้เหตุผลที่ค่อนข้างเกี่ยวข้องกับเรื่องนี้ก็เพราะไม่มีการเชื่อมโยงโดยตรงกับ .zip ไฟล์ได้ทุกที่บนเว็บไซต์ .zip การดาวน์โหลดเริ่มต้นหลังจากการเปลี่ยนเส้นทาง HTTP เมื่อคุณนำทางไปยังหน้าบางหน้า ซึ่งนำฉันไปยังส่วนสุดท้าย:
curl -s -I "http://files.all-free-download.com/free_download_graphic_$id.html" | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
การดำเนินการนี้ใช้เฉพาะตัวเลขจากลิงก์ที่เราได้รับในขั้นตอนก่อนหน้านี้ while read วนรอบมอบหมายให้แต่ละคนเป็นตัวแปร $id และอีกครั้งที่เราใช้ curl ในครั้งนี้ด้วย -I ตัวเลือกซึ่งจะดึงเฉพาะส่วนหัว (แทนที่จะดาวน์โหลดไฟล์) แต่ละหน้าในจุดนี้จะทำการเปลี่ยนเส้นทางซึ่งชี้ไปที่ไฟล์ซิปของตัวเอง เราเรียกใช้ผลลัพธ์ของ curl ผ่านทางอินไลน์ perl สคริปต์ซึ่งเป็นเพียง regex เพื่อรับ Location ส่วนหัว HTTP ซึ่งเป็นไฟล์ที่ระบุว่าจะเปลี่ยนเส้นทางไฟล์ใด
ในที่สุดสิ่งที่คุณต้องทำคือ:
bash my_script.sh > links.txt
แก้ไข
ข้อแม้อย่างหนึ่งคืออาจมีลิงก์ปรากฏซ้ำ ๆ โดยอ้างอิงจากการทดสอบกับเว็บไซต์ที่คุณพูดถึงดังนั้นโปรดจำไว้ว่า
เห็นได้ชัดว่านี่ไม่ใช่การดำเนินการที่มีประสิทธิภาพมาก แต่จากนั้นอีกครั้งมันก็เป็นแบบอัตโนมัติและไม่จำเป็นต้องมีวิธีอื่นในการรับข้อมูลที่คุณต้องการโดยไม่ต้องมีผู้ดูแลระบบเข้าสู่เว็บไซต์