Пакетная загрузка текста и изображений с URL-адреса с помощью Python/urllib/beautifulsoup?

Я просматривал несколько сообщений здесь, но я просто не могу понять, как пакетно загружать изображения и текст с заданного URL-адреса с помощью Python.

import urllib,urllib2
import urlparse
from BeautifulSoup import BeautifulSoup
import os, sys

def getAllImages(url):
    query = urllib2.Request(url)
    user_agent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)"
    query.add_header("User-Agent", user_agent)

    page = BeautifulSoup(urllib2.urlopen(query))
    for div in page.findAll("div", {"class": "thumbnail"}):
        print "found thumbnail"
        for img in div.findAll("img"):
            print "found image"
            src = img["src"]
            if src:
                src = absolutize(src, pageurl)
                f = open(src,'wb')
                f.write(urllib.urlopen(src).read())
                f.close()
        for h5 in div.findAll("h5"):
            print "found Headline"
            value = (h5.contents[0])
            print >> headlines.txt, value


def main():
    getAllImages("http://www.nytimes.com/")

Выше теперь обновленный код. Что происходит, ничего. Код не может найти какой-либо div с миниатюрой, очевидно, ничего не получается ни в одной печати .... Так что, возможно, мне не хватает некоторых указателей при переходе к нужным div, содержащим изображения и заголовки?

Большое спасибо!


person birgit    schedule 27.10.2011    source источник
comment
Вы можете получить более подробные ответы, если объясните, с какими именно проблемами вы сталкиваетесь при попытке загрузить файл. Читали ли вы такие сообщения, как stackoverflow. com/questions/3042757/, которые содержат код для загрузки изображений в своих ответах?   -  person Martey    schedule 27.10.2011


Ответы (1)


Используемая вами ОС не знает, как записать путь к файлу, который вы передаете в src. Убедитесь, что имя, которое вы используете для сохранения файла на диск, действительно может использовать ОС:

src = "abc.com/alpha/beta/charlie.jpg"
with open(src, "wb") as f:
    # IOError - cannot open file abc.com/alpha/beta/charlie.jpg

src = "alpha/beta/charlie.jpg"
os.makedirs(os.path.dirname(src))
with open(src, "wb" as f:
    # Golden - write file here

и все начнет работать.

Пара дополнительных мыслей:

  1. Обязательно нормализуйте путь к файлу сохранения (например, os.path.join(some_root_dir, *relative_file_path*)) — иначе вы будете записывать изображения по всему жесткому диску в зависимости от их src.
  2. Если вы не проводите какие-либо тесты, хорошо объявить, что вы бот, в своей user_agent строке и соблюдать robots.txt файлы (или, в качестве альтернативы, предоставить какую-то контактную информацию, чтобы люди могли попросить вас остановиться, если им это нужно).
person Sean Vieira    schedule 27.10.2011
comment
Большое спасибо за быстрый ответ, к сожалению, после того, как я изменил эту строку, я все равно не получил никакого результата. Запуск кода просто ничего не дает.... :( - person birgit; 27.10.2011
comment
Трассировка (последний последний вызов): Файл test.py, строка 40, в ‹module› main() Файл test.py, строка 35, в main call = getAllImages(nytimes.com/) Файл test.py, строка 21, в getAllImages f = open(src,'wb') IOError: [Errno 2] Нет такого файла или каталога : u'i1.nyt.com/images /2011/10/27/us/cain1/cain1-thumbStandard.jpg' ..... это тот момент, когда нормализация части вступает в игру!? - person birgit; 27.10.2011
comment
@ user1016690 - да, я об этом и говорил. Вы пытаетесь открыть файл на своем жестком диске по адресу http://i1.nyt.com/images/2011/10/27/us/cain1/cain1-thumbStandard.jpg ... и ОС обоснованно жалуется, что нет доступного для записи устройства с именем http://. :-) - person Sean Vieira; 27.10.2011
comment
BeautifulSoup4 прекрасно справляется с файлоподобными объектами. Просто говорю'. - person Martijn Pieters; 19.06.2014
comment
@Martijn - смеется да, действительно так. Обновлено для устранения фактической причины проблемы. Спасибо, что помогли сделать ответ лучше! - person Sean Vieira; 19.06.2014