Scrapy desde la entrada hasta abandonar el inicio de sesión de 2 simulaciones

aterrizaje de simulación scrapy

Inserte la descripción de la imagen aquí

objetivo de aprendizaje:
  1. Uso del parámetro de cookies de objeto de solicitud de aplicación
  2. Comprender el papel de la función start_requests
  3. La aplicación construye y envía la solicitud de publicación

1. Revise el método de inicio de sesión simulado anterior

1.1 ¿Cómo implementa el módulo de solicitudes el inicio de sesión simulado?

  1. Solicitar página con cookies directamente
  2. Busque la dirección URL y envíe una solicitud de publicación para almacenar la cookie

1.2 ¿Cómo simula el selenio el inicio de sesión?

  1. Busque la etiqueta de entrada correspondiente, ingrese el texto y haga clic en iniciar sesión

1.3 Aterrizaje simulado de Scrapy

  1. Llevar cookies directamente
  2. Busque la dirección URL y envíe una solicitud de publicación para almacenar la cookie

2. Scrapy lleva cookies para obtener directamente la página en la que debe iniciar sesión.

Escenario de aplicación
  1. El tiempo de caducidad de las cookies es muy largo, común en algunos sitios web irregulares.
  2. Capaz de obtener todos los datos antes de que caduque la cookie
  3. Coopere con otros programas, como usar selenio para obtener la cookie después de iniciar sesión y guardarla localmente, y leer la cookie local antes de que scrapy envíe la solicitud

2.1 Implementación: Refactorizar el método starte_rquests de scrapy

El start_url en scrapy se procesa a través de start_requests, y el código de implementación es el siguiente

# 这是源代码
def start_requests(self):
    cls = self.__class__
    if method_is_overridden(cls, Spider, 'make_requests_from_url'):
        warnings.warn(
            "Spider.make_requests_from_url method is deprecated; it "
            "won't be called in future Scrapy releases. Please "
            "override Spider.start_requests method instead (see %s.%s)." % (
                cls.__module__, cls.__name__
            ),
        )
        for url in self.start_urls:
            yield self.make_requests_from_url(url)
    else:
        for url in self.start_urls:
            yield Request(url, dont_filter=True)

Por lo tanto, si la URL en la dirección start_url es una dirección URL a la que se puede acceder después de iniciar sesión, debe volver a escribir el método start_request y agregar manualmente una cookie.

2.2 Iniciar sesión en github con cookies

Cuenta de prueba noobpythoner zhoudawei123

import scrapy
import re

class Login1Spider(scrapy.Spider):
    name = 'login1'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/NoobPythoner'] # 这是一个需要登陆以后才能访问的页面

    def start_requests(self): # 重构start_requests方法
        # 这个cookies_str是抓包获取的
        cookies_str = '...' # 抓包获取
        # 将cookies_str转换为cookies_dict
        cookies_dict = {
    
    i.split('=')[0]:i.split('=')[1] for i in cookies_str.split('; ')}
        yield scrapy.Request(
            self.start_urls[0],
            callback=self.parse,
            cookies=cookies_dict
        )

    def parse(self, response): # 通过正则表达式匹配用户名来验证是否登陆成功
        # 正则匹配的是github的用户名
        result_list = re.findall(r'noobpythoner|NoobPythoner', response.body.decode()) 
        print(result_list)
        pass
Nota:
  1. Las cookies en scrapy no se pueden colocar en encabezados, existen parámetros de cookies especiales al construir la solicitud, que pueden aceptar cookies en forma de diccionario
  2. Establecer el protocolo ROBOTS, USER_AGENT en la configuración

3. scrapy.Request envía una solicitud de publicación

Sabemos que puede enviar solicitudes de publicación especificando el método y los parámetros del cuerpo a través de scrapy.Request (); pero normalmente scrapy.FormRequest () se usa para enviar solicitudes de publicación

3.1 Enviar solicitud de publicación

Nota: scrapy.FormRequest () puede enviar formularios y solicitudes ajax, consulte https://www.jb51.net/article/146769.htm

3.1.1 Análisis de ideas
  1. Encuentre la dirección URL de la publicación: haga clic en el botón de inicio de sesión para capturar el paquete y luego ubique la dirección URL como https://github.com/session

  2. Encuentra la ley del cuerpo de la solicitud: analiza el cuerpo de la solicitud de la solicitud posterior, y los parámetros que contiene están en la respuesta anterior

  3. Si el inicio de sesión es exitoso: observe si el nombre de usuario está incluido solicitando la página de inicio personal

3.1.2 El código se implementa de la siguiente manera:
import scrapy
import re

class Login2Spider(scrapy.Spider):
   name = 'login2'
   allowed_domains = ['github.com']
   start_urls = ['https://github.com/login']

   def parse(self, response):
       authenticity_token = response.xpath("//input[@name='authenticity_token']/@value").extract_first()
       utf8 = response.xpath("//input[@name='utf8']/@value").extract_first()
       commit = response.xpath("//input[@name='commit']/@value").extract_first()
        
        #构造POST请求,传递给引擎
       yield scrapy.FormRequest(
           "https://github.com/session",
           formdata={
               "authenticity_token":authenticity_token,
               "utf8":utf8,
               "commit":commit,
               "login":"noobpythoner",
               "password":"***"
           },
           callback=self.parse_login
       )

   def parse_login(self,response):
       ret = re.findall(r"noobpythoner|NoobPythoner",response.text)
       print(ret)
Consejos

Al configurar COOKIES_DEBUG = TRUE en settings.py, puede ver el proceso de entrega de cookies en la terminal


resumen

  1. La dirección URL en start_urls se entrega a start_request para su procesamiento. Si es necesario, la función start_request se puede reescribir
  2. Inicie sesión con cookies directamente: las cookies solo se pueden pasar a la recepción de parámetros de cookies
  3. scrapy.Request () enviar solicitud de publicación

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/111991111
Recomendado
Clasificación