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

Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее. Я только учу Питон, и хотелось бы совместить одно полезное с другим.
WoMax
psyh
Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее. Я только учу Питон, и хотелось бы совместить одно полезное с другим.
В оф. доках Scrappy есть отличный туториал для новичков, который охватывает описанные вопросы. За вечер разберетесь или даже быстрее.
terabayt
psyh
- собираю ссылки со страницы, добавляю их в кортеж или список (“Белый список”)
- заношу текущую страницу в (“Черный список”)
зачем?
в один список добавили и циклом по всем ссылкам
psyh
Знаю про фреймворки Grab и Scrappy, но думаю разбираться в них буду дольше чем делать сам. Кроме того написать самому было бы интереснее.
lxml.html
вполне будет достаточно
psyh
terabayt
в один список добавили и циклом по всем ссылкам
Такой цикл будет бесконечным. Нужно же отсекать страницы которые уже спарсены.
terabayt
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/
вам бы основы почитать…
ayb
Он о другом. Если сайт хорошо перелинкован, то он будет ходить по ссылкам по которым уже проходил.

Ссылки можно записывать в set. Тогда не нужно будет проверять, посещал скрипт эту страницу или нет.
psyh
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?
ayb
set - набор уникальных элементов. В Вашем случае это будет список уникальных адресов. Ограничение по памяти есть ?
terabayt
psyh
Как сказал ayb ссылки будут добавляться бесконечно и цикл будет бесконечным.
ну если делать так
for link in soup.find_all('a'):
	print (link.get('href'))
	links.append(link.get('href'))
то так можно и полинтернета спарсить :)

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

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

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

terabayt
terabayt
то так можно и полинтернета спарсить
Можно, если не добавить проверку домена.
terabayt
а так все это говорит что очень плохо продумана логика!
Собственно про логику я и сапрашивал в самом начале. Альтернативного варианта пока не услышал.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB