>  기사  >  백엔드 개발  >  Python은 비디오 크롤링을 구현합니다.

Python은 비디오 크롤링을 구현합니다.

little bottle
little bottle앞으로
2019-04-10 09:56:303484검색

Python은 어떤 용도로 사용할 수 있나요? 회사에서는 주로 데이터를 크롤링하고 크롤링된 데이터를 분석하고 마이닝하지만, 보고 싶은 드라마 등 일부 리소스를 자체적으로 크롤링하는 데 사용할 수도 있습니다. 이번 글에서는 편집자가 영상 크롤링을 위한 코드를 공유해보겠습니다.

스트리밍 파일을 다운로드하려면 요청 라이브러리에서 요청한 스트림을 True로 설정하세요. 문서가 여기에 있습니다.

먼저 시도해 볼 동영상 주소 찾기:


# -*- coding: utf-8 -*-
import requests
def download_file(url, path):
    with requests.get(url, stream=True) as r:
        chunk_size = 1024
        content_size = int(r.headers['content-length'])
        print '下载开始'
        with open(path, "wb") as f:
            for chunk in r.iter_content(chunk_size=chunk_size):
                f.write(chunk)
if __name__ == '__main__':
    url = '就在原帖...'
    path = '想存哪都行'
    download_file(url, path)

폭격에 직면함:

# 🎜 🎜#

AttributeError: __exit__

이 문서도 거짓말인가요?

컨텍스트에서 요구하는 __exit__ 메소드가 구현되지 않은 것 같습니다. 연결 풀을 해제하기 위해 r이 최종적으로 닫혔는지 확인하는 것이므로 contextlib의 닫기 기능을 사용하십시오.


# -*- coding: utf-8 -*-
import requests
from contextlib import closing
def download_file(url, path):
    with closing(requests.get(url, stream=True)) as r:
        chunk_size = 1024
        content_size = int(r.headers['content-length'])
        print '下载开始'
        with open(path, "wb") as f:
            for chunk in r.iter_content(chunk_size=chunk_size):
                f.write(chunk)

프로그램이 실행 중입니다. 그런데 이 파일을 보면 크기가 변하지 않습니다. 그래도 좋은 내용은 시간에 맞춰 하드디스크에 저장하고, 메모리도 좀 아껴야겠죠?


# -*- coding: utf-8 -*-
import requests
from contextlib import closing
import os
def download_file(url, path):
    with closing(requests.get(url, stream=True)) as r:
        chunk_size = 1024
        content_size = int(r.headers['content-length'])
        print '下载开始'
        with open(path, "wb") as f:
            for chunk in r.iter_content(chunk_size=chunk_size):
                f.write(chunk)
                f.flush()
                os.fsync(f.fileno())

파일이 빠른 속도로 늘어나는군요. 육안으로 볼 수 있습니다. 하드 드라이브가 정말 안타깝습니다. 마지막으로 하드 드라이브에 쓰는 것이 좋습니다. 프로그램에 번호를 기록하세요.


def download_file(url, path):
    with closing(requests.get(url, stream=True)) as r:
        chunk_size = 1024
        content_size = int(r.headers['content-length'])
        print '下载开始'
        with open(path, "wb") as f:
            n = 1
            for chunk in r.iter_content(chunk_size=chunk_size):
                loaded = n*1024.0/content_size
                f.write(chunk)
                print '已下载{0:%}'.format(loaded)
                n += 1

결과는 매우 직관적입니다 :


已下载2.579129%
已下载2.581255%
已下载2.583382%
已下载2.585508%

이상을 갖고 있는 제가 어떻게 이것만으로 만족할 수 있겠습니까? 하나? 클래스를 작성하여 함께 사용합시다:

#🎜🎜 #

# -*- coding: utf-8 -*-
import requests
from contextlib import closing
import time
def download_file(url, path):
    with closing(requests.get(url, stream=True)) as r:
        chunk_size = 1024*10
        content_size = int(r.headers['content-length'])
        print '下载开始'
        with open(path, "wb") as f:
            p = ProgressData(size = content_size, unit='Kb', block=chunk_size)
            for chunk in r.iter_content(chunk_size=chunk_size):
                f.write(chunk)
                p.output()
class ProgressData(object):
    def __init__(self, block,size, unit, file_name='', ):
        self.file_name = file_name
        self.block = block/1000.0
        self.size = size/1000.0
        self.unit = unit
        self.count = 0
        self.start = time.time()
    def output(self):
        self.end = time.time()
        self.count += 1
        speed = self.block/(self.end-self.start) if (self.end-self.start)>0 else 0
        self.start = time.time()
        loaded = self.count*self.block
        progress = round(loaded/self.size, 4)
        if loaded >= self.size:
            print u'%s下载完成\r\n'%self.file_name
        else:
            print u'{0}下载进度{1:.2f}{2}/{3:.2f}{4} 下载速度{5:.2%} {6:.2f}{7}/s'.\
                  format(self.file_name, loaded, self.unit,\
                  self.size, self.unit, progress, speed, self.unit)
            print '%50s'%('/'*int((1-progress)*50))

실행:

下载开始
下载进度10.24Kb/120174.05Kb 0.01% 下载速度4.75Kb/s 
///////////////////////////////////////////////// 
下载进度20.48Kb/120174.05Kb 0.02% 下载速度32.93Kb/s 
/////////////////////////////////////////////////

훨씬 편해 보이네요.

다음으로 할 일은 여러 스레드를 동시에 다운로드하는 것입니다. 메인 스레드는 URL을 생성하여 대기열에 넣고 다운로드 스레드는 URL을 가져옵니다.

#🎜 🎜#

# -*- coding: utf-8 -*-
import requests
from contextlib import closing
import time
import Queue
import hashlib
import threading
import os
def download_file(url, path):
    with closing(requests.get(url, stream=True)) as r:
        chunk_size = 1024*10
        content_size = int(r.headers['content-length'])
        if os.path.exists(path) and os.path.getsize(path)>=content_size:
            print '已下载'
            return
        print '下载开始'
        with open(path, "wb") as f:
            p = ProgressData(size = content_size, unit='Kb', block=chunk_size, file_name=path)
            for chunk in r.iter_content(chunk_size=chunk_size):
                f.write(chunk)
                p.output()

class ProgressData(object):
    def __init__(self, block,size, unit, file_name='', ):
        self.file_name = file_name
        self.block = block/1000.0
        self.size = size/1000.0
        self.unit = unit
        self.count = 0
        self.start = time.time()
    def output(self):
        self.end = time.time()
        self.count += 1
        speed = self.block/(self.end-self.start) if (self.end-self.start)>0 else 0
        self.start = time.time()
        loaded = self.count*self.block
        progress = round(loaded/self.size, 4)
        if loaded >= self.size:
            print u'%s下载完成\r\n'%self.file_name
        else:
            print u'{0}下载进度{1:.2f}{2}/{3:.2f}{4} {5:.2%} 下载速度{6:.2f}{7}/s'.\
                  format(self.file_name, loaded, self.unit,\
                  self.size, self.unit, progress, speed, self.unit)
            print '%50s'%('/'*int((1-progress)*50))

queue = Queue.Queue()
def run():
    while True:
        url = queue.get(timeout=100)
        if url is None:
            print u'全下完啦'
            break
        h = hashlib.md5()
        h.update(url)
        name = h.hexdigest()
        path = 'e:/download/' + name + '.mp4'
        download_file(url, path)
def get_url():
    queue.put(None)

if __name__ == '__main__':
    get_url()
    for i in xrange(4):
        t = threading.Thread(target=run)
        t.daemon = True
        t.start()
# 🎜🎜#반복 다운로드에 대한 판단 추가. URL을 지속적으로 생성하는 방법은 스스로 탐색하고 관리할 수 있습니다!


【추천 강좌:

Python 동영상 튜토리얼

위 내용은 Python은 비디오 크롤링을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제