博客园博客中的图片怎么用python爬取下来?

写了一小段代码,爬取博客园博客中的图片,这段代码对部分链接有效,还有一部分链接一爬就报错,这是什么原因呢?

#coding=utf-8

import urllib
import re
from lxml import etree

#解析地址
def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

#获取地址并建树
url = "http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html"
html = getHtml(url)
html = html.decode("utf-8")
tree = etree.HTML(html)

#保存图片至本地
reg = r'src="(.*?)" alt'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
    urllib.urlretrieve(imgurl, '%s.jpg' % x)
    x += 1

如图,可以正确爬取图片
clipboard.png

若把url换为

url = "http://www.cnblogs.com/baronzhang/p/6861258.html"

则立马报错

clipboard.png

求解决,谢谢!

阅读 3.8k
2 个回答

错误提示已经很明显了,你去看下网页源代码,匹配到的第一张图片是一个GIF格式的,并且还是相对路径,所以你是下载不到的,故提示IOerror,就算你下载到了,因为你指定了格式为JPG,你也打不开。 因此你需要做的就是判断和筛选

for imgurl in imglist:
    if "gif" not in imgurl:
        urllib.urlretrieve(imgurl, '%s.jpg' % x)
        x += 1

看下我增加的地方,当然这只是最简单的判断,但可以保证你第二个程序不会报错,也是给你一个思路!

上面回答的很正确,但是我有个疑问
import urllib
import re
from lxml import etree #这里是想用xpath
def getHtml(url):

page = urllib.urlopen(url)
html = page.read()
return html

url = "http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html"
html = getHtml(url)
html = html.decode("utf-8")
tree = etree.HTML(html) #但是这里并没有用xpath解析啊,你用的是正则匹配
reg = r'src="(.*?)" alt'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:

urllib.urlretrieve(imgurl, '%s.jpg' % x)
x += 1
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题