Wêne û pelên din ên ji tevneyê di Python de dakêşin (bi kesane an bi koman)

Dikan

Ya jêrîn rave dike ka meriv çawa URL-ya wêneyek, ZIP, PDF, an pelek din li ser Webê di Python de diyar dike, wê dakêşîne û wekî pelek herêmî hilîne.

  • Bi diyarkirina URL-ê wêneyan dakêşin.
    • Nimûneya kodê
    • urllib.request.urlopen():URL vekin
    • open():Di pelê de di moda binary de binivîse
    • Nimûneyek kodek hêsantir
  • Pelên ZIP, pelên PDF, hwd dakêşin.
  • URL-ya wêneyê li ser rûpelê malperê derxînin.
    • Ger hejmar rêzdar be
    • Bi Şorbeya Xweş derxe
  • Batch gelek wêneyan ji navnîşek URL-an dakêşin

Bi diyarkirina URL-ê wêneyan dakêşin.

Hûn dikarin pirtûkxaneya standard tenê bikar bînin da ku pelên kesane bi destnîşankirina URLên wan dakêşin; tu sazkirina zêde pêwîst e.

Nimûneya kodê

Ya jêrîn mînakek fonksiyonek e ku pelek bi destnîşankirina URL û rêça armancê, û karanîna wê dakêşîne û hilîne. Ev kod ji bo ravekirinê hinekî bi devkî ye. Mînakek hêsan li jêr tê dayîn.

import os
import pprint
import time
import urllib.error
import urllib.request

def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file:
            data = web_file.read()
            with open(dst_path, mode='wb') as local_file:
                local_file.write(data)
    except urllib.error.URLError as e:
        print(e)
url = 'https://www.python.org/static/img/python-logo.png'
dst_path = 'data/temp/py-logo.png'
download_file(url, dst_path)

Ji bo destnîşankirina pelrêça mebestê û tomarkirina pelê bi navê pelê URL-ê, jêrîn bikin

def download_file_to_dir(url, dst_dir):
    download_file(url, os.path.join(dst_dir, os.path.basename(url)))

dst_dir = 'data/temp'
download_file_to_dir(url, dst_dir)

Ew navê pelê ji URL-ê bi os.path.basename() derdixe û pê re bi pelrêça ku bi os.path.join() ve hatî destnîşan kirin re têkildar dike da ku riya mebestê çêbike.

Di beşên jêrîn de beşa wergirtina daneyê û beşa tomarkirina daneyê wekî pelek diyar dike.

urllib.request.urlopen():URL vekin

urllib.request.urlopen() bikar bînin da ku URL-ê vekin û daneyan bistînin. Bala xwe bidinê ku urllib.urlopen() di Python 2.6 û berê de hatî betal kirin. urllib.request.urlretrieve() hîna nehatiye paşguh kirin, lê dibe ku di pêşerojê de be.

Ji bo ku gava îstîsna çêbibe nesekine, bi hewl û ji bilî xeletiyê bigire.

Di nimûneyê de, urllib.error tê import kirin û tenê urllib.error.URLError bi eşkere tête girtin. Dema ku URL-ya pelê tune be dê peyama xeletiyê were xuyang kirin.

url_error = 'https://www.python.org/static/img/python-logo_xxx.png'
download_file_to_dir(url_error, dst_dir)
# HTTP Error 404: Not Found

Heke hûn dixwazin dema tomarkirina herêmî îstisnayan jî bigirin (FileNotFoundError, hwd.), jêrîn bikin.
(urllib.error.URLError, FileNotFoundError)

Di heman demê de gengaz e ku ji bo vekirina url-ê û wergirtina daneyê li şûna urllib-a standard pirtûkxaneya Daxwazên pirtûkxaneya sêyemîn bikar bînin.

Di pelek vekirî de di moda binary de binivîse()

Daneyên ku dikarin bi urllib.request.urlopen()-ê bi dest bixin stringek baytê ye (cureya byte).

Open() bi mod=’wb’ wekî argumana duyemîn daneyan wekî binary dinivîse. W tê wateya nivîsandin û b tê wateya binary.

Nimûneyek kodek hêsantir

Daxuyanên hêlînkirî dikarin bi yekcarî werin nivîsandin, bi koman ji hev werin veqetandin.

Bi karanîna vê yekê, em dikarin jêrîn binivîsin.

def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file, open(dst_path, 'wb') as local_file:
            local_file.write(web_file.read())
    except urllib.error.URLError as e:
        print(e)

Pelên ZIP, pelên PDF, hwd dakêşin.

Nimûneyên heta niha ji bo dakêşandin û tomarkirina pelên wêneyê ne, lê ji ber ku em bi tenê pelek li ser tevneyê vedikin û wê wekî pelek herêmî hilînin, heman fonksiyon dikarin ji bo celebên pelên din jî werin bikar anîn.

Hûn dikarin bi destnîşankirina URL-ê pelan dakêşin û hilînin.

url_zip = 'https://from-locas.com/sample_header.csv.zip'
download_file_to_dir(url_zip, dst_dir)

url_xlsx = 'https://from-locas/sample.xlsx'
download_file_to_dir(url_xlsx, dst_dir)

url_pdf = 'https://from-locas/sample1.pdf'
download_file_to_dir(url_pdf, dst_dir)

Bala xwe bidinê ku URL-ya ku di vê fonksiyonê de hatî destnîşan kirin divê girêdanek pelê bixwe be.

Mînakî, di doza pelê depoyek GitHub de, URL-ya jêrîn pêvekek pdf heye lê bi rastî rûpelek html e. Ger ev URL di fonksiyona jorîn de were destnîşan kirin, çavkaniya html dê were dakêşandin.

  • https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf

Girêdana sazûmana pelê URL-ya jêrîn e, ku hûn hewce ne ku diyar bikin ka hûn dixwazin pelê dakêşin û hilînin.

  • https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf

Di heman demê de rewş hene ku gihîştina ji hêla karmendê bikarhêner, referander, hwd ve tê sînorkirin, ku dakêşanê ne gengaz dike. Em garantî nakin ku hemî pel dê bêne dakêşandin.

Bikaranîna Daxwazên ji bo guheztin an lê zêdekirina sernavên daxwazê ​​yên wekî nûnerê bikarhêner hêsan e.

URL-ya wêneyê li ser rûpelê malperê derxînin.

Ji bo dakêşandina hemî wêneyên di rûpelek de yekcar, pêşî URL-yên wêneyan derxînin û navnîşek çêbikin.

Ger hejmar rêzdar be

Ger URL-ya wêneya ku hûn dixwazin dakêşin hejmareke rêzimanî ya hêsan e, ew hêsan e. Ger URL ne tenê hejmarên rêzdar in, lê di heman demê de hin rêkûpêk jî hene, hêsantir e ku meriv navnîşek URL-an li gorî rêzikan çêbike ne ji şorbeya Bedew (li jêr binêre).

Nîşana têgihîştina navnîşê bikar bînin.

url_list = ['https://example.com/basedir/base_{:03}.jpg'.format(i) for i in range(5)]
pprint.pprint(url_list)
# ['https://example.com/basedir/base_000.jpg',
#  'https://example.com/basedir/base_001.jpg',
#  'https://example.com/basedir/base_002.jpg',
#  'https://example.com/basedir/base_003.jpg',
#  'https://example.com/basedir/base_004.jpg']

Di mînaka jorîn de, {:03} ji bo jimareke rêzimanî ya 3-hejmarî-sifir tije tê bikaranîn; {} dema dagirtina sifir ne hewce ye tê bikar anîn, û {:05} li şûna 3 reqeman ji bo jimarek 5-hejmarî tê bikar anîn. Ji bo bêtir agahdarî li ser rêbaza formata string str, li gotara jêrîn binêre.

Di heman demê de, li vir em pprint bikar tînin da ku xwendinê hêsantir bikin.

Bi Şorbeya Xweş derxe

Ji bo ku URLên wêneyan ji rûpelên malperê bi girseyî derxînin, Şorbeya Bedew bikar bînin.

import os
import time
import urllib.error
import urllib.request

from bs4 import BeautifulSoup

url = 'https://ku.from-locals.com/'
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) '\
     'AppleWebKit/537.36 (KHTML, like Gecko) '\
     'Chrome/55.0.2883.95 Safari/537.36 '

req = urllib.request.Request(url, headers={'User-Agent': ua})
html = urllib.request.urlopen(req)

soup = BeautifulSoup(html, "html.parser")

url_list = [img.get('data-src') for img in soup.find(class_='list').find_all('img')]

Di nimûneyê de, URL-ya wêneya piçûk a vê malperê tête derxistin.

Struktura li gorî rûpela malperê diguhere, lê di bingeh de ew wekî jêrîn tête wergirtin.

  • Lîsteya <img> bi diyarkirina çîn, nasname, hwd. ya blokê ku gelek wêneyên ku hûn dixwazin dakêşin hene, etîket bikin.
    • soup.find(class_='list').find_all('img')
  • URL-ya wêneyê ji hêmana src an jî hêmana data-src ya <img> tag.
    • img.get('data-src')

Koda nimûneya jorîn tenê mînakek e û ne garantî ye ku bixebite.

Batch gelek wêneyan ji navnîşek URL-an dakêşin

Ger navnîşek URL-ya we hebe, hûn dikarin wê tenê di hêleka for-ê de bizivirînin û bangî fonksiyonê bikin ku pelê bi URL-ya yekem hatî xuyang kirin dakêşin û hilînin. Ji ber navnîşa URL-ya demkî, fonksiyona banga download_image_dir() li vir tê şîrove kirin.

download_dir = 'data/temp'
sleep_time_sec = 1

for url in url_list:
    print(url)
#     download_file_dir(url, download_dir)
    time.sleep(sleep_time_sec)
# https://example.com/basedir/base_000.jpg
# https://example.com/basedir/base_001.jpg
# https://example.com/basedir/base_002.jpg
# https://example.com/basedir/base_003.jpg
# https://example.com/basedir/base_004.jpg

Ji bo ku server zêde bar neke, ez time.sleep() bikar tînim da ku ji bo her dakêşana wêneyê demek li bendê biafirînim. Yekîneyek di saniyeyan de ye, ji ber vê yekê di mînaka li jor de, modula demê tê import kirin û bikar anîn.

Nimûne ji bo pelên wêneyê ye, lê celebên din ên pelan jî dikarin bi hev re werin dakêşandin, heya ku ew têne navnîş kirin.

Copied title and URL