Внимание! Информация предоставлена исключительно с целью ознакомления. За использование материалов статьи в противозаконных целях автор ответственности не несет.
Рассмотрим создание скрипта на питоне для граббинга картинок с сайта. Объект моих преследований – сайт мебельной фабрики «Витра». Первый скрипт собирает ссылки на картинки и помещает их в файл.
Ниже код с комментариями.
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. Сразу скажу что код не идеальный:
- Каждая страница загружается по 2-а раза.
- Не использована многопоточность.
- Не использованы прокси.

#1 by Юрий on 27 Июль 2010 - 18:28
А зачем в функции isbad вы объявляете список bad как global. Можно было его так и не объявлять.
#2 by toly on 27 Июль 2010 - 18:36
на всякий случай