Criação de Crawler Distribuído com urllib - Parte 1

### Uso da Função urlopen

# encoding: utf-8

import urllib.request

resultado = urllib.request.urlopen("https://www.cnblogs.com/")
print(resultado.readlines())

# Parâmetros do urlopen
# def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None):

### Função urlretrieve

Baixar arquivos de uma URL para o disco local.

# coding: utf-8

import urllib.request

resultado = urllib.request.urlretrieve("https://www.cnblogs.com/", 'cnblog.html')

# Parâmetros do urlretrieve
# def urlretrieve(url, filename=None, reporthook=None, data=None):

### Funções de Codificação e Decodificação de Parâmetros

A função urlencode codifica caracteres especiais e caracteres não ASCII.

# urlencode

# Uso básico
# from urllib import parse
# dados = {'nome': 'Drake', 'idade': 100}
# queryString = parse.urlencode(dados)
# print(queryString)  # nome=%E5%BE%B7%E7%91%9E%E5%85%8B&idade=100

# Exemplo prático
import urllib.request, urllib.parse
url = "http://www.baidu.com/s"
parametros = {"wd": "博客园"}
queryString = urllib.parse.urlencode(parametros)
url = url + "?" + queryString
resultado = urllib.request.urlopen(url)
print(resultado.read())

A função parse_qs decodifica parâmetros de URL codificados.

import urllib.parse

queryString = "nome=%E5%BE%B7%E7%91%9E%E5%85%8B&idade=100"
print(urllib.parse.parse_qs(queryString))  # {'nome': ['Drake'], 'idade': ['100']}

### Funções urlparse e urlsplit

As funções urlparse e urlsplit dividem uma URL em seus componentes. A diferença é que urlsplit não possui o atributo "params".

import urllib.parse

url = "https://www.baidu.com/s?wd=cnblog#2"
resultado = urllib.parse.urlparse(url)
print(resultado)
# ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=cnblog', fragment='2')

print('scheme:', resultado.scheme)  # protocolo
print('netloc:', resultado.netloc)  # domínio
print('path:', resultado.path)      # caminho
print('query:', resultado.query)    # parâmetros de consulta

# Resultado
# scheme: https
# netloc: www.baidu.com
# path: /s
# query: wd=cnblog

### Recuperando Informações de Vagas no Lagou usando Request

Parâmetros da classe Request:

class Request:

    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):

Recuperando informações de vagas no Lagou:

# Usando a classe Request para obter informações de vagas no Lagou

import urllib.request, urllib.parse

url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false"

# Cabeçalho da requisição
cabecalhos = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
    "Referer": "https://www.lagou.com/jobs/list_python?city=%E5%8C%97%E4%BA%AC&cl=false&fromSearch=true&labelWords=&suginput="
}
# Dados para a requisição POST
dados = {
    'primeiro': 'true',
    'pn': 1,
    'kd': 'python'
}
# Os dados para POST devem ser codificados em bytes
requisicao = urllib.request.Request(url, headers=cabecalhos, data=urllib.parse.urlencode(dados).encode('utf-8'), method='POST')
resposta = urllib.request.urlopen(requisicao)
# As informações retornadas são em bytes, então precisam ser decodificadas
print(resposta.read().decode('utf-8'))

### Uso de ProxyHandler

Princípio do proxy: antes de solicitar o site de destino, solicitamos ao servider proxy que faça a solicitação. Após receber os dados, eles são enviados de volta a nós.

# Usando ProxyHandler
import urllib.request

url = "https://www.baidu.com/s?wd=cnblog"

# 1. Criar um handler ProxyHandler com o endereço do proxy
# manipulador = urllib.request.ProxyHandler({'http': '115.210.31.236.55:9000'})
manipulador = urllib.request.ProxyHandler({'http': '115.210.31.236.55:9000'})
# 2. Construir um opener usando o handler criado
abridor = urllib.request.build_opener(manipulador)
# 3. Usar o opener para enviar uma solicitação
resposta = abridor.open(url)
print(resposta.read())

Tags: urllib web-scraping distributed-crawling Python

Publicado em 9-27 20:54