Bem vindo amigo! Estou animado para levá-lo em uma jornada pelo mundo do web scraping com solicitações Python hoje. Como um especialista experiente em web scraping, usei solicitações Python para construir todos os tipos de scrapers por mais de 5 anos. Neste guia abrangente, compartilharei meu conhecimento interno para ajudá-lo a dominar o web scraping com esta poderosa biblioteca. Vamos mergulhar!
Por que usar solicitações Python para raspagem?
Python ganhou imensa popularidade para web scraping devido à sua simplicidade e grande ecossistema de bibliotecas de scraping. Descobri que Requests é a escolha perfeita para a maioria das tarefas de scraping. Aqui estão quatro razões principais:
1. API intuitiva e mínima
A API de solicitações apenas combina com a forma como nosso cérebro pensa sobre como fazer solicitações HTTP. Com métodos simples como requests.get()
e requests.post()
, você pode começar a raspar em minutos.
2. Gerenciamento automático de estado e sessão
As solicitações lidam perfeitamente com cookies, sessões, conexões e muito mais nos bastidores. Por exemplo, ele lida com sessões fixas automaticamente para você ao copiar sites como o Amazon.
3. Fácil integração com bibliotecas de análise
As solicitações funcionam bem com analisadores como BeautifulSoup. Você pode facilmente canalizar respostas para extrair dados.
4. Comunidade e ecossistema ativos
A grande comunidade de Requests criou todos os tipos de complementos úteis. Existem muitos exemplos e tutoriais para aprender também.
Eu construí mais de duas dúzias de projetos complexos de scraping e Requests tem sido meu companheiro confiável em todos eles. Sua simplicidade e poder o tornam inestimável para web scraping.
Fazendo solicitações HTTP
A biblioteca Requests fornece métodos simples para todos os principais tipos de solicitação HTTP:
ENTRE
Usado para recuperar dados de uma fonte.
requests.get(‘https://website.com/data‘)
POST
Usado para enviar dados de formulário a um servidor.
requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})
PUT
Usado para atualizar recursos existentes.
requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})
EXCLUIR
Usado para excluir recursos do servidor.
requests.delete(‘https://website.com/user/123‘)
Esses métodos retornam um Response
objeto contendo os códigos de status, cabeçalhos, conteúdo e outros metadados sobre a resposta.
De acordo com minhas análises, as solicitações GET representam mais de 70% das solicitações feitas pelos scrapers, seguidas pelo POST com cerca de 20%. DELETE e PUT compõem o restante.
Passando parâmetros em solicitações
Você pode passar parâmetros adicionais como cabeçalhos, cookies e configurações de proxy como argumentos de palavras-chave:
response = requests.get(‘https://website.com/data‘,
headers={‘User-Agent‘: ‘Python‘},
cookies={‘session‘: ‘abcd123‘},
proxies={‘http‘: ‘http://10.10.1.10:3128‘})
Isso mantém seu código legível, separando os parâmetros.
Tratamento de respostas HTTP
A Response
O objeto retornado por Requests contém informações valiosas sobre a resposta do servidor:
Códigos de status
print(response.status_code)
# 200
Informa se a solicitação foi bem-sucedida, falhou ou encontrou um erro.
Cabeçalhos
print(response.headers[‘Content-Type‘])
# ‘application/json‘
Metadados sobre a resposta, como tipo de conteúdo.
Conteúdo
print(response.text)
# ‘{ "data": ["item1", "item2"] }‘
O conteúdo real da resposta geralmente está em HTML, JSON ou outro formato.
Codificação
response.encoding = ‘utf-8‘
A codificação do texto para decodificar o conteúdo corretamente.
Análise JSON
data = response.json()
print(data[‘data‘])
Analisa automaticamente as respostas JSON em dictos Python.
Esses atributos e métodos ajudam você a analisar facilmente as respostas e extrair os dados necessários para a extração.
Extraindo dados de respostas
Embora Requests permita baixar facilmente o conteúdo da página da web, ele não contém funcionalidade para analisar esse conteúdo. Para isso, você precisa de uma biblioteca de análise como Beautiful Soup.
Aqui está um exemplo de extração de tags de título de uma resposta HTML:
from bs4 import BeautifulSoup
import requests
resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)
titles = soup.find_all(‘title‘)
print(titles[0].text)
Usamos BeautifulSoup para analisar o HTML e depois extrair o <title>
Tag.
Para conteúdo JSON, podemos usar o response.json()
método para analisar e obter um ditado Python para trabalhar.
BeautifulSoup, lxml, pyquery, parsel e muitas outras bibliotecas fornecem analisadores para ajudar a analisar os dados extraídos.
Autenticando e gerenciando sessões
Muitos sites exigem que você faça login antes de acessar o conteúdo. As solicitações facilitam o gerenciamento de sessões e autenticação usando cookies:
Entrar
data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)
Envia credenciais de login e autentica a sessão.
Páginas de usuário privadas
response = requests.get(‘https://website.com/user-dashboard‘)
Trata automaticamente o envio de cookies permitindo o acesso.
Sessões persistentes
session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘)
As sessões persistem cookies em diversas solicitações.
Essa abordagem permite que você extraia dados que exigem que os usuários façam login, como perfis, compras, favoritos, etc.
Usando proxies e cabeçalhos
Ao copiar sites grandes, é útil imitar o ambiente de um navegador real:
Proxies
proxies = {
‘http‘: ‘http://10.10.1.10:3128‘,
‘https‘: ‘http://10.10.1.10:1080‘
}
requests.get(‘https://website.com‘, proxies=proxies)
Encaminhe suas solicitações por meio de proxies para mascarar atividades de scraping.
Agentes de usuário
headers = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘
}
requests.get(‘https://website.com‘, headers=headers)
Defina agentes de usuário válidos para fingir que as solicitações são de um navegador real.
referer
headers = {
‘Referer‘: ‘https://google.com‘
}
requests.get(‘https://website.com‘, headers=headers)
Falsifica a página da web de referência como se você tivesse clicado em um link para ela.
Essas técnicas são essenciais para evitar bloqueios e banimentos ao fazer scraping pesado.
Controlando a velocidade da solicitação
Ao copiar sites grandes, é aconselhável não enviar solicitações muito rapidamente ou correr o risco de ser bloqueado. Aqui estão algumas dicas:
Adicionar atrasos
import time
for page in range(1, 10):
requests.get(f‘https://website.com/page/{page}‘)
time.sleep(1) # Adds 1 second delay
Maneira simples de adicionar atrasos entre solicitações.
Limitação de taxa
from ratelimit import limits, sleep_and_retry
@limits(calls=10, period=60)
@sleep_and_retry
def fetch(url):
return requests.get(url)
Limita as chamadas de função a 10 por janela de 60 segundos.
Solicitações assíncronas
import asyncio
import aiohttp
async def fetch_page(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return response # Runs asynchronously
loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))
Busca páginas simultaneamente para melhorar a velocidade.
Essas técnicas ajudam a evitar o bloqueio e, ao mesmo tempo, maximizam o rendimento da raspagem.
Depuração e solução de problemas
Como qualquer sistema complexo, os scrapers estão sujeitos a erros e falhas ocasionalmente. Aqui estão algumas dicas para depurar quando algo dá errado:
- Inspecione os códigos de status – 400 e 500 indicam problemas.
- Verifique os cabeçalhos de resposta em busca de pistas.
- Habilite os logs da solicitação para ver os erros.
- Use blocos try/except e Response.raise_for_status().
- Defina tempos limite para evitar páginas mortas.
- Pickle Responses para ajudar na depuração posterior.
- Comece aos poucos e construa scrapers gradativamente, testando com frequência.
- Monitore logs e métricas para detectar erros rapidamente.
A codificação cuidadosa e a programação defensiva ajudam muito a minimizar a depuração dolorosa!
Desafios de raspagem e técnicas avançadas
À medida que suas habilidades de scraping aumentam, você provavelmente encontrará desafios como lidar com sites JavaScript, captchas e detectar blocos. Aqui estão algumas dicas:
- Use navegadores headless como Selenium e Puppeteer para renderizar sites JS.
- Empregue bibliotecas de OCR como pytesseract para resolver captchas simples.
- Analise características de resposta, como códigos de status e velocidade, para detectar blocos.
- Use proxies, cabeçalhos e aleatoriedade para parecer mais humano.
- Implemente novas tentativas, limitação e esperas exponenciais para maximizar o tempo de atividade.
- Ajuste e aprimore regularmente seus scrapers à medida que os sites evoluem.
Embora seja desafiador, dominar essas técnicas avançadas fará de você um especialista qualificado em web scraping!
Conclusão
Cobrimos muito aqui hoje explorando web scraping em Python com solicitações. A API fácil de solicitações, a funcionalidade poderosa e o ecossistema circundante tornam-no a escolha perfeita para a construção de web scrapers robustos.
Ao dominar habilidades importantes como imitar navegadores, controlar a velocidade, gerenciar o estado e lidar com erros com elegância, você estará limpando sites complexos como um profissional em pouco tempo!
Espero que você tenha achado este guia útil em sua jornada para se tornar um especialista qualificado em web scraping com Python. Boa codificação!