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
- 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.
- 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}
- 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