我是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)
提前致谢。
答案 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。