Rastreamento de sites e serviços Onion com Scrapy e OnionScan

Jan 16 2023
Scrapy é uma biblioteca Python popular para web scraping e crawling. Ele permite que você extraia facilmente dados de sites, siga links para outras páginas e execute várias outras tarefas.
Foto de Kaur Kristjan no Unsplash

Scrapy é uma biblioteca Python popular para web scraping e crawling. Ele permite que você extraia facilmente dados de sites, siga links para outras páginas e execute várias outras tarefas. Neste tutorial, veremos como usar o Scrapy para rastrear um site comum e um Onion Service , que é um serviço oculto na rede TOR. Também usaremos a biblioteca OnionScan para escanear o Onion Service e extrair informações do relatório de escaneamento. Por fim, usaremos o Elasticsearch para indexar os dados e o Redis para armazená-los em um cache.

Para começar, certifique-se de ter Scrapy, OnionScan, Elasticsearch e Redis instalados. Você também precisará ter o daemon TOR em execução em sua máquina. Em seguida, crie um novo projeto Scrapy e spider usando os seguintes comandos:

scrapy startproject myproject
cd myproject
scrap
import socks
import socket
from elasticsearch import Elasticsearch
import redis
from onionscan import Onion

class CombinedSpider(scrapy.Spider):
name = 'combinedspider'
start_urls = ['https://www.example.com/', 'http://exampleonion.onion/']

def __init__(self, *args, **kwargs):
        # Set up TOR proxy
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
        socket.socket = socks.socksocket
        # Set up Elasticsearch client
        self.es = Elasticsearch(['http://localhost:9200'])
        # Set up Redis client
        self.redis = redis.Redis(host='localhost', port=6379, db=0)
        # Set up OnionScan instance
        self.onion = Onion()
        super(CombinedSpider, self).__init__(*args, **kwargs)

def parse(self, response):
        if response.url.startswith('http://exampleonion.onion/'):
            # Scan the Onion Service
            report = self.onion.scan(response.url)
            # Extract data from report
            data = {
                'summary': report.summary(),
                'services': report.services(),
                'links': report.links(),
            }
            # Index data in Elasticsearch
            self.es.index(index='onionindex', doc_type='oniontype', body=data)
            # Store data in Redis cache
            self.redis.set('last_scanned_onion', data)
        else:
            # Extract data from page
            data = {
                'title': response.css('h1::text').get(),
                'body': response.css('p').get(),
            }
            # Index data in Elasticsearch
            self.es.index(index='myindex', doc_type='mytype', body=data)
            # Store data in Redis cache
            self.redis.set('last_crawled_page', data)


# Follow links to other pages
            for href in response.css('a::attr(href)'):
                yield response.follow(href, self.parse)

Para executar o spider, use o seguinte comando:

scrapy crawl combinedspider

Espero que este tutorial tenha sido útil! Entre em contato se tiver alguma dúvida ou sugestão.