1 층: 단일 페이지 다 중 그림 다운로드, 난이도 중간 -- wh 02
실험 설명
1.1. 환경 로그 인
비밀번호 없 이 자동 로그 인, 시스템 사용자 이름 shiyanlou
환경 소개
이 실험 환경 은 데스크 톱 이 있 는 Ubuntu Linux 환경 을 사용 합 니 다. 실험 에 서 는 데스크 톱 프로그램 을 사용 합 니 다.
1.3 환경 사용
GVim 편집기 로 실험 에 필요 한 코드 와 파일 을 입력 하고 Xfce 터미널 실행 에 필요 한 명령 을 사용 합 니 다.
실험 보고 서 는 개인 홈 페이지 에서 볼 수 있 습 니 다. 그 중에서 매번 실험의 캡 처 와 필기, 그리고 매번 실험의 효과 적 인 학습 시간 (실험 데스크 톱 에서 조작 하 는 시간 을 말 합 니 다. 조작 하지 않 으 면 시스템 은 멍 때 리 는 시간 으로 기록 합 니 다) 을 포함 합 니 다.이것들 은 모두 당신 이 배 운 진실성 증명 입 니 다.
실험 건물 가상 기 는 python 2. X 와 python 3. X 버 전 을 가지 고 있 으 며 설치 할 필요 가 없습니다. 이 실험 은 python 2 를 바탕 으로 합 니 다.
과정 소개
이 절 은 지난 절 에 언급 한 지식 포 인 트 를 이용 하여 단일 홈 페이지 의 그림 을 추출 하고 다운로드 하여 현지 에 다운로드 합 니 다.
기능 설명
의 형식 이지 만 이 몇 장 을 제외 하고 이 페이지 안의 다른 사진 도 img 라벨 을 사용 합 니 다. 모든 것 은 img 으로 만 일치 합 니 다. 정확 도 를 조절 하기 가 쉽 지 않 습 니 다. 또한 저 는 ubuntu 에서 spy
匹配用到的正则表达式(我用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 튜 토리 얼, 프로젝트 사이트 - 전송 문
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.