Tutorial de Web Scraping Python – Como extrair dados de um site

Visualização da sala de aula codedamn

Se você quiser codificar junto, você pode usar esta sala de aula codificada grátis que consiste em vários laboratórios para ajudá-lo a aprender web scraping. Este será um exercício prático de aprendizado prático sobre codedamn, semelhante a como você aprende no freeCodeCamp.

Nesta sala de aula, você usará esta página para testar web scraping: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/

Esta sala de aula consiste em 7 laboratórios, e você resolverá um laboratório em cada parte desta postagem do blog. Estaremos usando Python 3.8 + BeautifulSoup 4 para web scraping.

Parte 1: Carregando páginas da web com ‘solicitação’

Isto é o link para este laboratório.

o requests módulo permite que você envie solicitações HTTP usando Python.

A solicitação HTTP retorna um Objeto de resposta com todos os dados de resposta (conteúdo, codificação, status e assim por diante). Um exemplo de como obter o HTML de uma página:

import requests

res = requests.get('https://codedamn.com')

print(res.text)
print(res.status_code)

Requisitos de aprovação:

  • Obtenha o conteúdo do seguinte URL usando requests módulo: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
  • Armazene a resposta de texto (como mostrado acima) em uma variável chamada txt
  • Armazene o código de status (como mostrado acima) em uma variável chamada status
  • Impressão txt e status usando print função

Depois de entender o que está acontecendo no código acima, é bastante simples passar neste laboratório. Esta é a solução para este laboratório:

import requests

# Make a request to https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
# Store the result in 'res' variable
res = requests.get(
    'https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/')
txt = res.text
status = res.status_code

print(txt, status)
# print the result

Vamos passar para a parte 2 agora, onde você construirá mais em cima do seu código existente.

Isto é o link para este laboratório.

Em toda esta sala de aula, você usará uma biblioteca chamada BeautifulSoup em Python para fazer web scraping. Alguns recursos que tornam o BeautifulSoup uma solução poderosa são:

  1. Ele fornece muitos métodos simples e expressões idiomáticas Pythônicas para navegar, pesquisar e modificar uma árvore DOM. Não é preciso muito código para escrever um aplicativo
  2. O Beautiful Soup se apóia em analisadores Python populares como lxml e html5lib, permitindo que você experimente diferentes estratégias de análise ou velocidade de negociação para obter flexibilidade.

Basicamente, o BeautifulSoup pode analisar qualquer coisa na web que você fornecer.

Aqui está um exemplo simples de BeautifulSoup:

from bs4 import BeautifulSoup

page = requests.get("https://codedamn.com")
soup = BeautifulSoup(page.content, 'html.parser')
title = soup.title.text # gets you the text of the <title>(...)</title>

Requisitos de aprovação:

  • Use o requests pacote para obter o título do URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
  • Use BeautifulSoup para armazenar o título desta página em uma variável chamada page_title

Olhando para o exemplo acima, você pode ver uma vez que alimentamos o page.content dentro do BeautifulSoup, você pode começar a trabalhar com a árvore DOM analisada de uma forma muito python. A solução para o laboratório seria:

import requests
from bs4 import BeautifulSoup

# Make a request to https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract title of page
page_title = soup.title.text

# print the result
print(page_title)

Este também foi um laboratório simples em que tivemos que alterar a URL e imprimir o título da página. Este código seria aprovado no laboratório.

Parte 3: corpo e cabeça ensopados

Isto é o link para este laboratório.

No último laboratório, você viu como pode extrair o title da página. É igualmente fácil extrair certas seções também.

Você também viu que tem que ligar .text sobre estes para obter a string, mas você pode imprimi-los sem chamar .text também, e isso lhe dará a marcação completa. Tente executar o exemplo abaixo:

import requests
from bs4 import BeautifulSoup

# Make a request
page = requests.get(
    "https://codedamn.com")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract title of page
page_title = soup.title.text

# Extract body of page
page_body = soup.body

# Extract head of page
page_head = soup.head

# print the result
print(page_body, page_head)

Vamos dar uma olhada em como você pode extrair body e head seções de suas páginas.

Requisitos de aprovação:

  • Repita a experiência com URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
  • Título da página da loja (sem chamar .text) do URL em page_title
  • Armazene o conteúdo do corpo (sem chamar .text) do URL em page_body
  • Armazene o conteúdo principal (sem chamar .text) do URL em page_head

Quando você tenta imprimir o page_body ou page_head você verá que eles são impressos como strings. Mas, na realidade, quando você print(type page_body) você verá que não é uma string, mas funciona bem.

A solução deste exemplo seria simples, com base no código acima:

import requests
from bs4 import BeautifulSoup

# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract title of page
page_title = soup.title

# Extract body of page
page_body = soup.body

# Extract head of page
page_head = soup.head

# print the result
print(page_title, page_head)

Parte 4: selecione com BeautifulSoup

Isto é o link para este laboratório.

Agora que você explorou algumas partes do BeautifulSoup, vamos ver como você pode selecionar elementos DOM com os métodos BeautifulSoup.

Depois de ter o soup variável (como laboratórios anteriores), você pode trabalhar com .select nele, que é um seletor CSS dentro do BeautifulSoup. Ou seja, você pode acessar a árvore DOM da mesma forma que seleciona elementos com CSS. Vejamos um exemplo:

import requests
from bs4 import BeautifulSoup

# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Extract first <h1>(...)</h1> text
first_h1 = soup.select('h1')[0].text

.select retorna uma lista Python de todos os elementos. É por isso que você selecionou apenas o primeiro elemento aqui com o [0] índice.

Requisitos de aprovação:

  • Crie uma variável all_h1_tags. Defina-o para uma lista vazia.
  • Usar .select para selecionar todos os <h1> tags e armazenar o texto desses h1 dentro all_h1_tags Lista.
  • Crie uma variável seventh_p_text e armazene o texto do 7º p elemento (índice 6) dentro.

A solução para este laboratório é:

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create all_h1_tags as empty list
all_h1_tags = []

# Set all_h1_tags to all h1 tags of the soup
for element in soup.select('h1'):
    all_h1_tags.append(element.text)

# Create seventh_p_text and set it to 7th p element text of the page
seventh_p_text = soup.select('p')[6].text

print(all_h1_tags, seventh_p_text)

Vamos continuar.

Parte 5: principais itens sendo removidos agora

Isto é o link para este laboratório.

Vamos extrair os principais itens retirados do URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/

Se você abrir esta página em uma nova guia, verá alguns itens principais. Neste laboratório, sua tarefa é extrair seus nomes e armazená-los em uma lista chamada top_items. Você também extrairá as análises desses itens.

Para superar este desafio, tome cuidado com o seguinte:

  • Usar .select para extrair os títulos. (Dica: um seletor para títulos de produtos pode ser a.title)
  • Usar .select para extrair o rótulo de contagem de revisão para esses títulos de produtos. (Dica: um seletor para comentários pode ser div.ratings) Nota: este é um rótulo completo (ou seja, 2 avaliações) e não apenas um número.
  • Crie um novo dicionário no formato:

info = {
   "title": 'Asus AsusPro Adv...   '.strip(),
   "review": '2 reviewsnnn'.strip()
}

  • Observe que você está usando o strip método para remover quaisquer novas linhas / espaços em branco extras que você possa ter na saída. Isto é importante para passar neste laboratório.
  • Anexe este dicionário a uma lista chamada top_items
  • Imprima esta lista no final

Existem algumas tarefas a serem realizadas neste desafio. Vamos dar uma olhada na solução primeiro e entender o que está acontecendo:

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
top_items = []

# Extract and store in top_items according to instructions on the left
products = soup.select('div.thumbnail')
for elem in products:
    title = elem.select('h4 > a.title')[0].text
    review_label = elem.select('div.ratings')[0].text
    info = {
        "title": title.strip(),
        "review": review_label.strip()
    }
    top_items.append(info)

print(top_items)

Observe que esta é apenas uma das soluções. Você também pode tentar isso de uma maneira diferente. Nesta solução:

  1. Em primeiro lugar, você seleciona todos os div.thumbnail elementos que fornecem uma lista de produtos individuais
  2. Então você itera sobre eles
  3. Porque select permite que você se encadeie, você pode usar selecionar novamente para obter o título.
  4. Observe que porque você está executando dentro de um loop para div.thumbnail já, o h4 > a.title o seletor forneceria apenas um resultado, dentro de uma lista. Você seleciona o 0º elemento dessa lista e extrai o texto.
  5. Por fim, você remove qualquer espaço em branco extra e o acrescenta à sua lista.

Simples, certo?

Isto é o link para este laboratório.

Até agora você viu como pode extrair o texto, ou melhor, innerText dos elementos. Agora vamos ver como você pode extrair atributos extraindo links da página.

Aqui está um exemplo de como extrair todas as informações da imagem da página:

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
image_data = []

# Extract and store in top_items according to instructions on the left
images = soup.select('img')
for image in images:
    src = image.get('src')
    alt = image.get('alt')
    image_data.append({"src": src, "alt": alt})

print(image_data)

Neste laboratório, sua tarefa é extrair o href atributo de links com seus text também. Certifique-se do seguinte:

  • Você tem que criar uma lista chamada all_links
  • Nesta lista, armazene todas as informações do link dict. Deve estar no seguinte formato:

info = {
   "href": "<link here>",
   "text": "<link text here>"
}

  • Certifique-se de que o seu text é despojado de qualquer espaço em branco
  • Certifique-se de verificar se o seu .text é nenhum antes de você ligar .strip() nele.
  • Armazene todos esses dictos no all_links
  • Imprima esta lista no final

Você está extraindo os valores de atributo da mesma forma que extrai valores de um dicionário, usando o get função. Vamos dar uma olhada na solução para este laboratório:

import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
all_links = []

# Extract and store in top_items according to instructions on the left
links = soup.select('a')
for ahref in links:
    text = ahref.text
    text = text.strip() if text is not None else ''

    href = ahref.get('href')
    href = href.strip() if href is not None else ''
    all_links.append({"href": href, "text": text})

print(all_links)

Aqui, você extrai o href atributo exatamente como você fez no caso da imagem. A única coisa que você está fazendo é verificar se é Nenhum. Queremos defini-lo como uma string vazia, caso contrário, queremos remover os espaços em branco.

Parte 7: Gerando CSV de dados

Isto é o link para este laboratório.

Finalmente, vamos entender como você pode gerar CSV a partir de um conjunto de dados. Você criará um CSV com os seguintes títulos:

  1. Nome do Produto
  2. Preço
  3. Descrição
  4. Avaliações
  5. Imagem do Produto

Esses produtos estão localizados no div.thumbnail. O padrão CSV é fornecido abaixo:

import requests
from bs4 import BeautifulSoup
import csv
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

all_products = []

products = soup.select('div.thumbnail')
for product in products:
    # TODO: Work
    print("Work on product here")


keys = all_products[0].keys()

with open('products.csv', 'w', newline="") as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(all_products)

Você deve extrair os dados do site e gerar este CSV para os três produtos.

Requisitos de aprovação:

  • O nome do produto é a versão com espaço em branco do nome do item (exemplo – Asus AsusPro Adv ..)
  • O preço é o espaço em branco cortado, mas a etiqueta de preço total do produto (exemplo – $ 1101,83)
  • A descrição é a versão com espaço em branco da descrição do produto (exemplo – Asus AsusPro Advanced BU401LA-FA271G Dark Grey, 14 “, Core i5-4210U, 4GB, 128GB SSD, Win7 Pro)
  • As avaliações são a versão do produto com espaço em branco (exemplo – 7 avaliações)
  • A imagem do produto é o URL (atributo src) da imagem de um produto (exemplo – /webscraper-python-codedamn-classroom-website/cart2.png)
  • O nome do arquivo CSV deve ser products.csv e deve ser armazenado no mesmo diretório que seu script.py Arquivo

Vamos ver a solução para este laboratório:

import requests
from bs4 import BeautifulSoup
import csv
# Make a request
page = requests.get(
    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')

# Create top_items as empty list
all_products = []

# Extract and store in top_items according to instructions on the left
products = soup.select('div.thumbnail')
for product in products:
    name = product.select('h4 > a')[0].text.strip()
    description = product.select('p.description')[0].text.strip()
    price = product.select('h4.price')[0].text.strip()
    reviews = product.select('div.ratings')[0].text.strip()
    image = product.select('img')[0].get('src')

    all_products.append({
        "name": name,
        "description": description,
        "price": price,
        "reviews": reviews,
        "image": image
    })


keys = all_products[0].keys()

with open('products.csv', 'w', newline="") as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(all_products)

o for bloco é o mais interessante aqui. Você extrai todos os elementos e atributos do que aprendeu até agora em todos os laboratórios.

Quando você executa este código, obtém um arquivo CSV legal. E isso é tudo o que é básico para web scraping com BeautifulSoup!

Conclusão

Espero que esta sala de aula interativa de codedamn ajudou você a entender os conceitos básicos de web scraping com Python.

Se você gostou desta sala de aula e deste blog, conte-me sobre isso no meu Twitter e Instagram. Adoraria ouvir comentários!