-
scrapy cinco componentes principais Introdução
-
Engine (Scrapy)
-
Para o processamento de todo o sistema de processamento de fluxo de dados, provocando transação (Framework Core)
-
-
O programador (Scheduler)
- Motor enviou-me a aceitar o pedido, pressionado na fila e voltar novamente quando as solicitações do motor pode ser pensado como um URL (ou rastreamento URL da página é um link) fila de prioridade, o que tem de ser decidido na próxima o que crawl URLs que, enquanto a remoção de URLs duplicados
-
Downloader (Downloader)
- Para fazer download de conteúdo web e conteúdo web voltou para a aranha (Scrapy Downloader é baseado em torcido este modelo assíncrono eficaz)
-
Réptil (aranhas)
- Réptil é o trabalho principal é usada para extrair as informações que eles precisam de uma página web em particular, o chamado entidade (ponto). Os usuários também podem extrair o link, vamos Scrapy continuar a rastejar para a próxima página
-
pipeline de projetos (Pipeline)
-
Responsável pelo tratamento de répteis extraídas da entidade Web, a principal função é entidade persistente, para verificar a eficácia da entidade, remover informações desnecessárias. Quando uma página é analisado rastreador, o tubo será enviado para o projeto, e depois de uma ordem específica poucos de processamento de dados
-
-
Os dados da estação rastejantes
A maioria dos sites exibir dados Operações de paginação são realizadas, em seguida, todos os números de página de dados página correspondente está rastejando todo os dados da estação do rastreamento réptil.
Scrapy rastreamento com base em quão cheio dados que a estação?
pedido de abertura solicitação usando o método manual.
Requisitos: The Encyclopedia of embaraços todas as páginas do autor eo pedaço de dados de conteúdo rastejando corte de armazenamento persistente
arquivo de aranha:
classe QiubaiSpider (scrapy.Spider): nome = ' Qiubai ' # nome do aplicativo (identificador único) # permitindo o rastreamento de domínio (se o domínio encontra um não-url não está rastreando dados) allowed_domains = [ ' https: // www.qiushibaike.com/ ' ] # url começando rastejar start_urls = [ ' https://www.qiushibaike.com/text ' ] # rastejando várias páginas pagenum. 1 = # a partir da página # sistema com url template (imutável) URL = ' https://www.qiushibaike.com/text/page/%s/ ' # por página URL #Acesse o URL de início e a função de retorno adquire resultado, a resposta é uma função dos parâmetros do pedido de transmissão inicial para a url adquire o objeto de resposta. A função retorna os iterables valor deve ou NULL DEF o parse (Self, resposta) : # impressão (response.text) # buscar resposta tipo de conteúdo corda # Pega o nome eo conteúdo do # # respectivo tipo de conteúdo byte adquiriu impressão (response.body) # método XPath para a resposta pode ser XPath expressão ele atua diretamente sobre a função odiv response.xpath = ( ' // div [@ class = "col1-Old-style col1"] / div ' ) # impressão (len (odiv)) CONTENT_LIST = [] # para armazenar analisado dados para div_item em odiv: # lista de funções XPath dados, a lista é armazenada nos tipos Selector retorno de dados. #Nós resolvido o conteúdo é encapsulado no objeto Selector, chamar a função extracto () analisa o conteúdo foi removido do Selecor. = Div_item.xpath autor ( ' .// div [. 1] / A [2] / H2 / text () | .// div [. 1] / span / H2 / text () ' ) [0] .extract () conteúdo = div_item.xpath ( ' .// div [@ class = "Content"] / span / text () ' ) .extract () Content = '' .join (conteúdo) # listando em uma corda # impressões impressão crawl levar os dados # impressão (autor, Content) # impressão (conteúdo) author = author.strip ( ' \ n- ' ) # filtrada linha em branco content = content.strip (' \ N ' ) # analisado pacote de dados para a itens sujeitos item = FirstbloodItem () Item [ ' autor ' ] = autor Item [ ' Content ' ] = conteúdo de impressão (autor) o rendimento item # Item para submissões conduta ( pipelines.py) # rastejando página de dados de impressão ( ' pagenum = {} ' .format (self.pageNum)) IF self.pageNum <5:. # total de rastejar 13 (de 13) . self.pageNum + 1 = NEW_URL = o formato (self.url% self.pageNum) Imprimir (NEW_URL) # recursiva rastreamento de dados: callback callback parâmetro de valor (após a url pedido, os dados correspondentes obtidos continua de análise sintática), chamadas recursivas função de análise # em scrapy.Request () irá dont_filter = True conjunto de parâmetros para Verdadeiro, de modo que os pedidos não são filtrados: o rendimento scrapy.http.Request (URL = NEW_URL, a chamada de retorno = self.parse, dont_filter = TRUE)
arquivo items.py
importação scrapy classe FirstbloodItem (scrapy.Item): # definir os campos para o produto aqui como: # scrapy.Field () name = autor = scrapy.Field () conteúdo = scrapy.Field () passe
arquivo de gasoduto
Import pymysql classe FirstbloodPipeline (Object): # construtor DEF o __init__ (self): self.fp = Nenhum # definir um atributo descritor # seguir estão no processo de reescrever a classe pai: # começando répteis realizada uma vez DEF open_spider (Self, Spider): Imprimir ( ' crawlers começar ' ) self.fp (= Abrir ' ./data.txt ' , ' W ' , codificando = 'UTF-8 ' ) # tratam especificamente item de destino # Como esse método é invocado repetidamente executado, o arquivo aberto e operações próximos escritas no outros dois vão cada executar um método. DEF process_item (self, item, Spider): autor = Item [ ' autor ' ] Conteúdo = item [ ' conteúdo ' ] Contents = ' {}: {} \ n- \ n- ' .format (autor, Content) self.fp. write (Conteúdo) de retorno do item # passou para a próxima aula é executado duto DEF close_spider (Self, Spider): Imprimir ( ' crawlers end ' ) self.fp.close () # um canal arquivos de classe tubo correspondente está falando para uma plataforma de armazenamento-de dados # Submissão item rastreador só será executado o arquivo aceitos classe primeiro canal na tubulação # process_item representa o item de retorno é transmitido para o próximo item a ser realizada Pipeline # dados armazenados no banco de dados de classe mysqlPipeline (Object): # construtores def o __init__ (self): self.conn = Nenhum # definir um atributo descritor self.cursor = Nenhum self.num = 0 # a seguir estão no processo de reescrever a classe pai: # começando répteis realizada uma vez def open_spider (Self, Spider): self.conn = pymysql.Connect (= Anfitrião ' 192.168.31.xx ' , Port = 3306, = Usuário ' raiz ', Password = ' 111 ' , DB = 'XXX _db ' , charset = ' UTF-8 ' ) para impressão ( ' banco de dados rastreador Iniciar ' ) # tratam especificamente item de destino # porque o método invocado será executado várias vezes, a abertura e fechamento de arquivos operação de gravação nos outros dois terão, cada executar um método. DEF process_item (self, item, Spider): autor = Item [ ' autor ' ] Conteúdo = Item [ ' Content ' ] self.cursor = self.conn.cursor () o try : self.cursor.execute ( ' insert em valores Qiubai (% s,% s) ' , (autor, conteúdo)) self.conn.commit () , exceto Exceção como e: print (e) self.conn.rollback () retorno artigo def close_spider (self, spider): print ( ' 爬虫数据库结束' ) self.cursor.close () self.conn.close ()
configuração
= USER_AGENT ' Mozilla / 5.0 (Macintosh; Intel Mac OS X-10_12_0) AppleWebKit / 537,36 (KHTML, como Gecko) Chrome / 68.0.3440.106 Safari / 537,36 ' # disfarçar a identidade da solicitação transportadora # Obey um robots.txt governa # ROBOTSTXT_OBEY = True ROBOTSTXT_OBEY = falsa # insignificante ou não conformidade com os robôs protocolo # exibição somente o tipo especificado de informações de log , log_level, = ' ERRO ' # os pedidos Configurar máximas concorrente realizada por Scrapy (padrão: 16) # CONCURRENT_REQUESTS = 32 # Configurar Dutos item # Veja HTTPS: // DOC .scrapy.org / EN / Latest / Tópicos / item-pipeline.html ITEM_PIPELINES = { ' FirstBlood.pipelines.FirstbloodPipeline ' : 300 , ' firstBlood.pipelines.mysqlPipeline ' : 320. , # 300 indica a prioridade, maior a menor }