por Ahad Xerife
Um projeto simples para aprender os fundamentos de web scraping
Antes de começar, vamos certificar-nos de entender o que conflitos na web é:
Web scraping ” é o processo de extração de dados a partir de sites para apresentá-lo em um formato que os usuários podem facilmente fazer sentido.
neste tutorial, quero demonstrar como é fácil construir um rastreador de URL simples em Python que você pode usar para mapear sites. Embora este programa seja relativamente simples, ele pode fornecer uma ótima introdução aos fundamentos da raspagem e automação da web. Vamos nos concentrar na extração recursiva de links de páginas da web, mas as mesmas ideias podem ser aplicadas a uma infinidade de outras soluções.
nosso programa funcionará assim:
- Visitar uma página da web
- Raspar todos os URL exclusivo da encontrada na página e adicioná-los a uma fila
- processo Recursivamente URL, um por um, até que escape a fila
- resultados de Impressão
Primeiro
A primeira coisa que deve fazer é importar todas as bibliotecas necessárias. Usaremos BeautifulSoup, requests e urllib para raspagem da web.
from bs4 import BeautifulSoupimport requestsimport requests.exceptionsfrom urllib.parse import urlsplitfrom urllib.parse import urlparsefrom collections import deque
em seguida, precisamos selecionar um URL para começar a rastrear. Embora você possa escolher qualquer página da web com links HTML, recomendo usar o ScrapeThisSite. É uma caixa de areia segura que você pode rastrear sem ter problemas.
url = "https://scrapethissite.com"
em seguida, precisaremos criar um novo objeto deque para que possamos facilmente adicionar links recém-encontrados e removê-los assim que terminarmos de processá-los. Pré-preencha o deque com sua variável url
:
# a queue of urls to be crawled nextnew_urls = deque()
podemos então usar um conjunto para armazenar URLs exclusivos depois de processados:
# a set of urls that we have already processed processed_urls = set()
também queremos acompanhar locais (mesmo domínio que o destino), estrangeiros (domínio diferente do destino) e URLs quebrados:
# a set of domains inside the target websitelocal_urls = set()
# a set of domains outside the target websiteforeign_urls = set()
# a set of broken urlsbroken_urls = set()
hora de rastrear
com tudo isso no lugar, agora podemos começar a escrever o código real para rastrear o site.
queremos olhar para cada URL na fila, ver se há algum URL adicional dentro dessa página e adicionar cada um ao final da fila até que não haja mais nenhum. Assim que terminarmos de raspar um URL, o removeremos da fila e o adicionaremos ao conjunto processed_urls
para uso posterior.
# process urls one by one until we exhaust the queuewhile len(new_urls): # move url from the queue to processed url set url = new_urls.popleft() processed_urls.add(url) # print the current url print("Processing %s" % url)
em seguida, adicione uma exceção para capturar todas as páginas da web quebradas e adicione – as ao conjunto broken_urls
para uso posterior:
try: response = requests.get(url)
except(requests.exceptions.MissingSchema, requests.exceptions.ConnectionError, requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema): # add broken urls to it's own set, then continue broken_urls.add(url) continue
em seguida, precisamos obter a URL base da página para que possamos diferenciar-se facilmente local e estrangeira de endereços:
# extract base url to resolve relative linksparts = urlsplit(url)base = "{0.netloc}".format(parts)strip_base = base.replace("www.", "")base_url = "{0.scheme}://{0.netloc}".format(parts)path = url if '/' in parts.path else url
Inicializar o BeautifulSoup para processar o documento HTML:
soup = BeautifulSoup(response.text, "lxml")
Agora raspar a página da web para todos os links de classificação e adicioná-los para o seu correspondente conjunto de:
for link in soup.find_all('a'): # extract link url from the anchor anchor = link.attrs if "href" in link.attrs else ''
if anchor.startswith('/'): local_link = base_url + anchor local_urls.add(local_link) elif strip_base in anchor: local_urls.add(anchor) elif not anchor.startswith('http'): local_link = path + anchor local_urls.add(local_link) else: foreign_urls.add(anchor)
Desde que eu quiser limitar o meu rastreador para endereços locais apenas, adicione o seguinte para adicionar novas URLs para nossa fila:
for i in local_urls: if not i in new_urls and not i in processed_urls: new_urls.append(i)
Se você deseja rastrear todos os URLs de uso:
if not link in new_urls and not link in processed_urls: new_urls.append(link)
Aviso: A forma como o programa funciona atualmente, o rastreamento de estrangeiros URL vai levar um tempo MUITO longo. Você poderia ter problemas para raspar sites sem permissão. Use por sua conta e risco!
Aqui está todo o meu código:
E que deveria ser. Você acabou de criar uma ferramenta simples para rastrear um site e mapa de todos os URLs encontrado!
Conclusão
Sinta-se livre para criar e melhorar esse código. Por exemplo, você pode modificar o programa para a pesquisa de páginas da web por endereços de e-mail ou números de telefone enquanto você rastreá-los. Você pode até estender a funcionalidade adicionando argumentos de linha de comando para fornecer a opção de definir arquivos de saída, limitar as pesquisas à profundidade e muito mais. Saiba mais sobre como criar interfaces de linha de comando para aceitar argumentos aqui.