Форум сайта python.su
0
Пишу парсер, который должен вытащить с сайта все картинки. Начал с конца. Написал сначала последнюю часть в которой картинки сохраняются на диск с теми же путями как у донора.
А вот с первой частью возникли вопросы.
Нужно проходить по странице, собирать ссылки на изображения и добавлять их либо в список, либо записывать в файл - это не проблема.
Нужно собирать ссылки на другие страницы сайта и пробегаться по ним. Собрать ссылки со страницы тоже не проблема.
Хочу получить совет как организовать логику парсера. Я сейчас смутно вижу задачу так:
- собираю нужные данные с текущей страницы
- собираю ссылки со страницы, добавляю их в кортеж или список (“Белый список”)
- заношу текущую страницу в (“Черный список”)
- затем беру первый элемент из белого списка и определяю нет ли его в черном списке, если нет, то загружаю документ по этому урлу
- повторяю процесс.
Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее. Я только учу Питон, и хотелось бы совместить одно полезное с другим.
Офлайн
9
psyhВ оф. доках Scrappy есть отличный туториал для новичков, который охватывает описанные вопросы. За вечер разберетесь или даже быстрее.
Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее. Я только учу Питон, и хотелось бы совместить одно полезное с другим.
Офлайн
103
psyhзачем?
- собираю ссылки со страницы, добавляю их в кортеж или список (“Белый список”)
- заношу текущую страницу в (“Черный список”)
psyhlxml.html
Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее.
Офлайн
0
terabaytТакой цикл будет бесконечным. Нужно же отсекать страницы которые уже спарсены.
в один список добавили и циклом по всем ссылкам
Офлайн
103
psyh
Такой цикл будет бесконечным. Нужно же отсекать страницы которые уже спарсены.
>>> import lxml.html >>> >>> p = lxml.html.parse('http://python.su/') >>> for i in p.xpath('//a[@class="topic"]'): ... print i.attrib['href'] ... # а дальше заходим по ссылке и вытягиваем все изображения ... /blogs/python/196-pycon-russia-2015/ /blogs/personal/177-video-s-devconf-2014/ /blogs/sitenews/176-6-aya-konferentsiya-devconf-2015/ /blogs/personal/136-piter-py-vtoraya-python-konferentsiya-na-neve/ /blogs/personal/114-devconfpython-2014-14-iyunya-golosuem-za-interesnyie-dokladyi-po-python/ /blogs/personal/113-pycon-russia-2014-opublikovana-programma-/ /blogs/personal/106-piter-py-pervaya-python-konferentsiya-na-neve/ /blogs/personal/103-python-devday/ /blogs/personal/71-inversion-of-control-v-veb-frejmvorkah/ /blogs/personal/54-oprosyi-cherez-e-mail/
Офлайн
24
Он о другом. Если сайт хорошо перелинкован, то он будет ходить по ссылкам по которым уже проходил.
Ссылки можно записывать в set. Тогда не нужно будет проверять, посещал скрипт эту страницу или нет.
Офлайн
0
terabayt Я как-то так же сделал, другими модулями.
from bs4 import BeautifulSoup from urllib.request import urlopen html_doc = urlopen('http://python.su/').read() soup = BeautifulSoup(html_doc, "html.parser") # for img in soup.find_all('img'): # print (img.get('src')) links = [] for link in soup.find_all('a'): print (link.get('href')) links.append(link.get('href'))
aybЧто такое set?
Ссылки можно записывать в set
Отредактировано psyh (Авг. 11, 2015 20:57:01)
Офлайн
24
set - набор уникальных элементов. В Вашем случае это будет список уникальных адресов. Ограничение по памяти есть ?
Офлайн
103
psyhну если делать так
Как сказал ayb ссылки будут добавляться бесконечно и цикл будет бесконечным.
for link in soup.find_all('a'): print (link.get('href')) links.append(link.get('href'))
psyhметодом тыка?!
Кроме того написать самому было бы интереснее.
Отредактировано terabayt (Авг. 11, 2015 21:56:46)
Офлайн
0
ayb На домашнем компе собираюсь запустить, памяти думаю хватит. Почитал про set, кажется то что нужно.
Если бы можно было добавлять новые элементы множества именно в конец, и обращаться к n-ному элементу множества, то я представляю как сделать все с один множеством. Иначе нужно делать два списка - черный и белый.
terabayt
terabaytМожно, если не добавить проверку домена.
то так можно и полинтернета спарсить
terabaytСобственно про логику я и сапрашивал в самом начале. Альтернативного варианта пока не услышал.
а так все это говорит что очень плохо продумана логика!
Офлайн