Scrapy desde la entrada hasta el abandono 5-el uso de middleware

Uso de middleware chatarra

Inserte la descripción de la imagen aquí

objetivo de aprendizaje:
  1. Método de usar UA aleatorio usando middleware en scrapy
  2. Método de uso de IP proxy en scrapy
  3. Use scrapy con selenio

1. La clasificación y función del middleware scrapy

1.1 Clasificación de middleware scrapy

Según las diferentes ubicaciones en el proceso de ejecución scrapy, se divide en:

  1. Descargar middleware
  2. Middleware de rastreador
1.2 El papel de scrapy: procesamiento previo de objetos de solicitud y respuesta
  1. Reemplazar y procesar encabezados y cookies
  2. Utilice IP proxy, etc.
  3. Personaliza la solicitud,

Pero en el caso de scrapy por defecto, ambos middleware están en el archivo middlewares.py

El middleware del rastreador se usa de la misma manera que el middleware de descarga, y las funciones se repiten, generalmente se usa el middleware de descarga

2. Cómo utilizar el middleware de descarga:

A continuación, modificamos y mejoramos el rastreador de contratación de Tencent, y aprendemos a usar middleware descargándolo.
Escribir un Middlewares de descarga es lo mismo que escribir una canalización. Defina una clase y luego ábrala en la configuración.

Método predeterminado de Downloader Middlewares:

  • process_request (self, request, spider):

    1. Este método se llama cuando cada solicitud pasa por el middleware de descarga.
    2. Devolver valor de None: si no hay devolución, se devuelve None. El objeto de solicitud se pasa al descargador o se pasa a otros métodos de proceso de solicitud de bajo peso a través del motor
    3. Devolver el objeto de respuesta: ya no solicitar, devolver la respuesta al motor
    4. Devolver el objeto de solicitud: pase el objeto de solicitud al programador a través del motor, en este momento no pasará otros métodos process_request de bajo peso
  • process_response (self, request, response, spider) :

    1. Se llama cuando el descargador completa la solicitud http y pasa la respuesta al motor.
    2. Volver a Resposne: el método process_response del motor al rastreador u otro middleware de descarga con menor peso
    3. Devolver el objeto de solicitud: pase el motor a la persona que llama para continuar con la solicitud, en este momento no pasará otros métodos process_request de bajo peso
  • Configure para habilitar el middleware en settings.py, cuanto menor sea el valor de peso, mejor ejecución

3. Defina el middleware de descarga que implemente User-Agent aleatorio

3.1 Mejorar el código en middlewares.py

import random
from Tencent.settings import USER_AGENTS_LIST # 注意导入路径,请忽视pycharm的错误提示

class UserAgentMiddleware(object):
    def process_request(self, request, spider):
        user_agent = random.choice(USER_AGENTS_LIST)
        request.headers['User-Agent'] = user_agent
        # 不写return

class CheckUA:
    def process_response(self,request,response,spider):
        print(request.headers['User-Agent'])
        return response # 不能少!

3.2 Establecer para habilitar el middleware de descarga personalizado en la configuración, el método de configuración es el mismo que el de la canalización

DOWNLOADER_MIDDLEWARES = {
    
    
   'Tencent.middlewares.UserAgentMiddleware': 543, # 543是权重值
   'Tencent.middlewares.CheckUA': 600, # 先执行543权重的中间件,再执行600的中间件
}

3.3 Agregar lista UA en la configuración

USER_AGENTS_LIST = [
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
    "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
    "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
    "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
    "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]

Ejecute un rastreador para observar el fenómeno

4. Uso de IP proxy

4.1 Análisis de pensamiento

  1. Ubicación agregada por proxy: agregue proxycampos en request.meta
  2. Obtenga una ip de proxy y asígnela arequest.meta['proxy']
    • Seleccione aleatoriamente la IP del proxy en el grupo de proxy
    • El webapi de la ip del proxy envía una solicitud para obtener una ip del proxy

4.2 realización concreta

IP proxy gratuito:

class ProxyMiddleware(object):
    def process_request(self,request,spider):
        # proxies可以在settings.py中,也可以来源于代理ip的webapi
        # proxy = random.choice(proxies) 

        # 免费的会失效,报 111 connection refused 信息!重找一个代理ip再试
        proxy = 'https://1.71.188.37:3128' 

        request.meta['proxy'] = proxy
        return None # 可以不写return

IP de proxy cargada:

# 人民币玩家的代码(使用abuyun提供的代理ip)
import base64

# 代理隧道验证信息  这个是在那个网站上申请的
proxyServer = 'http://proxy.abuyun.com:9010' # 收费的代理ip服务器地址,这里是abuyun
proxyUser = 用户名
proxyPass = 密码
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)

class ProxyMiddleware(object):
    def process_request(self, request, spider):
        # 设置代理
        request.meta["proxy"] = proxyServer
        # 设置认证
        request.headers["Proxy-Authorization"] = proxyAuth

4.3 Compruebe si la IP del proxy está disponible

En el caso de usar una IP de proxy, puede manejar el uso de la IP de proxy en el método process_response () del middleware de descarga. Si no se puede usar la IP de proxy, puede reemplazar otras IP de proxy

class ProxyMiddleware(object):
    ......
    def process_response(self, request, response, spider):
        if response.status != '200':
            request.dont_filter = True # 重新发送的请求对象能够再次进入队列
            return requst
Abra el middleware en settings.py

5. Use selenio en middleware

Tome el inicio de sesión de github como ejemplo

5.1 Complete el código del rastreador

import scrapy

class Login4Spider(scrapy.Spider):
    name = 'login4'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/1596930226'] # 直接对验证的url发送请求

    def parse(self, response):
        with open('check.html', 'w') as f:
            f.write(response.body.decode())

5.2 Usar selenio en middlewares.py

import time
from selenium import webdriver


def getCookies():
    # 使用selenium模拟登陆,获取并返回cookie
    username = input('输入github账号:')
    password = input('输入github密码:')
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver',
                              chrome_options=options)
    driver.get('https://github.com/login')
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="login_field"]').send_keys(username)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="login"]/form/div[3]/input[3]').click()
    time.sleep(2)
    cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
    driver.quit()
    return cookies_dict

class LoginDownloaderMiddleware(object):

    def process_request(self, request, spider):
        cookies_dict = getCookies()
        print(cookies_dict)
        request.cookies = cookies_dict # 对请求对象的cookies属性进行替换
Después de configurar el middleware en el archivo de configuración, ejecutar el rastreador puede ver el contenido relacionado con el selenio en la información de registro

resumen

El uso de middleware:

  1. Mejore el código de middleware:
  • process_request (self, request, spider):

    1. Este método se llama cuando cada solicitud pasa por el middleware de descarga.
    2. Devolver valor de None: si no hay devolución, se devuelve None. El objeto de solicitud se pasa al descargador o se pasa a otros métodos de proceso de solicitud de bajo peso a través del motor
    3. Devolver el objeto de respuesta: ya no solicitar, devolver la respuesta al motor
    4. Devolver el objeto de solicitud: pase el objeto de solicitud al programador a través del motor, en este momento no pasará otros métodos process_request de bajo peso
  • process_response (self, request, response, spider) :

    1. Se llama cuando el descargador completa la solicitud http y pasa la respuesta al motor.
    2. Volver a Resposne: el método process_response del motor al rastreador u otro middleware de descarga con menor peso
    3. Devolver el objeto de solicitud: pase el motor a la persona que llama para continuar con la solicitud, en este momento no pasará otros métodos process_request de bajo peso
  1. Necesita habilitar el middleware en settings.pyDOWNLOADER_MIDDLEWARES
    = { 'myspider.middlewares.UserAgentMiddleware': 543, }


El motor se entrega al rastreador para su procesamiento o al método process_response de otro middleware de descarga con menor peso.
3. Objeto de solicitud de devolución: pasa el motor a la persona que llama para continuar con la solicitud, en este momento, no pasará otros métodos process_request de menor peso

  1. Necesita habilitar el middleware en settings.pyDOWNLOADER_MIDDLEWARES
    = { 'myspider.middlewares.UserAgentMiddleware': 543, }


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