Fragmento da entrada ao abandono da modelagem e solicitação de 3 dados

modelagem de dados scrapy e solicitação

Insira a descrição da imagem aqui

alvo de aprendizagem:
  1. Aplicação em projeto scrapy para modelagem
  2. O aplicativo constrói o objeto Request e envia o pedido
  3. O aplicativo usa meta parâmetros para passar dados em diferentes funções analíticas

1. Modelagem de Dados

Normalmente, no processo de execução do projeto, modelagem de dados em items.py

1.1 Por que modelo

  1. Definir o item significa planejar com antecedência quais campos precisam ser apreendidos para evitar erros manuais, pois após a definição, o sistema irá verificar automaticamente durante o processo de operação
  2. Junto com os comentários, você pode saber claramente quais campos capturar. Os campos que não estão definidos não podem ser capturados. Em vez disso, você pode usar um dicionário quando houver poucos campos de destino.
  3. Alguns componentes específicos de scrapy precisam ser suportados pelo Item, como a classe de pipeline ImagesPipeline de scrapy, pesquise mais no Baidu

1.2 Como modelar

Defina os campos a serem extraídos no arquivo items.py:

class MyspiderItem(scrapy.Item): 
    name = scrapy.Field()   # 讲师的名字
    title = scrapy.Field()  # 讲师的职称
    desc = scrapy.Field()   # 讲师的介绍

1.3 Como usar classes de modelo

A definição da classe de modelo precisa ser importada e instanciada no rastreador posteriormente, e o método de uso subsequente é o mesmo que usar o dicionário

job.py :

from myspider.items import MyspiderItem   # 导入Item,注意路径
...
    def parse(self, response)

        item = MyspiderItem() # 实例化后可直接使用

        item['name'] = node.xpath('./h3/text()').extract_first()
        item['title'] = node.xpath('./h4/text()').extract_first()
        item['desc'] = node.xpath('./p/text()').extract_first()
        
        print(item)

Nota:

  1. De myspider.items import MyspiderItem esta linha de código preste atenção ao caminho de importação correto do item e ignore os erros marcados por pycharm
  2. A chave para o caminho de importação em python: onde iniciar a execução, importar de onde

1.4 Resumo do processo de desenvolvimento

  1. Criar projeto

    scrapy startproject nome do projeto
  2. Limpar

    modelo de metas no arquivo items.py
  3. Criar um rastreador

    3.1 Criar um rastreador

    scrapy genspider Domínios permitidos do nome do rastreador
    3.2 Concluir o rastreador

    Modificar start_urls para
    verificar e modificar allowed_domains para
    escrever e analisar métodos
  4. Salvar dados

    Defina o pipeline para processamento de dados no

    arquivo pipelines.py Registre e habilite o pipeline no arquivo settings.py

2. A ideia de solicitação de virada de página

O que devo fazer para extrair os dados em todas as páginas da figura a seguir?

Lembre-se de como o módulo de solicitações implementa solicitações de virada de página:

  1. Encontre o endereço URL da próxima página
  2. Chamar request.get (url)

A ideia de scrapy para realizar a virada de página:

  1. Encontre o endereço url da próxima página
  2. Construir o objeto de solicitação do endereço URL e passá-lo para o mecanismo

3. Construir o objeto Request e enviar o pedido

3.1 Método de implementação

  1. Determine o endereço URL
  2. Construir uma solicitação, scrapy.Request (url, callback)
    • retorno de chamada: especifique o nome da função de análise, indicando qual função é usada para analisar a resposta retornada pela solicitação
  3. Forneça a solicitação ao mecanismo: yield scrapy.Request (url, callback)

3.2 Rastreador de recrutamento Netease

Aprenda como implementar solicitações de virada de página rastreando as informações de recrutamento na página de recrutamento do Netease

Endereço: https://hr.163.com/position/list.do

Análise de pensamento:
  1. Obtenha os dados da página inicial
  2. Encontre o endereço da próxima página, vire a página, pegue os dados
Nota:
  1. O protocolo do ROBÔ pode ser definido nas configurações
# False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT_OBEY = False
  1. O agente do usuário pode ser definido nas configurações:
# scrapy发送的每一个请求的默认UA都是设置的这个User-Agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'

3.3 Implementação do código

No método de análise do arquivo do rastreador:

......
	# 提取下一页的href
	next_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()

	# 判断是否是最后一页
	if next_url != 'javascript:void(0)':

        # 构造完整url
        url = 'https://hr.163.com/position/list.do' + next_url

		# 构造scrapy.Request对象,并yield给引擎
		# 利用callback参数指定该Request对象之后获取的响应用哪个函数进行解析
    	yield scrapy.Request(url, callback=self.parse)
......

3.4 Mais parâmetros de scrapy.Request

scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
Explicação do parâmetro
  1. Os parâmetros entre colchetes são parâmetros opcionais
  2. retorno de chamada : indica qual função lidar com a resposta do URL atual
  3. meta : realiza a transferência de dados em diferentes funções analíticas. Meta vem com alguns dados por padrão, como atraso no download, profundidade da solicitação, etc.
  4. dont_filter: O padrão é False, irá filtrar o endereço url solicitado, ou seja, o endereço url solicitado não continuará a ser solicitado, e pode ser definido como True para o endereço url que precisa ser solicitado repetidamente, como a solicitação de virada de página da barra de post, os dados totais da página Está mudando; o endereço em start_urls será solicitado repetidamente, caso contrário, o programa não iniciará
  5. método: especifique a solicitação POST ou GET
  6. cabeçalhos: receba um dicionário, que não inclui cookies
  7. cookies: Receba um dicionário e coloque cookies especificamente
  8. body: Recebe string json, dados POST, usado ao enviar a solicitação payload_post (a solicitação de postagem será apresentada no próximo capítulo)

4. Uso de meta parâmetros

O papel do meta: meta pode realizar a transferência de dados em diferentes funções analíticas

No método de análise do arquivo do rastreador, a função parse_detail especificada pelo retorno de chamada antes da página de detalhes de extração ser adicionada:

def parse(self,response):
    ...
    yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})
...

def parse_detail(self,response):
    #获取之前传入的item
    item = resposne.meta["item"]
preste atenção
  1. O meta parâmetro é um dicionário
  2. Há uma chave fixa no meta dicionário proxy, que representa o ip do proxy. Apresentaremos o uso do ip do proxy na aprendizagem de middleware de download scrapy

resumo

  1. Melhore e use a classe de dados do item:
  2. Preencha os campos a serem rastreados em items.py
  3. Importar o item no arquivo do rastreador primeiro
  4. Depois de fazer o objeto Item, use-o diretamente como um dicionário
  5. Construa o objeto Request e envie a solicitação:
  6. Importar classe scrapy.Request
  7. Extraia o url na função de análise
  8. rendimento scrapy.Request (url, callback = self.parse_detail, meta = {})
  9. Use meta parâmetros para passar dados em diferentes funções analíticas:
  10. Passe o meta pela função de análise anterior, yield scrapy.Request (url, callback = self.xxx, meta = ())
  11. Na função self.xxx, response.meta.get ('key', '') ou response.meta ['key'] é usado para recuperar os dados passados

Código de referência

wangyi / spiders / job.py

import scrapy


class JobSpider(scrapy.Spider):
    name = 'job'
    # 2.检查允许的域名
    allowed_domains = ['163.com']
    # 1 设置起始的url
    start_urls = ['https://hr.163.com/position/list.do']

    def parse(self, response):
        # 获取所有的职位节点列表
        node_list = response.xpath('//*[@class="position-tb"]/tbody/tr')
        # print(len(node_list))

        # 遍历所有的职位节点列表
        for num, node in enumerate(node_list):
            # 索引为值除2取余为0的才是含有数据的节点,通过判断进行筛选
            if num % 2 == 0:
                item = {}

                item['name'] = node.xpath('./td[1]/a/text()').extract_first()
                item['link'] = node.xpath('./td[1]/a/@href').extract_first()
                item['depart'] = node.xpath('./td[2]/text()').extract_first()
                item['category'] = node.xpath('./td[3]/text()').extract_first()
                item['type'] = node.xpath('./td[4]/text()').extract_first()
                item['address'] = node.xpath('./td[5]/text()').extract_first()
                item['num'] = node.xpath('./td[6]/text()').extract_first().strip()
                item['date'] = node.xpath('./td[7]/text()').extract_first()
                yield item

        # 翻页处理
        # 获取翻页url
        part_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()

        # 判断是否为最后一页,如果不是最后一页则进行翻页操作
        if part_url != 'javascript:void(0)':
            # 拼接完整翻页url
            next_url = 'https://hr.163.com/position/list.do' + part_url

            yield scrapy.Request(
                url=next_url,
                callback=self.parse
            )

wangyi / items.py

class WangyiItem(scrapy.Item):
    # define the fields for your item here like:

    name = scrapy.Field()
    link = scrapy.Field()
    depart = scrapy.Field()
    category = scrapy.Field()
    type = scrapy.Field()
    address = scrapy.Field()
    num = scrapy.Field()
    date = scrapy.Field()

É o fim, se te ajudar, seja bem-vindo para curtir e seguir, seus curtidas são muito importantes para mim

Acho que você gosta

Origin blog.csdn.net/qq_45176548/article/details/111991181
Recomendado
Clasificación