aterrizaje de simulación scrapy
objetivo de aprendizaje:
- Uso del parámetro de cookies de objeto de solicitud de aplicación
- Comprender el papel de la función start_requests
- 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?
- Solicitar página con cookies directamente
- 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?
- Busque la etiqueta de entrada correspondiente, ingrese el texto y haga clic en iniciar sesión
1.3 Aterrizaje simulado de Scrapy
- Llevar cookies directamente
- 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
- El tiempo de caducidad de las cookies es muy largo, común en algunos sitios web irregulares.
- Capaz de obtener todos los datos antes de que caduque la cookie
- 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:
- 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
- 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
-
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
-
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
-
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
- 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
- Inicie sesión con cookies directamente: las cookies solo se pueden pasar a la recepción de parámetros de cookies
- 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í