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
requestsmó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
txtestatususandoprintfunçã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 resultVamos 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:
- 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
- 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
requestspacote 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
.selectpara selecionar todos os<h1>tags e armazenar o texto desses h1 dentroall_h1_tagsLista. - Crie uma variável
seventh_p_texte armazene o texto do 7ºpelemento (í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
.selectpara extrair os títulos. (Dica: um seletor para títulos de produtos pode sera.title) - Usar
.selectpara extrair o rótulo de contagem de revisão para esses títulos de produtos. (Dica: um seletor para comentários pode serdiv.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
stripmé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:
- Em primeiro lugar, você seleciona todos os
div.thumbnailelementos que fornecem uma lista de produtos individuais - Então você itera sobre eles
- Porque
selectpermite que você se encadeie, você pode usar selecionar novamente para obter o título. - Observe que porque você está executando dentro de um loop para
div.thumbnailjá, oh4 > a.titleo seletor forneceria apenas um resultado, dentro de uma lista. Você seleciona o 0º elemento dessa lista e extrai o texto. - 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:
- Nome do Produto
- Preço
- Descrição
- Avaliações
- 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!