Python é uma bela linguagem para codificar. Ela tem um ótimo ecossistema de pacotes, há muito menos ruído do que você encontrará em outras linguagens e é super fácil de usar.

Python é usado para várias coisas, desde análise de dados até programação de servidor. E um caso de uso empolgante do Python é o Web Scraping.

Neste artigo, abordaremos como usar Python para web scraping. Também trabalharemos em um guia prático completo de sala de aula à medida que prosseguimos.

Observação: estaremos copiando uma página da web que eu hospedo, para que possamos aprender a copiá-la com segurança. Muitas empresas não permitem a coleta de dados em seus sites, portanto, essa é uma boa maneira de aprender. Apenas certifique-se de verificar antes de raspar.

Sala de aula de introdução à Web Scraping

screenzy 1601054558203
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 requestsres = 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' variableres = requests.get(    'https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/')txt = res.textstatus = res.status_codeprint(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 BeautifulSouppage = 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 requestsfrom 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 pagepage_title = soup.title.text# print the resultprint(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 requestsfrom bs4 import BeautifulSoup# Make a requestpage = requests.get(    "https://codedamn.com")soup = BeautifulSoup(page.content, 'html.parser')# Extract title of pagepage_title = soup.title.text# Extract body of pagepage_body = soup.body# Extract head of pagepage_head = soup.head# print the resultprint(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 requestsfrom bs4 import BeautifulSoup# Make a requestpage = requests.get(    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")soup = BeautifulSoup(page.content, 'html.parser')# Extract title of pagepage_title = soup.title# Extract body of pagepage_body = soup.body# Extract head of pagepage_head = soup.head# print the resultprint(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 requestsfrom bs4 import BeautifulSoup# Make a requestpage = requests.get(    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")soup = BeautifulSoup(page.content, 'html.parser')# Extract first <h1>(...)</h1> textfirst_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 requestsfrom bs4 import BeautifulSoup# Make a requestpage = requests.get(    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")soup = BeautifulSoup(page.content, 'html.parser')# Create all_h1_tags as empty listall_h1_tags = []# Set all_h1_tags to all h1 tags of the soupfor 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 pageseventh_p_text = soup.select('p')[6].textprint(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 requestsfrom bs4 import BeautifulSoup# Make a requestpage = requests.get(    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")soup = BeautifulSoup(page.content, 'html.parser')# Create top_items as empty listtop_items = []# Extract and store in top_items according to instructions on the leftproducts = 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 requestsfrom bs4 import BeautifulSoup# Make a requestpage = requests.get(    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")soup = BeautifulSoup(page.content, 'html.parser')# Create top_items as empty listimage_data = []# Extract and store in top_items according to instructions on the leftimages = 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 requestsfrom bs4 import BeautifulSoup# Make a requestpage = requests.get(    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")soup = BeautifulSoup(page.content, 'html.parser')# Create top_items as empty listall_links = []# Extract and store in top_items according to instructions on the leftlinks = 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 requestsfrom bs4 import BeautifulSoupimport csv# Make a requestpage = 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 requestsfrom bs4 import BeautifulSoupimport csv# Make a requestpage = requests.get(    "https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")soup = BeautifulSoup(page.content, 'html.parser')# Create top_items as empty listall_products = []# Extract and store in top_items according to instructions on the leftproducts = 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!





Fonte