• Парсинг на Pуthon. Как собрать архив Голубятен
    +1
    У Scrapy есть преимущество в том, что он обладает высокой поизводительностью (может качать десятки документов одновременно) и кучей готовых вспомогательных модулей, например для защиты от повторной загрузки уже загруженных страниц и зацикливания, поддержка Cookies и пр.
    Есть модули для создания к нему веб-интерфейса. Есть встроенная telnet консоль (т.е. можно подключиться к запущенному и работающему пауку по telnet и выполнять внутри него любые команды Python прям во время работы). Но при этом нужно иметь в виду, что он работает асинхронно и для сохранения собранных данных в БД уже нужно изворачиваться.
    Чтобы сохранить данные не в файл а в GoogleDocs тоже придется дополнительно потрудиться…
    Вызвать Scrapy из кода можно, но эта возможность по-моему не документирована. Я как-то так его стартовал:
    """ run as `python this_file.py <spider_name> <start_url>` """
    import os
    os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'forums.settings')
    
    import sys
    from scrapy.core.queue import ExecutionQueue
    from scrapy.core.manager import scrapymanager
    from scrapy.spider import spiders
    import scrapy_syslog_log as syslog_log
    
    def main():
        syslog_log.patch()
        scrapymanager.configure(control_reactor=True)
        q=ExecutionQueue()
        spider_name, url=get_spider_and_url()
        spider=spiders.create(spider_name)
        q.append_url(spider.getFetchUrl(url), spider)
        scrapymanager.queue=q
        scrapymanager.start()#this is blocking call
        sys.stdout.write('OK')
        sys.exit(0)
    
    
    def get_spider_and_url():
        if len(sys.argv)<3:
            sys.stdout.write('ERR')
            sys.exit('NOT ALL ARGS')
    
        return sys.argv[1:]
    
    if __name__=='__main__':
        main()
    Чтоб этот кусок кода написать, пришлось «погрузиться в Srapy по самые гланды».

    Для GoogleDocs попробуйте официальную библиотеку от Google code.google.com/p/gdata-python-client/.
    Вот примеры: code.google.com/p/gdata-python-client/source/browse/samples/docs/docs_example.py code.google.com/p/gdata-python-client/source/browse/samples/docs/resumable_upload_sample.py
    Но со Scrapy ее будет не очень легко интегрировать. Разве что пул потоков организовать т.к. Scrapy неблокирующий а библиотека блокирующая.
  • Парсинг на Pуthon. Как собрать архив Голубятен
    0
    >> Notepad++ — текстовый редактор с подсветкой синтаксиса:

    SciTE(http://code.google.com/p/scite-ru/) лучше)
  • Парсинг на Pуthon. Как собрать архив Голубятен
    0
    С помощью join (он работает быстрее, чем последовательность конкатенаций).
    Но данном случае это неактуально, потому что склеивание строк активно используется только при создании CSV вручную, а для этого, как уже написали выше, есть специальный модуль.
  • Парсинг на Pуthon. Как собрать архив Голубятен
    +8
    Хоть и не хочется обидеть, но… Похвально конечно, что боле менее разобрались и задачу решили, но статью такую лучше не показывать публично. И код тоже.
    Вообще, как уже сказали, по стилю написания очень похоже на курсовую или какую-то именно студенческую работу. Типа 2 дня перед зачетом, быстренько прочитал первые 5 абзацев из каждого мануала и начал строчить статью с как можно большим наборов умных слов и растянутыми предложениями… Это уж очень в глаза бросается.

    По коду:
    * все-таки не понимаю зачем XPath вынесли в конфиг… SQL запросы в своих программах тоже в конфиг будете выносить?
    * лесенки из if — это как-то очень подозрительно…
    * вместо if len(src)==0 можно писать if not src: и т.п.
    * писать if condition: do smth (if и тело подвыражения на одной строке) хоть и можно, но очень не рекомендуется
    * строки кода длиннее 80 символов не рекомендуются. Если пишите цепочку функций, лучше переносите на след. строку, обернув в скобки:
    m.synopsis = get_text(item,cfg['sgolub']['list']['xpath_synopsis']).strip('\n').replace('\n',u' ').replace(';',u'|').strip().encode('utf-8')
    заменяем на
    m.synopsis = (
        get_text(item,cfg['sgolub']['list']['xpath_synopsis'])
        .strip('\n')
        .replace('\n',u' ')
        .replace(';',u'|')
        .strip()
        .encode('utf-8'))

    * генерировать CSV вручную — последнее дело. Есть специальный модуль, встроенный в Python docs.python.org/library/csv.html
    * вместо
    fdoc = open(fname, 'w')
    fdoc.write(m.text)
    fdoc.close()

    пишем
    with open(fname, 'w') as fdoc:
        fdoc.write(m.text)
    — после выхода из with или если случится Exception файл закроется автоматически. Файловые дескрипторы гарантированно не утекают
    * self.mlist+=[m] заменяем на self.mlist.append(m)
    * Хранить ВСЕ скачанные материалы в памяти (self.mlist) не рационально. Лучше записывать в файл сразу после распарсивания очередной статьи. yield вам в помощь. Хотя тут много уже переписывать придется.
    * Везде по коду натыканы .encode('utf-8') .encode('cp1251'). Может названия кодировок в конфиг вынести? Да и внутри программы лучше юникодом пользоваться (в Python юникод != utf8).
    * Склеивать строки сложением (+) считается дурным тоном. Но тут есть варианты.

    Можно и дальше продолжать в принципе…
  • Парсинг на Pуthon. Как собрать архив Голубятен
    +11
    Код совершенно не в стиле питона. Рекомендую заглянуть в PEP 8. Также небесполезно будет взять какой-нибудь букварь и почитать про возможности языка (словари, условный оператор, elif, format и так далее).