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
estatus
usandoprint
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:
- 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 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 dentroall_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 sera.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 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
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:
- Em primeiro lugar, você seleciona todos os
div.thumbnail
elementos que fornecem uma lista de produtos individuais - Então você itera sobre eles
- Porque
select
permite 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.thumbnail
já, oh4 > a.title
o 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 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:
- 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 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!