昨天的脚本(这里)在公司的XP系统下调试通过了,不知道为什么在我的Vista下还有点问题。
以下是一些总结:
1。 批量参数化图片地址
注意到我们请求地址一般是http://photography.nationalgeographic.com/ngs_pod_ext/searchPOD.jsp?month=09&day=04&year=2009&page=
然后页面会自动跳转,返回你所请求的日期所对应的图片,这里是2009 09 04.对于特定的一天,可以直接修改月和天去得到当天的图片,但是在处理一系列图片时候,比如我想拿到某年国家地理所有的图片,就必须同时参数化月和天,其中月在(1,13)之间,天在(1, 32)之间,这个时候我一直不知道该怎么去操作,在chinaunix问了,也没人理我,估计是因为问题太简单。。。后来无意中看到print [(x, y) for x in range(3) for y in range(3)],我才恍然大悟,原来是这么用的,于是就得到了下面的代码:
urltemplate = 'http://photography.nationalgeographic.com/ngs_pod_ext/searchPOD.jsp?month=%d&day=%d&year=2009&page='
urlList = [urltemplate %(month, day) for month in range(1, 13) for day in range(1, 32)]
注意:这里会出现日期和月不匹配的情况,比如2月会和30,31匹配,但我试了试,日期和月份不匹配,国家地理网站会自动跳转到一个正确的页面,比如下一个月1号。所以不影响取图片。
我的脚本只是取今年(2009)年的,于是我们还可以引申,可以把国家地理历年来的每日图片都取回来,上网搜索了一下,国家地理每日图片是从2001年开始的,我们可以继续优化得到以下的代码:
urltemplate = 'http://photography.nationalgeographic.com/ngs_pod_ext/searchPOD.jsp?month=%d&day=%d&year=%d&page='
urlList = [urltemplate %(month, day, year) for month in range(1, 13) for day in range(1, 32) for year in range(2001, 2010)]
2。用正则表达式匹配得到的图片URL
研究几个发现,一般都是在/staticfiles/NGS/Shared/StaticFiles/Photography/Images/POD/下,然后文件的后面都是-ga.jpg,如此便很方便的得到正则表达式如下:
imgre = '<img alt="(?P<alt>[^"]*)" src="(?P<src>/staticfiles/NGS/Shared/StaticFiles/Photography/Images/POD/.+?-ga.jpg)">'
3,保存图片
一般利用urllib.urlretrieve()方法。