在本地托管图像HTML页面,通过网络爬虫访问并下载图像
我用Python写了一个网络爬虫,它可以访问网页并下载网页上的图片。爬虫的代码是:
# ImageDownloader.py
# Finds and downloads all images from any given URL.
import urllib2
import re from os.path
import basename from urlparse
import urlsplit
url = "http://www.yahoo.com"
urlContent = urllib2.urlopen(url).read()
# HTML image tag: <img src="url" alt="some_text"/>
imgUrls = re.findall('img.*?src="(.*?)"', urlContent)
# download all images
for imgUrl in imgUrls:
try:
imgData = urllib2.urlopen(imgUrl).read()
fileName = basename(urlsplit(imgUrl)[2])
output = open(fileName,'wb')
output.write(imgData)
output.close()
except:
pass
因为我需要在课堂上做个演示,所以我搭建了一个简单的网页,上面有一些图片,并把它放在了localhost
上。但是我写的这个爬虫却无法访问这个HTML页面,也无法下载图片。
有没有人能帮我解决一下,怎么让爬虫从localhost
访问这个HTML页面呢?
3 个回答
0
在GitHub上复制这个项目,然后加一些代码,比如检查链接里有没有像[".jpg", ".png"等]这样的文件后缀,这样就可以找到图片并下载它们 :)
https://github.com/mouuff/MouCrawler/blob/master/moucrawler.py
0
你的正则表达式应该是 img.+?src=(.+?)"
。一旦我把它改了,findall()
就返回了一个漂亮的图片网址列表,结果我的文件夹里满是图片。
不过,还是要听听 @knutin 的建议,特别是使用 BeautifulSoup 而不是正则表达式。虽然这里的正则表达式能用,但可能不够强大,无法处理你给它的所有 HTML。我最近自己也在做一些 HTML 数据抓取(没那么简单,主要是图片),结果非常顺利。
1
你需要把你的脚本指向本地服务器,而不是“www.yahoo.com”。
说到这里,有几个方面可以让这个程序更好:
不要盲目捕捉错误后就不处理。应该让错误向上抛出,或者做一些有用的事情。
对于像这样的简单脚本,可以创建一个函数来完成你的工作,然后在
if __name__ == '__main__':
这个块中调用它。与其用正则表达式来查找图片,不如使用 BeautifulSoup,这样可以让你的程序更有结构,不过这可能不是必需的。
图片通常是通过 CSS 加入的,所以也可以去看看那部分。