Скачивание pdf файлов с использованием mechanize и urllib - PullRequest
2 голосов
/ 03 августа 2011

Я новичок в Python, и моя текущая задача - написать веб-сканер, который ищет PDF-файлы на определенных веб-страницах и загружает их.Вот мой текущий подход (только для 1 образца URL):

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 ]

3 голосов
/ 03 августа 2011

Документация для urllib говорит об этой функции urlretrieve:

Второй аргумент, если имеется, указывает местоположение файла для копирования to (если отсутствует, местоположение будет временным файлом с сгенерированным именем).

Возвращаемое значение функции имеет местоположение файла:

Возвращает кортеж (имя файла, заголовки), где имя файла - локальный файл. имя, под которым можно найти объект, а заголовки Метод info () объекта, возвращаемого функцией urlopen () (для удаленный объект, возможно, кешируется).

Итак, измените эту строку:

urllib.urlretrieve(path)

к этому:

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

и путь в filename будет иметь местоположение. При необходимости передайте аргумент filename в urlretrieve, чтобы указать местоположение самостоятельно.

1 голос
/ 03 августа 2011

Я никогда не использовал механизировать, но из документации по urllib на http://docs.python.org/library/urllib.html:

urllib.urlretrieve (url [, имя файла [, reporthook [, data]]])

При необходимости скопируйте сетевой объект, обозначенный URL-адресом, в локальный файл.Если URL-адрес указывает на локальный файл или существует допустимая кэшированная копия объекта, объект не копируется.Вернуть кортеж (имя файла, заголовки), где имя файла - это имя локального файла, под которым можно найти объект, а заголовки - это любой метод info () объекта, возвращаемого функцией urlopen () (для удаленного объекта, возможно, кэшированного),Исключения те же, что и для urlopen ().

Как вы можете видеть, функция urlretrieve сохраняет во временный файл, если вы его не указали.Поэтому попробуйте указать имя файла, как вы предложили во втором фрагменте кода.В противном случае вы можете вызвать urlretrieve следующим образом:

    saved_filename,headers = urllib.urlretrieve(path)

, а затем позже использовать save_filename.

...