Arrastar da entrada ao abandono 5 - o uso de middleware

Uso de middleware scrapy

Insira a descrição da imagem aqui

alvo de aprendizagem:
  1. Método de uso de UA aleatório usando middleware em scrapy
  2. Método de uso de proxy ip em scrapy
  3. Use raspagem com selênio

1. A classificação e função de middleware scrapy

1.1 Classificação de middleware scrapy

De acordo com os diferentes locais do processo de execução de scrapy, ele é dividido em:

  1. Baixar middleware
  2. Middleware Crawler
1.2 A função de scrapy: solicitação de pré-processamento e objetos de resposta
  1. Substitua e processe cabeçalhos e cookies
  2. Use proxy ip, etc.
  3. Personalize o pedido,

Mas no caso de scrapy por padrão, ambos os middlewares estão no arquivo middlewares.py

O middleware do crawler é usado da mesma forma que o middleware de download e as funções são repetidas, geralmente o middleware de download é usado

2. Como usar o middleware de download:

Em seguida, modificamos e aprimoramos o rastreador de recrutamento Tencent e aprendemos como usar o middleware baixando o middleware.
Escrever um Downloader Middlewares é o mesmo que escrever um pipeline. Defina uma classe e a abra na configuração.

Método padrão de downloader Middlewares:

  • process_request (self, request, spider):

    1. Este método é chamado quando cada solicitação passa pelo middleware de download.
    2. Return None value: Se não houver retorno, None é retornado. O objeto de solicitação é passado para o downloader ou passado para outros métodos process_request de baixo peso por meio do mecanismo
    3. Retorne o objeto Response: não solicite mais, retorne a resposta ao mecanismo
    4. Retorne o objeto de solicitação: passe o objeto de solicitação para o planejador através do mecanismo, neste momento ele não passará outros métodos process_request de baixo peso
  • process_response (self, request, response, spider):

    1. Chamado quando o downloader conclui a solicitação http e passa a resposta ao mecanismo
    2. Retornar ao Resposne: o método process_response do mecanismo para o rastreador ou para outro download de middleware com peso inferior
    3. Retorne o objeto Request: Passe o mecanismo ao chamador para continuar a solicitação, neste momento ele não passará outros métodos process_request de baixo peso
  • Configure para habilitar middleware em settings.py, quanto menor o valor do peso, melhor execução

3. Defina o middleware de download que implementa o User-Agent aleatório

3.1 Melhorar o código em 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 Definido para ativar o middleware de download personalizado nas configurações, o método de configuração é o mesmo do pipeline

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

3.3 Adicionar lista UA nas configurações

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"
]

Execute um rastreador para observar o fenômeno

4. Uso de proxy ip

4.1 Análise de pensamento

  1. Local adicionado por proxy: adicione proxycampos em request.meta
  2. Obtenha um ip de proxy e atribua-o arequest.meta['proxy']
    • Selecione aleatoriamente o ip do proxy no pool de proxy
    • O webapi do ip do proxy envia uma solicitação para obter um ip do proxy

4.2 realização concreta

IP de proxy grátis:

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 cobrado:

# 人民币玩家的代码(使用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 Verifique se o ip do proxy está disponível

No caso de usar um ip do proxy, você pode manipular o uso do ip do proxy no método process_response () do middleware de download. Se o ip do proxy não puder ser usado, você pode substituir outros ips do proxy

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

5. Use selênio no middleware

Pegue o login do github como exemplo

5.1 Complete o código do 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 Use selênio em 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属性进行替换
Depois de configurar o middleware no arquivo de configuração, a execução do rastreador pode ver o conteúdo relacionado ao selênio nas informações de log

resumo

O uso de middleware:

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

    1. Este método é chamado quando cada solicitação passa pelo middleware de download.
    2. Return None value: Se não houver retorno, None é retornado. O objeto de solicitação é passado para o downloader ou passado para outros métodos process_request de baixo peso por meio do mecanismo
    3. Retorne o objeto Response: não solicite mais, retorne a resposta ao mecanismo
    4. Retorne o objeto de solicitação: passe o objeto de solicitação para o planejador através do mecanismo, neste momento ele não passará outros métodos process_request de baixo peso
  • process_response (self, request, response, spider):

    1. Chamado quando o downloader conclui a solicitação http e passa a resposta ao mecanismo
    2. Retornar ao Resposne: o método process_response do mecanismo para o rastreador ou para outro download de middleware com peso inferior
    3. Retorne o objeto Request: Passe o mecanismo ao chamador para continuar a solicitação, neste momento ele não passará outros métodos process_request de baixo peso
  1. É necessário habilitar o middleware em settings.pyDOWNLOADER_MIDDLEWARES
    = { 'myspider.middlewares.UserAgentMiddleware': 543, }


O mecanismo é entregue ao rastreador para processamento ou ao método process_response de outro middleware de download com peso inferior
3. Objeto de solicitação de retorno: Passe o mecanismo ao chamador para continuar a solicitação, neste momento, ele não passará outros métodos process_request de peso inferior

  1. É necessário habilitar o middleware em settings.pyDOWNLOADER_MIDDLEWARES
    = { 'myspider.middlewares.UserAgentMiddleware': 543, }


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