1 층: 단일 페이지 다 중 그림 다운로드, 난이도 중간 -- wh 02

5903 단어
1 층: 단일 페이지 다 중 다운로드
실험 설명
1.1. 환경 로그 인
비밀번호 없 이 자동 로그 인, 시스템 사용자 이름 shiyanlou
환경 소개
이 실험 환경 은 데스크 톱 이 있 는 Ubuntu Linux 환경 을 사용 합 니 다. 실험 에 서 는 데스크 톱 프로그램 을 사용 합 니 다.
  • Xfce 터미널: Linux 명령 행 터미널, 열 면 셸 환경 에 들 어 갑 니 다. Linux 명령
  • 을 사용 할 수 있 습 니 다.
  • Firefox: 브 라 우 저 는 프론트 인터페이스 가 필요 한 과정 에서 사용 할 수 있 습 니 다. 환경 에 쓰 인 HTML/JS 페이지 만 열 면 됩 니 다
  • GVim: 아주 좋 은 편집기 입 니 다. 가장 간단 한 용법 은 과정 Vim 편집기
  • 를 참고 할 수 있 습 니 다.
    1.3 환경 사용
    GVim 편집기 로 실험 에 필요 한 코드 와 파일 을 입력 하고 Xfce 터미널 실행 에 필요 한 명령 을 사용 합 니 다.
    실험 보고 서 는 개인 홈 페이지 에서 볼 수 있 습 니 다. 그 중에서 매번 실험의 캡 처 와 필기, 그리고 매번 실험의 효과 적 인 학습 시간 (실험 데스크 톱 에서 조작 하 는 시간 을 말 합 니 다. 조작 하지 않 으 면 시스템 은 멍 때 리 는 시간 으로 기록 합 니 다) 을 포함 합 니 다.이것들 은 모두 당신 이 배 운 진실성 증명 입 니 다.
    실험 건물 가상 기 는 python 2. X 와 python 3. X 버 전 을 가지 고 있 으 며 설치 할 필요 가 없습니다. 이 실험 은 python 2 를 바탕 으로 합 니 다.
    과정 소개
    이 절 은 지난 절 에 언급 한 지식 포 인 트 를 이용 하여 단일 홈 페이지 의 그림 을 추출 하고 다운로드 하여 현지 에 다운로드 합 니 다.
    기능 설명
  • 웹 페이지 의 html 에서 우리 가 필요 로 하 는 이미지 링크 를 얻 고 웹 페이지 를 엽 니 다. 이 페이지 아래 에 모두 10 장의 그림 이 있 습 니 다. 우리 가 올 라 가 야 할 것 입 니 다. 웹 페이지 소스 코드 를 보고 이 10 장의 그림 코드 를 찾 으 면 모두
    의 형식 이지 만 이 몇 장 을 제외 하고 이 페이지 안의 다른 사진 도 img 라벨 을 사용 합 니 다. 모든 것 은 img 으로 만 일치 합 니 다. 정확 도 를 조절 하기 가 쉽 지 않 습 니 다. 또한 저 는 ubuntu 에서 spy
  • 를 사용 합 니 다.
  • der 가 이 링크 html 를 찾 았 을 때 중국 어 는 모두 어 지 러 웠 습 니 다. 저 는 중국어 매 칭 을 포 기 했 습 니 다. 제 가 사용 하 는 어 리 석 은 방법 은 먼저 아버지 라벨 을 찾 고 img 라벨 을 찾 을 때 까지 차례대로 안 으로 들 어 가 는 것 입 니 다. 구체 적 인 경 로 는 다음 과 같 습 니 다
  • body 태그 -> wrapper -> container -> pagecontent -> maincontent -> post Content -> picture -> p (HTML 소스 코드 를 찾 아 보 세 요. 저 는 뒤에 세 개 만 사 용 했 습 니 다)
    匹配用到的正则表达式(我用id和class匹配):
    '.*?

    (.*?)

    ' 获取图片链接那段html代码 '.*?

    (.*?)

    ' 查阅上级获得的html中,picture那块代码 '' 从上一个表达式中,获取图片链接
  • 링크 에서 그림 이름 을 얻 는 것 도 정규 표현 식 에서 얻 는 것
  • '.*/(.*?.jpg)' 从图片链接中,提取图片名,这个是最简单的
    
  • 이미지 링크 를 열 고 로 컬 에서 파일 을 만 들 고 저장 합 니 다. 여 기 는 작은 기능 이 있 습 니 다. 나중에 업데이트 할 때 중복 다운로드 하지 않도록 보장 합 니 다
  • 判断文件时候存在,如果存在,不下载,节约时间
    如果文件不存在,下一步创建新文件,读写模式打开
    打开图片链接,将缓存写入到文件中
    关闭图片文件,完成
    

    이상 은 이 절 내용 이 실현 해 야 할 모든 기능 입 니 다. 다음 에 코드 를 붙 입 니 다.
    기능 코드
    여 기 는 기능 의 선후 순서에 따라 역순 으로 코드 를 붙 이지 만 코드 가 좀 길 어서 'def' 뒤에 주석 을 붙 일 게 요.
    #文件名:meizi_page_download
    import urllib2
    import os
    import re
    #loadurl()这个函数呢,是防打开链接超时,如果超时返回空字符,则主调函数会再次调用(while语句就可以实现),正常的话返回html代码,一个网页不算大,如果你的网络超级好,timeout可以缩短
    def loadurl(url):
        try:
            conn = urllib2.urlopen(url,timeout=5)
            html = conn.read()
            return html
        except urllib2.URLError:
            return ''
        except Exception:
            print("unkown exception in conn.read()")
            return ''
    #这里是图片保存的代码被调函数,timeout=5设置超时时间,一个500k不到的图片,5秒时间算长的了,超时的话,返回失败
    
    def download(url,filename):
        try:
            conn = urllib2.urlopen(url,timeout=5)
            f = open(filename,'wb')
            f.write(conn.read())
            f.close()
            return True
        except urllib2.URLError:
            print 'load',url,'error'
            return False
        except Exception:
            print("unkown exception in conn.read()")
            return ''
    
    #保存图片的逻辑代码块
    def save_pic(url,path):
        searchname = '.*/(.*?.jpg)'
        name = re.findall(searchname,url)
        filename = path +'/'+ name[0]
        
        print filename + ':start' #控制台显示信息
        #下面的代码,当下载成功,break跳出就好了,如果存在,直接结束这个函数
    
        #定义了在下载图片时遇到错误的重试次数
        tryTimes = 3
    
        #当重试次数没有用完时,则尝试下载
        while tryTimes != 0:
            tryTimes -= 1
            if os.path.exists(filename):
                print filename,' exists, skip'
                return True
            elif os.path.exists(filename):
                os.mknod(filename)
            if download(url,filename):
                break
    
        if tryTimes != 0:
            print(filename + ": over")
        else:
            print(url + " :Failed to download")
        #控制台显示信息
    
    #这个函数,相当于一个中介,我只是把for循环代码提出就得到了这个函数    
    def pic_list(picList,path):
        picurl = ''
        for picurl in picList:
            save_pic(picurl,path)
            
    #图片下载的主逻辑函数,获取图片链接,然后传给pic_list(),等结果(其实也没结果,就是等退出)
    def picurl(url,path):
        if os.path.exists(path):
            print path, 'exist'
        else:
            os.makedirs(path)
        html = ''
        while True:#这里和下载图片是一个道理,细看即可
            html = loadurl(url)
            if html == '':
                print 'load', url,'error'
                continue
            else:
                break
        #其实这里呢,也是后期发现的一个小bug,这个网站的前后代码有不同(目前而言发现的一处),在rePicContent1运行到后面,是匹配不到的,导致rePicList返回的结果也是空,也就造成了这个符号[0]报错,因为没有任何值,越界错误,单线程会在这里报错并停止运行。rePicContent2其实是我解决bug的另一个匹配正则式,被我发现的页面是这个--http://www.meizitu.com/a/454.html,有兴趣的去对比看看
        rePicContent1 = '.*?

    (.*?)

    ' rePicContent2 = '.*?

    (.*?)

    ' rePicList = '' #这里对re.S做个介绍,re.S是可以不添加的,加上之后,它的作用就是能忽略换行符,将两条作为一条来匹配。html代码碰上换行的概率是很高的,所以我一致采用re.S(下文有配图) picContent = re.findall(rePicContent1, html,re.S) if len(picContent) <=0: picContent = re.findall(rePicContent2, html,re.S) if len(picContent) <=0: print 'load false, over download this page and return' return False else: picList = re.findall(rePicList,picContent[0],re.S) pic_list(picList,path) #url = 'http://www.meizitu.com/a/454.html'这两行是我函数测试所用 #picurl(url,'/home/shiyanlou/Desktop/demo454')

    성명, 코드 를 실행 할 때 보험 은 중국 어 를 삽입 하지 마 십시오. 특히 Liux 환경 은 오 류 를 보고 하기 쉽 습 니 다. 또한 여기에 re. S 캡 처 (3 없 죠) 를 첨부 합 니 다.
    res
    코드 는 여기 서 끝 납 니 다. 밑 에 있 는 그림 은 링크 를 얻 고 저장 합 니 다. 완성 되 었 습 니 다. 실험 건물의 캡 처 한 장 을 동봉 합 니 다. (처음에 잘못 보 고 했 습 니 다. 두 번 째 면 됩 니 다. 실행 하기 전에 외부 네트워크 권한 이 있 는 지 확인 하 십시오. Firefox 로 사 이 트 를 보면 됩 니 다. 만약 에 소 용이 없다 면 본 컴퓨터 로 테스트 하 십시오)
    shiyanlou
    다음 실험 을 계속 하 세 요.
    Python 3 튜 토리 얼, 프로젝트 사이트 - 전송 문

    좋은 웹페이지 즐겨찾기