使用Python Mechanize下载图片

4 投票
4 回答
8421 浏览
提问于 2025-04-17 20:06

我正在尝试写一个Python脚本来下载一张图片,并把它设置为我的桌面壁纸。不幸的是,Mechanize的文档写得很糟糕。我的脚本能够正确地跟随链接,但我在把图片保存到电脑上时遇到了困难。根据我的研究,.retrieve()这个方法应该可以完成这个任务,但我该怎么指定文件下载到哪个路径呢?以下是我现在的代码...

def followLink(browser, fixedLink):
    browser.open(fixedLink)

if browser.find_link(url_regex = r'1600x1200'):

    browser.follow_link(url_regex = r'1600x1200')

elif browser.find_link(url_regex = r'1400x1050'):

    browser.follow_link(url_regex = r'1400x1050')

elif browser.find_link(url_regex = r'1280x960'):

    browser.follow_link(url_regex = r'1280x960')

 return

4 个回答

3

你可以通过打开图片的链接来获取或下载这张图片。

image_response = browser.open_novisit(img['src'])

现在要保存这个文件,只需要用 fopen 函数:

with open('image_out.png', 'wb') as f:
    f.write(image_response.read())
5

不知道为什么这个解决方案没被提到,但你可以使用 mechanize.Browser.retrieve 这个函数。也许这个方法只在新版的 mechanize 中有效,所以没被提到过?

无论如何,如果你想简化 zhangyangyu 的回答,可以这样做:

import mechanize, os
from BeautifulSoup import BeautifulSoup

browser = mechanize.Browser()
html = browser.open(url)
soup = BeautifulSoup(html)
image_tags = soup.findAll('img')
for image in image_tags:
    filename = image['src'].lstrip('http://')
    filename = os.path.join(dir, filename.replace('/', '_'))
    browser.retrieve(image['src'], filename)
    browser.back()

另外,记得把这些代码放进一个 try except 块里,像这样:

import mechanize, os
from BeautifulSoup import BeautifulSoup

browser = mechanize.Browser()
html = browser.open(url)
soup = BeautifulSoup(html)
image_tags = soup.findAll('img')
for image in image_tags:
    filename = image['src'].lstrip('http://')
    filename = os.path.join(dir, filename.replace('/', '_'))
    try:
        browser.retrieve(image['src'], filename)
        browser.back()
    except (mechanize.HTTPError,mechanize.URLError) as e:
        pass
        # Use e.code and e.read() with HTTPError
        # Use e.reason.args with URLError

当然,你需要根据自己的需求来调整这些代码。也许你希望在遇到问题时程序直接停止。这完全取决于你想要实现的目标。

9
import mechanize, os
from BeautifulSoup import BeautifulSoup

browser = mechanize.Browser()
html = browser.open(url)
soup = BeautifulSoup(html)
image_tags = soup.findAll('img')
for image in image_tags:
    filename = image['src'].lstrip('http://')
    filename = os.path.join(dir, filename.replace('/', '_'))
    data = browser.open(image['src']).read()
    browser.back()
    save = open(filename, 'wb')
    save.write(data)
    save.close()

这个方法可以帮助你从一个网页上下载所有的图片。关于解析HTML内容,最好使用BeautifulSoup或者lxml这两个工具。而下载的过程其实就是读取数据,然后把它写入到你电脑上的一个文件里。你需要给dir这个变量赋一个你自己的值,它就是你存放图片的地方。

撰写回答