Настройка и отладка агента сканера Python Scrapy

Scrapy

При отладке сканера новички будут сталкиваться с ошибками про ip.Хорошая программа вдруг выдает ошибку.Как ее решить?Ошибку про доступ по ip на самом деле очень легко решить,но как узнать что она решена? Как я могу быть уверен, что это проблема с IP-адресом прокси-сервера? Поскольку основным языком автора является Java, некоторые объяснения могут отличаться от объяснений воротил Python, потому что я смотрю на Python с точки зрения Java. Это также упрощает чтение и понимание разработчиками Java.

Где логика прокси ip

Скрап структура проекта выглядит так

scrapydownloadertest  # 项目文件夹
    │  items.py       # 定义爬取结果存储的数据结构
    │  middlewares.py  # 中间件(可以理解java的过滤器拦截器)
    │  pipelines.py   # 数据管道,对获取到的数据做操作
    │  settings.py   # 项目的配置文件
    │  __init__.py   # 初始化逻辑
    │
    ├─spiders  # 放置 Spiders 的文件夹
    │  │  httpProxyIp.py   # 爬取到结果后的处理类
    │  │  __init__.py    # spider初始化逻辑
scrapy.py  

Как видно из приведенного выше рисунка, настройка ip-адреса прокси-сервера должна быть установлена ​​до отправки запроса, поэтому единственным подходящим местом являетсяmiddlewares.py, так что соответствующая логика об агенте написана в этом. Добавьте прямо в него следующий код:

# Scrapy 内置的 Downloader Middleware 为 Scrapy 供了基础的功能,
# 定义一个类,其中(object)可以不写,效果一样
class SimpleProxyMiddleware(object):
    # 声明一个数组
    proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080']
    
    # Downloader Middleware的核心方法,只有实现了其中一个或多个方法才算自定义了一个Downloader Middleware
    def process_request(self, request, spider):
        # 随机从其中选择一个,并去除左右两边空格
        proxy = random.choice(self.proxyList).strip()
        # 打印结果出来观察
        print("this is request ip:" + proxy)
        # 设置request的proxy属性的内容为代理ip
        request.meta['proxy'] = proxy

    # Downloader Middleware的核心方法,只有实现了其中一个或多个方法才算自定义了一个Downloader Middleware
    def process_response(self, request, response, spider):
        # 请求失败不等于200
        if response.status != 200:
            # 重新选择一个代理ip
            proxy = random.choice(self.proxyList).strip()
            print("this is response ip:" + proxy)
            # 设置新的代理ip内容
            request.mete['proxy'] = proxy
            return request
        return response

Каждый класс промежуточного программного обеспечения загрузчика определяет один или несколько методов. Основными методами являются следующие:

  • process_request(request, spider)
  • process_response (запрос, ответ, паук)
  • process_exception(request, exception, spider)

затем найтиsetting.pyэта область в файле

Модификация заключается в следующем, то есть раскомментируйте и добавьте путь только что написанного класса Middleware.

Простой прокси ip был настроен выше, и вотhttpProxyIp.pyЭтот файл, этот файл - это то, что я передаю командеscrapy genspider httpProxyIp icanhazip.comСгенерированный, успешно созданный контент выглядит следующим образом:

# -*- coding: utf-8 -*-
import scrapy

class HttpproxyipSpider(scrapy.Spider):
    name = 'httpProxyIp'
    allowed_domains = ['icanhazip.com']
    start_urls = ['http://icanhazip.com/']

    def parse(self, response):
        pass

Давайте изменим его, и окончательный код выглядит следующим образом:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.cmdline import execute

class HttpproxyipSpider(scrapy.Spider):
    # spider 任务名
    name = 'httpProxyIp'
    # 允许访问的域名
    allowed_domains = ['icanhazip.com']
    # 起始爬取的url
    start_urls = ['http://icanhazip.com/']

    # spider 爬虫解析的方法,关于内容的解析都在这里完成; self表示实例的引用, response爬虫的结果
    def parse(self, response):
        print('代理后的ip: ', response.text)

# 这个是main函数也是整个程序入口的惯用写法
if __name__ == '__main__':
    execute(['scrapy', 'crawl', 'httpbin'])

Запустите программу в это времяscrapy crawl httpProxyIpВы можете увидеть вывод результата

Очевидно, что нужный нам результат здесь не печатается, указывая на то, что передproxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080']Это бесполезно, давайте выясним, можем ли мы его использовать, здесь мы используем бесплатный, поэтому его поиск займет некоторое время.бесплатный прокси ip

На этом настройка прокси-сервера и отладка проверки завершены.

Как настроить динамический прокси ip

Здесь используется прокси-IP.Вы можете использовать услуги, предоставляемые поставщиками облачных услуг, такими как Kuai Proxy или Abu Cloud.После того, как вы зарегистрируетесь и оплатите сбор, вам будет предоставлен URL-адрес доступа, имя пользователя и пароль.Посмотрите на код напрямую здесь! Также вmiddlewares.pyсоздать новый класс

Исправлятьsetting.pyизDOWNLOADER_MIDDLEWARESсодержание

DOWNLOADER_MIDDLEWARES = {
    # 注释掉之前的例子改用AbuyunProxyMiddleware
    # 'scrapydownloadertest.middlewares.SimpleProxyMiddleware': 100,
    'scrapydownloadertest.middlewares.AbuyunProxyMiddleware': 100,
}

Остальное место не двигается, начинаем видеть, вот еще один способ начать, потому что используется инструмент разработки PyCharm, так что вы можете напрямую

http://icanhazip.com/Это веб-сайт, который отображает IP-адрес текущего посетителя, который можно легко использовать для проверки правильности настройки IP-адреса прокси-сервера.

Обратите внимание, не потеряйтесь

Статья постоянно обновляется каждую неделю, вы можете найти «Десять минут на изучение программирования» на WeChat, чтобы прочитать и обновить ее как можно скорее.Если эта статья хорошо написана, если вы чувствуете, что есть что-то, чего можно желать ~ ставьте лайк 👍 подписывайтесь ❤️ поделитесь ❤️
Ваша поддержка и признание — самая большая мотивация для моего творчества, увидимся в следующей статье!