Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

กำลังดาวน์โหลดไฟล์จากเว็บโดยใช้ Python?


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)

ผลลัพธ์

กำลังดาวน์โหลดไฟล์จากเว็บโดยใช้ Python?

เราจะเห็นว่าไฟล์ถูกดาวน์โหลด (ไอคอน) ในไดเร็กทอรีการทำงานปัจจุบันของเรา

แต่เราอาจต้องดาวน์โหลดไฟล์ประเภทต่างๆ เช่น รูปภาพ ข้อความ วิดีโอ ฯลฯ จากเว็บ อันดับแรก มาดูประเภทของข้อมูลที่ 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 เป็นส่วนใหญ่