Hello,This post i will try explain about one web cralwer made for me in NodeJS + Mongo + AngularJS. The post focus doesn't be one tutorial, the focus is share my little knowledge about MEAN (MongoDB, Express, Angular e NodeJS).The posts will separete in tree steps:1 - Initial Config2 - Web crawler logic3 - Keywords AngularJS CRUD1- Initial Config#Requeriments: NodeJSNode ExpressMongoDBBower#Node dependencies:In file package.json"dependencies": { "express": "~4.0.0", "serve-favicon": "~2.1.3", "morgan": "~1.0.0", "cookie-parser": "~1.0.1", "body-parser": "~1.0.0", "debug": "~0.7.4", "jade": "~1.3.0", "mongodb": "*", "monk": "*", "cheerio": "*" }#Bower resources config:In file bower.json:{ "name": "promocrawler", "version": "1.0.0", "dependencies": { "bootstrap": "latest", "font-awesome": "latest", "animate.css": "latest", "angular": "latest", "angular-route": "latest" }}#Configuration in App.js: Mongo config: var mongo = require('mongodb');var monk = require('monk');var db = monk(process.env.MONK_URL);var port = process.env.PORT || 8080;// Make our db accessible to our routerapp.use(function(req,res,next){ req.db = db; next();});Define routers:require('./routes/keyword.js')(app);require('./routes/crawler.js');Port definition:app.listen(port);console.log("App listening on port " + port);Source code Fala pessoal, nesse post vou tentar repassar um pouco do que aprendi estudando Scrapy (Python) nos ultimos dias.O post vai descrever um spider basico que lista em um JSON todos os topicos criados nas duas primeiras paginas do site guj.com.br.Ambiente:- Ubuntu 14.04- Sublime textFerramentas utilizadas:- Scrapy- Python- virtualenv# Instalando e criando ambiente virutalenvPara quem nao conhece, virtualenv e uma ferramenta que isola seu ambiente. Muito util para quem trabalha com mais de um projeto na mesma maquina ou para resolver problemas de permissoes.* Instalando virtualenv$sudo pip install virtualenv* Criando um novo ambiente$virtualenv NomeDoAmbiente* Ativando ambiente$source ./NomeDoAmbiente/bin/activate# Instalando scrapy no ambiente virtualenv$sudo apt-get install libxml2-dev libxslt-dev$sudo apt-get install python-lxml$pip install scrapy* Verificando instalacao do scrapy, o comando abaixo deve exibir o caminho para o seu virtualenv$which scrapyCaso o comando nao exiba o scrapy do virtualenv, voce pode forcar a execucao do scrapy apontando para bin/scrapy# Criando novo projeto com scrapy$scrapy startproject nomedoprojeto# Criando spider com template basico$scrapy genspider java guj.com.br# Adicionando alguns parametros ao arquivo de settins.py#para nao sobre carregar o siteDOWNLOAD_DELAY = 5# evitar looping de recursividadeREDIRECT_MAX_TIMES = 5#para evitar acesso remotoTELNETCONSOLE_ENABLED = False#definindo os pipelinesITEM_PIPELINES = { 'guj.pipelines.GujPipeline': 300, 'guj.pipelines.JsonWithEncodingPipeline': 800}# Abaixo vamos alterar a classe de parser chamada pelo scrapy para extrair titulo dos posts do Guj# -*- coding: utf-8 -*-import scrapyfrom guj.items import GujItem#from scrapy.contrib.spiders import CrawlSpider, Rule#from scrapy.contrib.linkextractors import LinkExtractorclass JavaSpider(scrapy.Spider): name = "java" allowed_domains = ["guj.com.br"] #navega pelas duas primeiras paginas do guj start_urls = ['http://www.guj.com.br/?p=%s' % page for page in xrange(0,2)] #rules = (Rule(LinkExtractor(allow=('/?p=', )), callback='parse_item'),) def parse(self, response): self.log('url: %s' % response.url) for a in response.xpath('/html/body/div/section/ol/li/div/div/h3/a/text()'): item = GujItem() item['title'] = a.extract() yield item# Agora vamos definir os pipelines de tratamento apos a captura do Item# -*- coding: utf-8 -*-# Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport jsonimport codecsclass GujPipeline(object): def process_item(self, item, spider): #remove os caracteres \n e \t item['title'] = item['title'].replace('\n','') item['title'] = item['title'].replace('\t','') return itemclass JsonWithEncodingPipeline(object): def __init__(self): self.file = codecs.open('scraped_data_utf8.json', 'w', encoding='utf-8') #pipeline para codificar o JSON extraido do scrapy para UTF-8, pois o scrapy cria #o json no padrao unicode def process_item(self, item, spider): line = json.dumps(dict(item), ensure_ascii=False) + "\n" self.file.write(line) return item def