Pull to refresh
80
0
asdfasdfasdf@itforge

User

Send message
Увы, не могу ничего вам обещать. Но есть пример: мы с товарищем по grablab вместе занимаемся парсингом, он сначала использовал scrapy, а потом как-то не могу побороть один баг, попробовал grab:spider, да так на нём и остался. Причём он его без всякой документации юзает т.к. по сути там апи не сильно сложный.

Архитектура у обоих фреймворков одинаковая: пишем функции для обработки ответа от сервера, внутри функции можно порождать новые запросы. В данный момент в grab:spider нет никаких фишек для деплоя — я беру файл, называю его spider.py и фигачу туда всю логику, затем я запускаю его через команду python spider.py — вот и весь деплой :) В принципе, довольно удобно, в скрапи меня напрягала вся эта возня с проектами, с настройками, с пайплайнами. В спайдере нету пайплайнов, куда хотим — туда и пишем ручками… Я пишу в mongodb обычно.

В spider есть одна фича — не знаю, есть ли она в scrapy. Эта фича сильно обгечает отладку парсинга и повторный парсинг. Все GET-запросы кэшируются в монгодб. Очень-очень удобно :)
Cмотря, что называть принципиальным отличием. С высоты птичьего полёта — та же петрушка. А если смотреть оооочень детально, то в двух разных минорных версиях Scrapy можно найти принципиальные отличия :)
Просто намного чаще нужен один элемент, так что я решил более короткое имя зарезервировать для получения первого элемента из выборки.
Ну, вообще, их не одна. Например, scrapy.org очень популярен.
grablib.org/docs/grab/dom.html#xpath — используйте метод `xpath_list` или `css_list`
Честно говоря, иногда подумываю написать обёртку для регекспов, какой-нить облегчённый xpath. Просто бывает, когда надо парсить миллионы страниц, xpath слишком медленный, вернее само построение DOM-дерева.
Смотря, что за проект. Практика показывает, что есть неиллюзорные шансы найти кучу костылей и говнокода, написанных несколько лет назад человеком, которого и в проекте то уже нету :)
Мне яметрика как-то странно присылала извещения о падении сайта, через несколько часов после события. Возможно, какой-то глюк с часовыми поясами.
Нет, он бы привык и через неделю попросил бы у вас апргрейднуть комп т.к. у него последний хит подтормаживать стал.
Парни, что это вообще за конкурс, где почитать какой-нить обзор хороший про него?
не, pyquery пока тока в репозитории
Ясно. Ну такой подход ожидаемо тормозит по сравнению с lxml. Тормозит чуть ли не в 10 раз: dumpz.org/122917/ Думаю тормоза из-за того, что каждый раз вызывается функция и каждый раз в ней стрится дополнительный PyQuery-объект.

А вообще, раз мы про pyquery заговорили, я подумал — самое время — и замержился с pyquery-форком. В общем, теперь в грабе через аттрибут `pyquery` доступно PyQuery-дерево.
А вы уверены, что оно надо? Жить больше 100 лет, например. За такой срок жизнь может наскучить изрядно.
Да, чё-то глючит меня. Я тест написал.
# -*- coding: utf-8 -*- 
import time 
from scrapy.selector import HtmlXPathSelector 
import urllib
from lxml.html import fromstring

data = urllib.urlopen('http://tubesexclips.com/').read()

start = time.time() 
hxs = HtmlXPathSelector(text=data)
scrapy_results = set()
for elem in hxs.select('//div[@class="added-download"]/a'):
    href, text = elem.select('@href').extract()[0], elem.select('text()').extract()[0]
    scrapy_results.add((href, text))
print 'HtmlXpathSelector: %.2f' % (time.time() - start) 

start = time.time() 
tree = fromstring(data)
lxml_results = set()
for elem in tree.xpath('//div[@class="added-download"]/a'):
    href, text = elem.xpath('@href')[0], elem.xpath('text()')[0]
    lxml_results.add((href, text))
print 'lxml: %.2f' % (time.time() - start) 

print 'Equal: %s' % (scrapy_results == lxml_results)


Показана реальная ситуация, я очень часто итерируюсь по xpath выборке и применяю дополнительные xpath-выражения к каждому элементу выборки.

У меня такие результаты:
lorien@athlon:/web/barn$ python speed3.py
HtmlXpathSelector: 0.75
lxml: 0.02
Equal: True
pyquery предоставляет возможность писать селекторы в виде jquery-селекторов, не путайте их с css-селекторами.Это разные вещи, хоть и похожи. Кроме того, я писал выше, что lxml не поддерживает сложные css-селекторы. Мне сейчас проверять лень.
Так, с примером проблема. Я не знаю, как в scrapy без создания целого парсера просто получить HtmlXPathSelector от какого-либо содерижмого, он хочет какой-то response-объект, если вы мне подскажите, как его сделать, я напишу пример.
А я в 4 утра встал :) Но не потому что я жаворонок, просто ложился всё позднее и позднее и…
А почему оно должно было заработать? Yield же должен кто-то ловить и обрабатывать, ну вот его и ловит код, который task-функцию вызывает. Если хотите добавить из другого места task, то можете использовать просто self.add_task(Task(..)). А yield это просто для удобства и красоты.
А там, по-моему, обрезанный какой-то css, я как-то пробовал :nth-child(x) — у меня не заработало. А pyquery, наверное, всё корректно транслирует в xpath.
Бывают сайты с табличной вёрсткой, где множество вложенных тэгов table, tr, td. Там особо не к чему привязаться кроме поясняющего текста внутри нужной ячейки

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity