QGET เป็นไลบรารีที่ได้รับอนุญาต Apache2 ซึ่งเขียนใน Python สำหรับการดาวน์โหลดแหล่งข้อมูลเว็บในลักษณะอะซิงโครนัสให้เร็วที่สุด
ภายใต้ฮูดจะได้รับประโยชน์จาก asyncio และ aiohttp เพื่อสร้างการเชื่อมต่อหลายครั้งพร้อมกันไปยังทรัพยากรและดาวน์โหลดโดยใช้ไฟล์ชิ้นส่วนบัฟเฟอร์
สารบัญ
wget vs qgettqdm )chunk_bytes และ max_part_mbasyncio โดย qget_coro COROUTINEwget vs qget พิจารณาชิ้นส่วนการกำหนดค่า nginx แบบง่าย ๆ เช่นนี้:
http {
server {
...
limit_rate 5m ;
...
}
} ตอนนี้ลองเปรียบเทียบสถิติการดาวน์โหลดสำหรับ wget และ qget สำหรับไฟล์ 1,000MB และการกำหนดค่าที่กล่าวถึงข้างต้น:
| แอปพลิเคชัน | เวลาทั้งหมด [s] | ความเร็ว AVG [MB/S] | รายละเอียด |
|---|---|---|---|
wget | 251.34 | 3.98 | |
qget | 16.00 น | 95.97 | การทดสอบขีด จำกัด การเชื่อมต่อ: 5.00s ดาวน์โหลด: 10.42s การเขียนชิ้นส่วน: 0.58s |
บทสรุป :
สำหรับการ จำกัด อัตราอย่างง่าย ( ต่อการเชื่อมต่อ ) qget อนุญาตให้บรรลุความเร็วในการดาวน์โหลด ที่เร็วขึ้นหลายครั้ง ตามความเร็วการเชื่อมต่ออินเทอร์เน็ตของผู้ใช้จำนวนคำขอพร้อมกันและการกำหนดค่าเซิร์ฟเวอร์ทรัพยากร ในตัวอย่างด้านบน qget ได้รับความเร็วสูงกว่า 24X ความเร็วในการดาวน์โหลดของ wget
สำหรับกรณีที่ซับซ้อนมากขึ้น ( เช่นขีด จำกัด การเชื่อมต่อต่อ IP ) การทดสอบขีด จำกัด การเชื่อมต่อการเชื่อมต่ออัตโนมัติถูกสร้างขึ้นเพื่อคำนวณจำนวนคำขอพร้อมกันก่อนที่เซิร์ฟเวอร์จะปฏิเสธครั้งต่อไป
คุณสามารถดาวน์โหลดไฟล์ไบนารีที่เลือกจากรุ่น เวอร์ชันที่มีอยู่:
ในการติดตั้งโมดูล qget เพียง:
$ pip install qgetตรวจสอบให้แน่ใจว่ามีการติดตั้ง Anaconda แล้ว
ในการสร้างบน windows (ใน anaconda prompt):
$ build.bat ในการสร้างแพ็คเกจ POSIX (จำเป็นต้องมีแพ็คเกจ libc-bin และ binutils ):
$ build.shฟังก์ชั่นอาร์กิวเมนต์:
URL (STR): URL เพื่อดาวน์โหลดทรัพยากร
FilePath (STR, ตัวเลือก): เส้นทางเอาท์พุทสำหรับทรัพยากรที่ดาวน์โหลด
หากไม่ได้ตั้งค่าจุดไปยังไดเรกทอรีการทำงานปัจจุบันและชื่อไฟล์จาก URL ค่าเริ่มต้นถึงไม่มี
แทนที่ (บูล, ไม่บังคับ): ตั้งค่าสถานะหากไฟล์เอาต์พุตที่มีอยู่ควรแทนที่ ค่าเริ่มต้นเป็นเท็จ
Auth (STR, ตัวเลือก): สตริงของผู้ใช้: คู่รหัสผ่านสำหรับการเชื่อมต่อ SSL ค่าเริ่มต้นถึงไม่มี
VERIFY_SSL (บูลตัวเลือก): FLAG หากควรทำการตรวจสอบใบรับรอง SSL ค่าเริ่มต้นเป็นจริง
MOCK_BROWSER (บูล, เป็นตัวเลือก): ตั้งค่าสถานะหากควรเพิ่มส่วนหัวของผู้ใช้ตัวแทนในการร้องขอ ค่าเริ่มต้นเป็นจริง
สตริงตัวแทนผู้ใช้เริ่มต้น: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Applewebkit/537.36
(khtml เช่น gecko) Chrome/101.0.4951.67 Safari/537.36 '
proxy_url (STR, ตัวเลือก): http/socks4/socks5 url พร็อกซีในรูปแบบ 'โปรโตคอล: // ผู้ใช้: รหัสผ่าน@IP: พอร์ต'
ค่าเริ่มต้นถึงไม่มี
ส่วนหัว: (dict [str, str], ไม่บังคับ): ส่วนหัวที่กำหนดเองที่จะส่ง ค่าเริ่มต้นเป็นไม่มี
หากผู้ใช้ตั้งค่าสามารถระบุตัวแทนผู้ใช้ของตัวเองและยอมรับส่วนหัวมิฉะนั้นจะใช้ค่าเริ่มต้น
progress_ref (ProgressState, เป็นทางเลือก): อ้างอิงถึงสถานะความคืบหน้า
หากผ่านทุกส่วนไบต์และสถานะการเขียนใหม่จะได้รับการปรับปรุงในนั้น ค่าเริ่มต้นถึงไม่มี
max_connections (int, เป็นตัวเลือก): จำนวนสูงสุดของการเชื่อมต่อ HTTP แบบอะซิงโครนัส ค่าเริ่มต้นถึง 50
connection_test_sec (int, ไม่บังคับ): เวลาสูงสุดในวินาทีที่กำหนดให้กับการทดสอบ
การเชื่อมต่อแบบอะซิงโครนัสสามารถทำได้เพื่อ URL
หากตั้งค่าเป็น 0 การทดสอบจะถูกละเว้น ค่าเริ่มต้นถึง 5
chunk_bytes (int, เป็นตัวเลือก): ชิ้นข้อมูลที่อ่านในการทำซ้ำจาก URL และบันทึกเป็นส่วนหนึ่งไฟล์ในไบต์
จะถูกใช้เมื่อเขียนชิ้นส่วนใหม่ไปยังไฟล์เอาต์พุต หากมีการ จำกัด ขีด จำกัด สิ่งนี้สามารถแทนที่ได้
สตรีมการวนซ้ำ ค่าเริ่มต้นเป็น 2621440
MAX_PART_MB (ลอย, ไม่บังคับ): เป็นที่ต้องการ (ถ้าเป็นไปได้) ขนาดชิ้นส่วนสูงสุดใน megabytes ค่าเริ่มต้นถึง 5
RETRIES (int, เสริม): ลองหมายเลขสำหรับการดาวน์โหลดส่วนหนึ่ง ค่าเริ่มต้นถึง 10
retry_sec (int, ไม่บังคับ): เวลาที่จะรอระหว่างการดาวน์โหลดส่วนหนึ่งในไม่กี่วินาที ค่าเริ่มต้นเป็น 1
ขีด จำกัด (STR, ตัวเลือก): การ จำกัด อัตราการดาวน์โหลดใน MBPS สามารถจัดหาให้กับหน่วยเป็น "nunit" เช่น "5m"
หน่วยที่ถูกต้อง (ไม่รู้สึกตัว): B, K, M, G, KB, MB, GB 0 ไบต์จะได้รับการปฏิบัติโดยไม่ จำกัด
ค่าเริ่มต้นถึงไม่มี
TMP_DIR (STR, ตัวเลือก): เส้นทางไดเรกทอรีชั่วคราว หากไม่ได้ตั้งค่าจะชี้ไปที่ไดเรกทอรี OS TMP
ค่าเริ่มต้นถึงไม่มี
DEBUG (BOOL, ตัวเลือก): ธงดีบั๊ก ค่าเริ่มต้นเป็นเท็จ
หากต้องการใช้ในรหัสเพียงแค่นำเข้าฟังก์ชั่นโมดูล:
from qget import qget
url = "https://speed.hetzner.de/100MB.bin"
qget ( url ) ใช้ในรหัสที่มีลูปและ asyncio ของตัวเอง:
import asyncio
from qget import qget_coro
async def main ( loop ):
url = "https://speed.hetzner.de/100MB.bin"
download_task = loop . create_task ( qget_coro ( url ))
await download_task
# Or just
# await qget_coro(url)
loop = asyncio . get_event_loop ()
loop . run_until_complete ( main ( loop ))
loop . close () การใช้งานสำหรับ hooks ความคืบหน้า (โดยตะขอเริ่มต้นใช้เพื่อแสดงแถบความคืบหน้าของ tqdm ):
from qget import ProgressState , qget
def print_download_progress ( progress : ProgressState ) -> None :
print ( f"Download: { progress . get_download_progress ():.2f } %" , end = " r " )
if progress . get_download_bytes () == progress . total_bytes :
print ()
def print_rewrite_progress ( progress : ProgressState ) -> None :
print ( f"Rewrite: { progress . get_rewrite_progress ():.2f } %" , end = " r " )
if progress . rewrite_bytes == progress . total_bytes :
print ()
url = "https://speed.hetzner.de/100MB.bin"
progress = ProgressState (
on_download_progress = print_download_progress ,
on_rewrite_progress = print_rewrite_progress
)
qget ( url , progress_ref = progress ) การใช้งาน: qget [-h] [-o filepath] [-f] [-a auth] [-ไม่มีการตรวจสอบ] [-no-mock]
[-Proxy Proxy_url] [-H Header] [-C MAX_CONNECTIONS]
[-ทดสอบ connection_test_sec] [-bytes chunk_bytes] [-ส่วน Max_part_mb]
[-retries retries] [-retry_sec retry_sec] [-ขีด จำกัด จำกัด ] [--tmp tmp_dir]
[--Debug] [-V]
url
ดาวน์โหลดทรัพยากรจาก URL ที่กำหนดในชิ้นส่วนบัฟเฟอร์โดยใช้การเชื่อมต่อ HTTP แบบอะซิงโครนัส
ด้วยเซสชัน aiohttp
ข้อโต้แย้งตำแหน่ง:
URL URL ของทรัพยากร
ตัวเลือก:
-H, -HELP แสดงข้อความช่วยเหลือและออกนี้
-o filepath, -เอาท์พุท filepath
เส้นทางเอาท์พุทสำหรับทรัพยากรที่ดาวน์โหลด
-f, -กำลังบังคับไฟล์แทนที่สำหรับเอาต์พุต
-a Auth, -Auth Auth String ของผู้ใช้: Password Pair สำหรับการเชื่อมต่อ SSL
-ไม่มีการตรวจสอบการตรวจสอบใบรับรอง SSL
-ไม่มีการปิดการใช้งานส่วนหัวตัวแทนผู้ใช้เริ่มต้น
-proxy proxy_url http/socks4/socks5 proxy url ในรูปแบบ
'โปรโตคอล: // ผู้ใช้: รหัสผ่าน@IP: พอร์ต'
-H Header, -Header Header
ส่วนหัวที่กำหนดเองในรูปแบบ 'ชื่อ: ค่า' สามารถจัดหาได้หลายอย่าง
ครั้ง.
-c max_connections -การเชื่อมต่อ max_connections
จำนวนสูงสุดของการเชื่อมต่อ HTTP แบบอะซิงโครนัส
-ทดสอบ connection_test_sec
เวลาสูงสุดในไม่กี่วินาทีที่กำหนดให้ทดสอบว่าแบบอะซิงโครนัสเท่าไหร่
การเชื่อมต่อสามารถทำได้เพื่อ URL ใช้ 0 เพื่อข้าม
-bytes chunk_bytes chunk ของข้อมูลที่อ่านในการทำซ้ำจาก URL และบันทึกเป็นส่วนหนึ่งไฟล์ใน
ไบต์ จะถูกใช้เมื่อเขียนชิ้นส่วนใหม่ไปยังไฟล์เอาต์พุต
-ส่วน MAX_PART_MB ที่ต้องการ (ถ้าเป็นไปได้) ขนาดชิ้นส่วนสูงสุดในเมกะไบต์
-Retries retries retries number สำหรับการดาวน์โหลดส่วนหนึ่ง
-Retry_sec retry_sec เวลารอระหว่างการดาวน์โหลดส่วนหนึ่งในไม่กี่วินาที
-จำกัด ขีด จำกัด อัตราการดาวน์โหลดใน MBPS สามารถจัดหาให้กับหน่วยเป็น 'nunit'
เช่น '5m' หน่วยที่ถูกต้อง (ไม่รู้สึกตัว): B, K, M, G, KB, MB, GB
0 ไบต์จะได้รับการปฏิบัติโดยไม่ จำกัด
-TMP TMP_DIR เส้นทางไดเรกทอรีชั่วคราว หากไม่ได้ตั้งค่าไว้เป็น OS TMP
ไดเรกทอรี
-ธงดีบักดีบัก
-v, -Version แสดงเวอร์ชันจริงของ QGET
สามารถใช้ได้จากโมดูล Python ที่มีอาร์กิวเมนต์เดียวกับ Binary:
python -m qget https://speed.hetzner.de/100MB.binสามารถจัดหาส่วนหัวได้หลายส่วนดังต่อไปนี้:
python -m qget -H ' name1:value1 ' -H ' name2:value2 ' https://speed.hetzner.de/100MB.bin Limiter พยายามลดอัตราการดาวน์โหลดไบต์โดยเพิ่มการหยุดชั่วคราวระหว่างการวนซ้ำมากกว่าเนื้อหาทรัพยากร หากมีการร้องขออัตราการดาวน์โหลดที่ต่ำมากให้ลองลดจำนวนการเชื่อมต่อ ( max_connections หรือ --connections MAX_CONNECTIONS ) เพื่อให้ได้ความแม่นยำที่ดีขึ้นสำหรับขีด จำกัด
ขนาดชิ้นส่วนถูกคำนวณในรันไทม์ตามขนาดทรัพยากรในไบต์และจำนวนสูงสุดของการเชื่อมต่อแบบอะซิงโครนัสที่กำหนดโดยผู้ใช้ (หรือการทดสอบการเชื่อมต่อ) ขนาดชิ้นส่วนสูงสุด ( max_part_mb หรือ --part MAX_PART_MB ) ที่จัดทำโดยผู้ใช้จะใช้เป็นขีด จำกัด สูงสุดสำหรับค่าที่คำนวณได้
part_bytes = min (resource_bytes/การเชื่อมต่อ, max_part_bytes)