2

我编写了以下 Python 代码来从网站 www.style.com 抓取图像

 import urllib2, urllib, random, threading
 from bs4 import BeautifulSoup
 import sys
 reload(sys)
 sys.setdefaultencoding('utf-8')

 class Images(threading.Thread):
   def __init__(self, lock, src):
     threading.Thread.__init__(self)
     self.src = src
     self.lock = lock

   def run(self):
     self.lock.acquire()
     urllib.urlretrieve(self.src,'./img/'+str(random.choice(range(9999))))
     print self.src+'get'
     self.lock.release()

 def imgGreb():
   lock = threading.Lock()
   site_url = "http://www.style.com"
   html = urllib2.urlopen(site_url).read()
   soup = BeautifulSoup(html)
   img=soup.findAll(['img'])
   for i in img:
     print i.get('src')
     Images(lock, i.get('src')).start()

 if __name__ == '__main__':
   imgGreb()

但我得到了这个错误:

IOError:[Errno 2] 没有这样的文件或目录:'/images/homepage-2013-october/header/logo.png'

如何解决?

这也可以递归地找到网站中的所有图像吗?我的意思是其他不在主页上的图像。

谢谢!

4

1 回答 1

0
  1. 当您尝试检索 URL 时,您使用的是不带域的相对路径。
  2. 一些图像是基于 javascript 的,你会得到相对路径javascript:void(0);,你永远不会得到页面。我添加了try except以解决该错误。或者您可以巧妙地检测 URL 是否以结尾jpg/gif/png。我会为你工作:)
  3. 顺便说一句,不是所有的图片都包含在 URL 中,一些图片,Beautiful One,是使用 Javascript 调用的,我们无法使用urllib并且beautifulsoup只能做任何事情。如果你真的想挑战自己,也许你可以尝试学习Selenium,它是一个更强大的工具。

直接试试下面的代码:

import urllib2
from bs4 import BeautifulSoup
import sys
from urllib import urlretrieve
reload(sys)


def imgGreb():
    site_url = "http://www.style.com"
    html = urllib2.urlopen(site_url).read()
    soup = BeautifulSoup(html)
    img=soup.findAll(['img'])
    for i in img:
        try:
            # built the complete URL using the domain and relative url you scraped
            url = site_url + i.get('src')
            # get the file name 
            name = "result_" + url.split('/')[-1] 
            # detect if that is a type of pictures you want
            type = name.split('.')[-1]
            if type in ['jpg', 'png', 'gif']:
                # if so, retrieve the pictures
                urlretrieve(url, name)
        except:
            pass

if __name__ == '__main__':
    imgGreb()
于 2013-11-03T17:29:37.730 回答