当最后一个文件与当前文件

时间:2017-01-30 19:17:12

标签: python python-2.7 web-scraping comparison

我一直试图自动化从某些网站下载图片的过程,人们告诉我使用Python。该网站的网页格式为http://site/... /number.html

将来自不同来源的东西拼凑起来,我最终得到了这个 -

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?

2 个答案:

答案 0 :(得分: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")

如果要打破while循环,可以使用break语句。

答案 1 :(得分:0)

您反复定义flg。 把它放出循环。