Python:保存页面动态图片
我需要通过编程的方式加载一个HTML页面的内容,这个页面里面有一张动态生成的图片。然后我想把这张图片下载并保存下来,保存的是在那个时刻页面加载时显示的样子。
HTML中图片的例子:
<img src="image.php">
问题是,我不能直接去获取这个PHP脚本的内容,地址是http://example.com/image.php
,因为它只会生成并返回另一张图片,而不是原页面中显示的那张。
那么,我该如何保存在那个页面中生成的图片呢?我知道不能使用webbrowser,因为它会打开一个实际的浏览器窗口。我在考虑使用zope.testbrowser或者mechanize,但我找不到相关的使用信息。
你们能帮我吗?
2 个回答
0
我还是个初学者,不过我用过BeautifulSoup这个工具,做过类似的事情,就是从一个网站上下载图片。
用这个库来获取图片应该很简单。
2
这个问题是用 mechanize、cookielib 和 urllib 解决的。
首先,设置导入的库和无头浏览器的处理程序:
# Mechanize headless
import mechanize
import cookielib
import urllib
# Browser
br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# Want debugging messages?
#br.set_debug_http(True)
#br.set_debug_redirects(True)
#br.set_debug_responses(True)
添加“人类”头信息,这样就不会被误认为是机器人了...
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
现在你可以像平常一样使用 open
方法“浏览”网页。动态图片也可以通过 open
加载。只需按照页面/文件的层级顺序操作,mechanize/cookielib 会为你处理头信息...
r = br.open('http://www.example.com/html-page-with-dynamic-image-embedded.html')
# Check if HTML content returned ok
if br.response().info()['Content-Type'] == 'text/html; charset=iso-8859-1':
# Now that the main page is loaded you can open the dynamic image
r = br.open('http://www.example.com/images/image.php')
# From here you just treat the image as you wish
png = r.read()
f = open('image-new-name.png', 'wb')
f.write(png)
f.close()
如果你需要发送 URL 的 GET 数据,就可以使用 urllib,像这样:
data = {'varName1': var1, 'varName2': var2, ...}
data = urllib.urlencode(data)
r = br.open('http://www.example.com/html-page-with-dynamic-image-embedded.html', data)