ImageGrabbing


Внимание! Информация предоставлена исключительно с целью ознакомления. За использование материалов статьи в противозаконных целях автор ответственности не несет.

Рассмотрим создание скрипта на питоне для граббинга картинок с сайта. Объект моих преследований – сайт мебельной фабрики «Витра». Первый скрипт собирает ссылки на картинки и помещает их в файл.

Ниже код с комментариями.

import urllib
import re
import string

#сайт для граббинга
link = 'http://vitra-mebel.ru'
#элементы ссылок, по которым не нужно переходить
bad = ['mailto:','javascript:', 'http://', '?', '.']

#получаем текст по ссылке
def getpage(link):
    res = urllib.urlopen(link).read()
    return res

#функция проверки ссылки - запрещенная для перехода или нет
def isbad(st):
    global bad
    res = True
    for badword in bad:
        #
        if string.count(st, badword) > 0:
            res = False
    return res

#получение из текста других ссылок
def getlinks(link):
    res = []
    page = getpage(link)
    #регулярное выражение ссылки
    links = re.findall(r"<a href="([^"#]+)", page)
    for i in xrange(len(links)):
        #исключение ненужных ссылок
        if isbad(links[i]):
            res.append(links[i])
    res = list(set(res))
    return res

#получение адресов jpg-картинок из текста странички
def getimageslink(link):
    res = []
    page = getpage(link)
    #регулярное выражение для jpg-картинки
    links = re.findall(r"<img src="([^"#]+.jpg)", page)
    for i in xrange(len(links)):
        res.append(links[i])
    return res

#массив ссылок на картинки
images = []
#массив ссылок, с которых уже собрали другие ссылки и картинки
passed = ['/']
#получаем ссылки с главной страницы
links = getlinks(link)
#пока ссылки не закончатся
while len(links) > 0:
    #извлекаем ссылку
    cur_link = links.pop()
    print cur_link
    #собираем с нее картинки
    new_img = getimageslink(link + cur_link)
    #добавляем неповторяющиеся картинки в массив картинок
    images = list( set(images) | set(new_img) )
    #если ссылка не отмечена как пройденная
    if cur_link not in passed:
        #помещаем ее в массив отработанных ссылок
        passed.append(cur_link)
        #получаем ссылки
        newlinks = getlinks(link+cur_link)
        #отсеиваем отработанные ссылки
        newlinks = [item for item in newlinks if item not in passed]
        #добавляем в массив ссылок - ставим на очередь
        links = list( set(links) | set(newlinks) )

#сохраняем ссылки картинок в файл
f = open('links.txt', 'w')
for img in images:
    f.write(img+'n')
f.close()

Данный скрипт легко можно переделать под генератор карты сайта.

Жду комментариев.

P.S. Сразу скажу что код не идеальный:

  1. Каждая страница загружается по 2-а раза.
  2. Не использована многопоточность.
  3. Не использованы прокси.

, ,



  1. #1 by Юрий on 27 Июль 2010 - 18:28

    А зачем в функции isbad вы объявляете список bad как global. Можно было его так и не объявлять.

(никто не узнает)