Scrapy desde la entrada hasta el abandono del modelado de 3 datos y la solicitud

modelado y solicitud de datos fragmentarios

Inserte la descripción de la imagen aquí

objetivo de aprendizaje:
  1. Aplicación en proyecto scrapy para modelado
  2. La aplicación construye el objeto Solicitud y envía la solicitud
  3. La aplicación utiliza metaparámetros para pasar datos en diferentes funciones analíticas.

1. Modelado de datos

Por lo general, en el proceso de realización del proyecto, el modelado de datos en items.py

1.1 Por qué modelo

  1. Definir el artículo significa planificar de antemano qué campos deben comprenderse para evitar errores manuales, porque después de la definición, el sistema verificará automáticamente durante el proceso de operación.
  2. Junto con los comentarios, puede saber claramente qué campos capturar. Los campos que no están definidos no se pueden capturar. Puede usar un diccionario en su lugar cuando hay pocos campos de destino.
  3. Algunos componentes específicos de scrapy deben ser compatibles con Item, como la clase de tubería de ImagesPipeline de scrapy, busque más en Baidu

1.2 Cómo modelar

Defina los campos que se extraerán en el archivo items.py:

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

1.3 Cómo usar clases de plantilla

La definición de la clase de plantilla debe importarse y crearse una instancia en el rastreador más adelante, y el método de uso posterior es el mismo que el uso del diccionario.

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. Desde myspider.items, importe MyspiderItem esta línea de código, preste atención a la ruta de importación correcta del elemento e ignore los errores marcados por pycharm
  2. La clave para la ruta de importación en Python: dónde comenzar a ejecutar, importar desde dónde

1.4 Resumen del proceso de desarrollo

  1. Crear proyecto

    scrapy startproject nombre del proyecto


  2. Modelo de objetivos claros en el archivo items.py
  3. Crear un rastreador

    3.1 Crear un rastreador

    scrapy genspider Dominios permitidos del nombre del rastreador
    3.2 Completar el rastreador

    Modificar start_urls para
    comprobar y modificar allow_domains para
    escribir y analizar métodos
  4. Guardar datos

    Defina la canalización para el procesamiento de datos en el

    archivo pipelines.py Registre y habilite la canalización en el archivo settings.py

2. La idea de la solicitud de cambio de página

¿Qué debo hacer para extraer los datos de todas las páginas de la siguiente figura?

Recuerde cómo el módulo de solicitudes implementa las solicitudes de cambio de página:

  1. Busque la dirección URL de la página siguiente
  2. Llamar a request.get (url)

La idea de scrapy para realizar el cambio de página:

  1. Busque la dirección URL de la página siguiente
  2. Construya el objeto de solicitud de la dirección URL y páselo al motor

3. Construya el objeto Solicitud y envíe la solicitud

3.1 Método de implementación

  1. Determine la dirección URL
  2. Construya una solicitud, scrapy.Request (url, callback)
    • devolución de llamada: especifique el nombre de la función de análisis, indicando qué función se utiliza para analizar la respuesta devuelta por la solicitud
  3. Dar la solicitud al motor: rendimiento scrapy.Request (url, callback)

3.2 Rastreador de contratación de Netease

Aprenda a implementar solicitudes de cambio de página rastreando la información de contratación en la página de contratación de Netease

Dirección: https://hr.163.com/position/list.do

Análisis de pensamiento:
  1. Obtén los datos de la página de inicio
  2. Encuentra la dirección de la página siguiente, pasa la página, obtén los datos
Nota:
  1. El protocolo de ROBOTS se puede configurar en la configuración
# False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT_OBEY = False
  1. El agente de usuario se puede configurar en la configuración:
# 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 Implementación del código

En el método de análisis del archivo del 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 Más parámetros de scrapy.Request

scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
Explicación de parámetros
  1. Los parámetros entre paréntesis son parámetros opcionales
  2. devolución de llamada : indica qué función manejar la respuesta de la URL actual
  3. meta : Realice la transferencia de datos en diferentes funciones analíticas. Meta viene con algunos datos por defecto, como el retraso de descarga, la profundidad de la solicitud, etc.
  4. dont_filter: el valor predeterminado es Falso, filtrará la dirección URL solicitada, es decir, la dirección URL solicitada no se seguirá solicitando y se puede establecer en Verdadero para la dirección URL que debe solicitarse repetidamente, como la solicitud de cambio de página de la barra de publicaciones, los datos totales de la página Está cambiando; la dirección en start_urls se solicitará repetidamente, de lo contrario el programa no se iniciará
  5. método: especifique la solicitud POST o GET
  6. encabezados: Recibe un diccionario, que no incluye cookies
  7. cookies: Reciba un diccionario y coloque cookies específicamente
  8. cuerpo: Reciba la cadena json, los datos POST, que se utilizan al enviar la solicitud payload_post (la solicitud posterior se presentará en el siguiente capítulo)

4. Uso de metaparámetros

El papel de meta: meta puede realizar la transferencia de datos en diferentes funciones analíticas

En el método de análisis del archivo del rastreador, se agrega la función parse_detail especificada por la devolución de llamada antes de que se agregue la página de detalles de extracción:

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"]
presta atención
  1. El metaparámetro es un diccionario.
  2. Hay una clave fija en el meta diccionario proxy, que representa la ip del proxy. Introduciremos el uso de la ip del proxy en el aprendizaje del middleware de descarga scrapy.

resumen

  1. Mejore y utilice la clase de datos del artículo:
  2. Complete los campos que se rastrearán en items.py
  3. Importar elemento en el archivo del rastreador primero
  4. Después de crear el objeto Item, utilícelo directamente como un diccionario
  5. Construya el objeto Solicitud y envíe la solicitud:
  6. Importar clase scrapy.Request
  7. Extrae la URL en la función de análisis
  8. producir scrapy.Request (url, callback = self.parse_detail, meta = {})
  9. Utilice metaparámetros para pasar datos en diferentes funciones analíticas:
  10. Pase el meta a través de la función de análisis anterior yield scrapy.Request (url, callback = self.xxx, meta = ())
  11. En la función self.xxx, response.meta.get ('key', '') o response.meta ['key'] se usa para recuperar los datos pasados

Código de referencia

wangyi / arañas / 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()

Este es el final, si te ayuda, bienvenido a gustar y seguir, tus me gusta son muy importantes para mí

Supongo que te gusta

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