有了一堆数据后,现在可以把影片详细页面做得更详细一点了。
首先能想到的,就是加上影片的海报。在从豆瓣获取的数据里,有一项 image,就是影片海报图片的地址。如:
http://img4.douban.com/view/movie_poster_cover/lpst/public/p1910830216.jpg
把地址贴在浏览器中,就可以看到海报图片。
HTML 里显示图片的语法是:
<img src="图片地址">
于是,在模板 movie.html 里增加:
<img src="$movie.image">
保存后刷新页面。结果,并没有如我们所愿看到影片的海报图片。把 src 换成其他一些网络图片的地址,是可以正常显示的。这里代码并没有错,问题的原因在于豆瓣的图片限制了从外部网站直接访问,也就是通常说的“防盗链”。
既然如此,那我只好选择另一种方法:把电影海报图片抓到本地,之后页面上直接显示自身服务器上的图片。
基本思路就是,从已经拿到的数据库信息中,依次取出海报地址,访问后将其保存为本地文件,以影片 id 命名。页面上,通过 id 拼出图片的文件名,将其显示。(这里,因为我已经检验过所有图片格式均为 jpg,所以可以直接这么做,如果海报有多种图片格式,那么仅通过 id 来拼文件名是不够的。)
下载图片的方法:
def get_poster(id, url): pic = urllib.urlopen(url).read() file_name = 'poster/%d.jpg' % id f = file(file_name, "wb") f.write(pic) f.close()
file 里的 wb 参数表示以二进制的方式写入文件。在调用此方法时,需确保当前目录下有一个叫做 poster 的目录,不然程序是没有办法访问到文件的。
db = web.database(dbn='sqlite', db='MovieSite.db') movies = db.select('movie') count = 0 for movie in movies: get_poster(movie.id, movie.image) count += 1 print count, movie.title time.sleep(2)
从数据库里取出 id 和海报图片地址,循环抓取,每次输出进度和标题,并休息 2 秒钟。
运行抓取程序,下载完所有图片之后,修改一下 movie.html,加入一行:
<img src="/static/poster/$(movie.id).jpg">
这里有两件事需要注意:
首先是图片的路径。这里要在页面上直接使用文件而不是代码,这被称作静态文件访问。在 web.py 里,默认是以 static 作为静态文件目录。因此,必须把存放图片的 poster 文件夹扔到 static 目录下面。static 目录本身是在服务器根目录,也就是和 code.py 在一个目录下。
其次是 $(movie.id).jpg。这里如果不加括号,代码则会将 .jpg 理解为取参数 movie.id.jpg 的值。所以要用括号来区分。
好了,我们的网站终于不再是一个纯文字网站了。
someweb-6-movie.html
(208 Bytes, 下载次数: 138)
get_poster.py
(409 Bytes, 下载次数: 146)
|