Extraindo Informações do Qiushibaike usando Python

Como Obter os Dados

Primeiro, precisamos acessar o site Qiushibaike e analisar sua estrutura usando as ferramentas de desenvolvedor do navegador (F12 no Chrome).

Ao rolar a página até o final e mudar para a segunda página, observamos que a URL segue um padrão específico. Podemos concluir que o número na URL representa o número da página, e existem 13 páginas no total.

https://www.qiushibaike.com/8hr/page/{número_da_página}/

Como podemos ver na aba Response, os dados são retornados em formato HTML. Para processar esses dados, utilizaremos a biblioteca BeautifulSoup.

Processamento dos Dados

  1. Extração de informações dos artigos

Abaixo está o código para processar os dados HTML:

def processar_dados_html(self, resposta):
    dados_coletados = []
    informacao_artigo = {}
    informacao_artigo['data_atual'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    soup = BeautifulSoup(resposta, "html.parser")
    # As tags li possuem diferentes valores de classe, como 'item typs_video', 'item typs_multi', etc.
    itens_lista = soup.find_all('li', class_=re.compile((r'item tipos_(\w+)')))
    
    for item in itens_lista:
        # Obter o link do artigo
        informacao_artigo["url"] = item.find('a', class_='conteudo-recomendado').get('href')
        # Obter o título do artigo
        informacao_artigo["titulo"] = item.find('a', class_='conteudo-recomendado').get_text()
        # Obter número de curtidas
        informacao_artigo["curtidas"] = item.find_all('span')[0].get_text()
        # Obter nome do autor
        informacao_artigo["autor"] = item.find('span', class_='nome-autor').get_text()
        # Obter número de comentários
        informacao_artigo["comentarios"] = item.find_all('span')[3].get_text() if len(item.find_all('span')) == 6 else str()

        # Acessar a página do artigo para obter informações do autor
        dados_usuario = self.obter_pagina_filha(informacao_artigo["url"])
        informacao_artigo.update(dados_usuario)
        dados_coletados.append(informacao_artigo.copy())
    return dados_coletados

O HTML retornado contém apenas informações dos artigos. Para obter dados do autor, precisamos acessar as páginas individuais.

  1. Coleta de informações do usuário em páginas filhas

Ao clicar em um artigo, notamos que cada um tem um link específico no formato:

https://qiushibaike.com/+parte_do_link

Com essa informação, podemos criar um loop que, ao processar cada artigo, também busca as informações do autor fazendo duas requisições GET.

Abaixo está o código para processar as páginas filhas:

def obter_pagina_filha(self, url_artigo):
    genero = str()
    idade = int()
    url_completa = self.url_base + url_artigo
    resposta = requests.get(url_completa, headers=self.headers).text
    sopa = BeautifulSoup(resposta, "html.parser")
    div_usuario = sopa.find('div', class_='top-usuario-lateral')
    informacao_genero = div_usuario.find('span', class_=re.compile((r'num-seguidores (\w+)')))
    
    if informacao_genero:
        # Extrair gênero
        genero = re.search(r'usuario(\w)', str(informacao_genero)).group()[-1]
        # Extrair idade
        idade = re.search(r'(\d+)', str(informacao_genero)).group()
    return {"genero": genero, "idade": idade}

  1. Armazanamento dos Dados

Os dados podem ser salvos em arquivos ou em um banco de dados. Neste exemplo, optamos por armazenar em banco de dados.

Resultado

O programa em execução, com uma barra de progresso para melhor visualização.

O código completo pode ser encontrado no artigo original:

https://mp.weixin.qq.com/s?__biz=Mzg3OTExODI3OA==&mid=2247484026&idx=1&sn=5b75ff99c960a6f36211916c0e91f03e&chksm=cf0810d3f87f99c58ba21745777455d9021567504a87beb279c2605e44bce0b5ea1ce96f702d&token=1242100797&lang=zh_CN#rd

Tags: Python BeautifulSoup web scraping Requests HTML Parsing

Publicado em 6-20 21:50