使用mechanize和urllib下载pdf文件

时间:2011-08-03 18:29:36

标签: python eclipse web-crawler mechanize urllib

我是Python新手,我目前的任务是编写一个网络抓取工具,在某些网页中查找PDF文件并下载它们。这是我目前的方法(仅适用于1个样本网址):

import mechanize
import urllib
import sys

mech = mechanize.Browser()
mech.set_handle_robots(False)

url = "http://www.xyz.com"

try:
    mech.open(url, timeout = 30.0)
except HTTPError, e:
    sys.exit("%d: %s" % (e.code, e.msg))

links = mech.links()

for l in links:
    #Some are relative links
    path = str(l.base_url[:-1])+str(l.url)
    if path.find(".pdf") > 0:
       urllib.urlretrieve(path)

该程序运行没有任何错误,但我没有看到pdf被保存在任何地方。我可以访问pdf并通过浏览器保存。有什么想法发生了什么?我使用pydev(基于eclipse)作为我的开发环境,如果这有任何区别。

另一个问题是,如果我想在保存时给出pdf特定名称,我该怎么做?这种方法是否正确?在保存PDF之前,我是否必须使用“文件名”创建文件?

urllib.urlretrieve(path, filename) 

提前致谢。

2 个答案:

答案 0 :(得分:3)

urllib的文档说明了urlretrieve函数:

  

第二个参数(如果存在)指定要复制的文件位置   to(如果不存在,该位置将是具有生成名称的临时文件)。

函数的返回值具有文件的位置:

  

返回一个元组(文件名,标题),其中filename是本地文件   可以在其下找到对象的名称,以及标题   返回urlopen()返回的对象的info()方法(对于a   远程对象,可能已缓存)。

所以,改变这一行:

urllib.urlretrieve(path)

到此:

(filename, headers) = urllib.urlretrieve(path)

并且filename中的路径将具有该位置。 (可选)将filename参数传递给urlretrieve以自行指定位置。

答案 1 :(得分:1)

我从未使用过机械,但是来自http://docs.python.org/library/urllib.html的urllib文档:

  

urllib.urlretrieve(url [,filename [,reporthook [,data]]])

     

将URL表示的网络对象复制到本地文件,如果   必要。如果URL指向本地文件或有效的缓存副本   如果对象存在,则不复制对象。返回一个元组   (filename,headers)其中filename是本地文件名   可以找到该对象,并且header是info()方法的任何内容   urlopen()返回的对象返回(对于远程对象,   可能已缓存)。例外与urlopen()相同。

如您未指定的那样,您可以看到urlretrieve函数保存到临时文件。因此,请尝试按照第二段代码中的建议指定文件名。否则你可以像这样打电话给urlretrieve:

    saved_filename,headers = urllib.urlretrieve(path)

然后稍后使用saved_filename。