我正在尝试创建一个擦除网页并下载找到的所有图像文件的脚本。
我的第一个函数是一个wget函数,它读取网页并将其分配给变量。 我的第二个功能是一个RegEx,用于搜索' ssrc ='在网页html中,下面是功能:
def find_image(text):
'''Find .gif, .jpg and .bmp files'''
documents = re.findall(r'\ssrc="([^"]+)"', text)
count = len(documents)
print "[+] Total number of file's found: %s" % count
return '\n'.join([str(x) for x in documents])
这样的输出是这样的:
example.jpg
image.gif
http://www.webpage.com/example/file01.bmp
我正在尝试使用urllib.urlretrieve(url,filename)编写第三个下载这些文件的函数,但我不知道如何解决这个问题,主要是因为某些输出是绝对路径,而其他路径是相对的。我也不确定如何同时下载所有内容并下载,而无需每次都指定名称和位置。
答案 0 :(得分:0)
获取资源的路径不可知(可以处理绝对/相对路径) -
from bs4 import BeautifulSoup as bs
import urlparse
from urllib2 import urlopen
from urllib import urlretrieve
import os
def fetch_url(url, out_folder="test/"):
"""Downloads all the images at 'url' to /test/"""
soup = bs(urlopen(url))
parsed = list(urlparse.urlparse(url))
for image in soup.findAll("img"):
print "Image: %(src)s" % image
filename = image["src"].split("/")[-1]
parsed[2] = image["src"]
outpath = os.path.join(out_folder, filename)
if image["src"].lower().startswith("http"):
urlretrieve(image["src"], outpath)
else:
urlretrieve(urlparse.urlunparse(parsed), outpath)
fetch_url('http://www.w3schools.com/html/')
答案 1 :(得分:0)
我无法给你写完整的代码,我确信这不是你想要的,但这里有一些提示:
1)不用正则表达式解析随机HTML页面,有很多解析器。我建议BeautifulSoup。您将过滤所有img
元素并获取其src
值。
2)手头有src
个值,您可以按照自己的方式下载文件。关于相对/绝对问题,请按this SO answer使用urlparse
模块。我们的想法是将图像的src
加入您下载HTML的网址。如果src
已经是绝对的,它将保持这种状态。
3)至于全部下载,只需遍历要从中下载图像的网页列表,并为每个页面中的每个图像执行步骤1和2。当你说“同时”时,你可能意味着异步下载它们。在这种情况下,我建议下载每个网页in one thread。