2017-01-30 5 views
0

Я пытался автоматизировать процесс загрузки изображений с определенных сайтов, и люди сказали мне использовать Python. Страницы сайта находятся в формате http://site/... /number.html.Выход из цикла, когда последний файл является дубликатом текущего файла

склеивание вещи из разных источников, я закончил с this-

import os 
import urllib 
from urllib import urlopen 
import BeautifulSoup 
from BeautifulSoup import BeautifulSoup 
import urllib2 
import requests 
import re 
import hashlib 

def md5(fname): 
    hash_md5 = hashlib.md5() 
    with open(fname, "rb") as f: 
     for chunk in iter(lambda: f.read(4096), b""): 
      hash_md5.update(chunk) 
    return hash_md5.hexdigest() 

url = input() 
usplit = re.split('/|\.', url) 
title = usplit[5] 
volume = None 

if (usplit[6][0] == 'v'): 
    volume = usplit[6] 
    chapter = usplit[7] 
    pg_no = int(usplit[8]) 
else: 
    chapter = usplit[6] 
    pg_no = int(usplit[7]) 

if (volume is not None): 
    mpath = ".\\" + title + "\\" + volume + "\\" + chapter 
    if not os.path.isdir(mpath): 
     os.makedirs(mpath) 
else: 
    mpath = ".\\" + title + "\\" + chapter 
    if not os.path.isdir(mpath): 
     os.makedirs(mpath) 

while (1): 
    flg = 0 
    r = requests.get(url) 
    if (r.status_code!=200): 
     print "Exception: Access!" 
     exit() 
    print "Getting content from " + url 
    html = r.content 
    page = BeautifulSoup(html) 
    image = page.findAll('img')[0]['src'] 
    res = urllib.urlopen (image) 
    prevfile = mpath + "\\" + str(pg_no-1) + ".jpg" 
    file = mpath + "\\" + str(pg_no) + ".jpg" 
    if (not (os.path.isfile(file))): 
     print "Writing to... " + file 
     output = open(file,"wb") 
     output.write(res.read()) 
     output.close() 
     if (flg==1): 
      if (md5(file) == md5(prevfile)): 
       print "All done!" 
       exit() 
     print "Done." 
    else: 
     print str(pg_no) + ".jpg already exists, skipping..." 
    flg = 1 
    pg_no+=1 
    if (volume is not None): 
     newurl = usplit[0] + "//" + usplit[2] + "." + usplit[3] + "/" + usplit[4] + "/" + title + "/" + volume + "/" + chapter + "/" + str(pg_no) + "." + usplit[9] 
    else: 
     newurl = usplit[0] + "//" + usplit[2] + "." + usplit[3] + "/" + usplit[4] + "/" + title + "/" + chapter + "/" + str(pg_no) + "." + usplit[8] 
    url = newurl 

Проблема в том, после того, как я достигну последнего изображение, сайт перенаправляет меня к последней действительной странице. То есть, если 46.html является последней страницей, запрос на 47.html перенаправляется на него, а r.status_code остается неизменным. Чтобы обойти это, я попытался сравнить последний загруженный файл и текущий файл и завершить работу программы. Однако это не работает. Я новичок в этом и не знаю, как сравнивать файлы, а функция md5 - это то, что я нашел here. Я тоже пытался использовать filecmp, но он тоже не работает.

Любые предложения? Кроме того, что касается кода, есть ли что-нибудь, что может быть сделано более Python-y?

ответ

0

Повторное определение flg. Положите его из петли.

1

Предполагая, что содержание HTML этих сайтов не является идентичным вы могли бы сравнить содержание:

import requests 

r = requests.get("http://site/... /46.html") 
next = requests.get("http://site/... /47.html") 
if r.content == next.content: 
    print("Site visited already") 

Если вы хотите, чтобы разорвать петлю времени, вы можете использовать оператор разрыва.