我一直试图自动化从某些网站下载图片的过程,人们告诉我使用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?
答案 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
。
把它放出循环。