Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 11, 2015 14:01:39

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

Пишу парсер, который должен вытащить с сайта все картинки. Начал с конца. Написал сначала последнюю часть в которой картинки сохраняются на диск с теми же путями как у донора.
А вот с первой частью возникли вопросы.
Нужно проходить по странице, собирать ссылки на изображения и добавлять их либо в список, либо записывать в файл - это не проблема.
Нужно собирать ссылки на другие страницы сайта и пробегаться по ним. Собрать ссылки со страницы тоже не проблема.
Хочу получить совет как организовать логику парсера. Я сейчас смутно вижу задачу так:
- собираю нужные данные с текущей страницы
- собираю ссылки со страницы, добавляю их в кортеж или список (“Белый список”)
- заношу текущую страницу в (“Черный список”)
- затем беру первый элемент из белого списка и определяю нет ли его в черном списке, если нет, то загружаю документ по этому урлу
- повторяю процесс.

Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее. Я только учу Питон, и хотелось бы совместить одно полезное с другим.

Офлайн

#2 Авг. 11, 2015 15:51:44

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

psyh
Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее. Я только учу Питон, и хотелось бы совместить одно полезное с другим.
В оф. доках Scrappy есть отличный туториал для новичков, который охватывает описанные вопросы. За вечер разберетесь или даже быстрее.

Офлайн

#3 Авг. 11, 2015 19:09:05

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

psyh
- собираю ссылки со страницы, добавляю их в кортеж или список (“Белый список”)
- заношу текущую страницу в (“Черный список”)
зачем?
в один список добавили и циклом по всем ссылкам
psyh
Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее.
lxml.html
вполне будет достаточно



————————————————
-*- Simple is better than complex -*-

Офлайн

#4 Авг. 11, 2015 19:48:01

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

terabayt
в один список добавили и циклом по всем ссылкам
Такой цикл будет бесконечным. Нужно же отсекать страницы которые уже спарсены.

Офлайн

#5 Авг. 11, 2015 20:01:41

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

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/
вам бы основы почитать…



————————————————
-*- Simple is better than complex -*-

Офлайн

#6 Авг. 11, 2015 20:12:52

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

Он о другом. Если сайт хорошо перелинкован, то он будет ходить по ссылкам по которым уже проходил.

Ссылки можно записывать в set. Тогда не нужно будет проверять, посещал скрипт эту страницу или нет.

Офлайн

#7 Авг. 11, 2015 20:56:19

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

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'))

На сайте около 2 000 страниц. Они плотно перелинкованы.
Как сказал ayb ссылки будут добавляться бесконечно и цикл будет бесконечным. Поэтому нужно вести список уже поссещенных страниц.
ayb
Ссылки можно записывать в set
Что такое set?

Отредактировано psyh (Авг. 11, 2015 20:57:01)

Офлайн

#8 Авг. 11, 2015 21:14:44

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

set - набор уникальных элементов. В Вашем случае это будет список уникальных адресов. Ограничение по памяти есть ?

Офлайн

#9 Авг. 11, 2015 21:56:02

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

psyh
Как сказал ayb ссылки будут добавляться бесконечно и цикл будет бесконечным.
ну если делать так
for link in soup.find_all('a'):
	print (link.get('href'))
	links.append(link.get('href'))
то так можно и полинтернета спарсить :)

а так все это говорит что очень плохо продумана логика!

или же вы хотите “украсть” сайт - сделать полную копию
то тогда есть уже готовые решения, на линукс точно
запускаете скрипт и весь сайт у вас на локалке, со всеми изображениями
гугл в помощь
а так как вы даже не знаете что такое set, то это для вас единственное решение!
psyh
Кроме того написать самому было бы интереснее.
методом тыка?!

или учите пайтон, или пользуйтесь готовыми решениями, или платите/просите (может кто-то сделает бесплатно)
иного пути, увы, нету!



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Авг. 11, 2015 21:56:46)

Офлайн

#10 Авг. 12, 2015 09:43:29

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужен совет по логике парсера

ayb На домашнем компе собираюсь запустить, памяти думаю хватит. Почитал про set, кажется то что нужно.
Если бы можно было добавлять новые элементы множества именно в конец, и обращаться к n-ному элементу множества, то я представляю как сделать все с один множеством. Иначе нужно делать два списка - черный и белый.

terabayt

terabayt
то так можно и полинтернета спарсить
Можно, если не добавить проверку домена.
terabayt
а так все это говорит что очень плохо продумана логика!
Собственно про логику я и сапрашивал в самом начале. Альтернативного варианта пока не услышал.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version