Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
import urllib # urllib для краткости примера. Обычно Scrapy или celery.
from lxml import etree
topic={}
tree=etree.HTML(urllib.urlopen('http://habrahabr.ru/blogs/python/121815/').read())
_topic_block=tree.cssselect("div.hentry")[0]
topic['title']=_topic_block.xpath("h2/span[@class='topic']/text()")[0]
topic['body']=etree.tounicode(_topic_block.xpath("div[@class='content']")[0])
topic['tags']=_topic_block.xpath("ul[@class='tags']/li/a/text()")
topic['author']=_topic_block.cssselect("a.nickname")[0].xpath("span/text()")[0]
При этом я обычно использую пару своих функций — расширений для XPath чтобы проще @class обрабатывать и не использую CSS селекторы. Тут уж совсем для краткости сделал.""" 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 по самые гланды».if parser.group('gsource')=='Бизнес-журнале':
return 'Бизнес-журнал'
else:
return parser.group('gsource')if len(src)==0 можно писать if not src: и т.п.if condition: do smth (if и тело подвыражения на одной строке) хоть и можно, но очень не рекомендуется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'))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. Как собрать архив Голубятен