Python มีโมดูลต่างๆ เช่น urllib คำขอ ฯลฯ เพื่อดาวน์โหลดไฟล์จากเว็บ ฉันจะใช้ไลบรารีคำขอของ python เพื่อดาวน์โหลดไฟล์จาก URL อย่างมีประสิทธิภาพ
มาดูขั้นตอนทีละขั้นตอนในการดาวน์โหลดไฟล์โดยใช้ URL โดยใช้ไลบรารีคำขอกัน
1. นำเข้าโมดูล
import requests
2. รับลิงค์หรือ url
url = 'https://www.facebook.com/favicon.ico' r = requests.get(url, allow_redirects=True)
3. บันทึกเนื้อหาด้วยชื่อ
open('facebook.ico', 'wb').write(r.content)
บันทึกไฟล์เป็น facebook.ico.
ตัวอย่าง
import requests url = 'https://www.facebook.com/favicon.ico' r = requests.get(url, allow_redirects=True) open('facebook.ico', 'wb').write(r.content)
ผลลัพธ์
เราจะเห็นว่าไฟล์ถูกดาวน์โหลด (ไอคอน) ในไดเร็กทอรีการทำงานปัจจุบันของเรา
แต่เราอาจต้องดาวน์โหลดไฟล์ประเภทต่างๆ เช่น รูปภาพ ข้อความ วิดีโอ ฯลฯ จากเว็บ อันดับแรก มาดูประเภทของข้อมูลที่ url เชื่อมโยงไปถึงกันก่อน
>>> r = requests.get(url, allow_redirects=True) >>> print(r.headers.get('content-type')) image/png
อย่างไรก็ตาม มีวิธีที่ชาญฉลาดกว่า ซึ่งเกี่ยวข้องกับการดึงข้อมูลส่วนหัวของ url ก่อนดาวน์โหลดจริง ซึ่งช่วยให้เราข้ามการดาวน์โหลดไฟล์ที่ไม่ได้ตั้งใจจะดาวน์โหลดได้
>>> print(is_downloadable('https://www.youtube.com/watch?v=xCglV_dqFGI')) False >>> print(is_downloadable('https://www.facebook.com/favicon.ico')) True
ในการจำกัดการดาวน์โหลดตามขนาดไฟล์ เราสามารถรับ filezie จากส่วนหัวของความยาวเนื้อหาแล้วทำตามความต้องการของเรา
contentLength = header.get('content-length', None) if contentLength and contentLength > 2e8: # 200 mb approx return False
รับชื่อไฟล์จาก URL
ในการรับชื่อไฟล์ เราสามารถแยกวิเคราะห์ url ด้านล่างนี้คือรูทีนตัวอย่างที่ดึงสตริงสุดท้ายหลังแบ็กสแลช(/)
url= "https://www.computersolution.tech/wp-content/uploads/2016/05/tutorialspoint-logo.png" if url.find('/'): print(url.rsplit('/', 1)[1]
ด้านบนจะให้ชื่อไฟล์ของ url อย่างไรก็ตาม มีหลายกรณีที่ข้อมูลชื่อไฟล์ไม่มีอยู่ใน url เช่น – https://url.com/download ในกรณีเช่นนี้ เราจำเป็นต้องได้รับส่วนหัวการจัดการเนื้อหาซึ่งมีข้อมูลชื่อไฟล์
import requests import re def getFilename_fromCd(cd): """ Get filename from content-disposition """ if not cd: return None fname = re.findall('filename=(.+)', cd) if len(fname) == 0: return None return fname[0] url = 'https://google.com/favicon.ico' r = requests.get(url, allow_redirects=True) filename = getFilename_fromCd(r.headers.get('content-disposition')) open(filename, 'wb').write(r.content)
โค้ดแยกวิเคราะห์ url ด้านบนร่วมกับโปรแกรมด้านบนจะให้ชื่อไฟล์จากส่วนหัวของ Content-Disposition เป็นส่วนใหญ่