Python Web Scraping - Extração de dados
Analisar uma página da web significa entender sua estrutura. Agora, surge a pergunta por que é importante para web scraping? Neste capítulo, vamos entender isso em detalhes.
Análise de página da web
A análise da página da web é importante porque sem analisar não podemos saber de que forma iremos receber os dados (estruturados ou não) daquela página da web após a extração. Podemos fazer análises de páginas da web das seguintes maneiras -
Visualizando o código-fonte da página
Esta é uma maneira de entender como uma página da web é estruturada examinando seu código-fonte. Para implementar isso, precisamos clicar com o botão direito na página e selecionar oView page sourceopção. Em seguida, obteremos os dados de nosso interesse dessa página da web na forma de HTML. Mas a principal preocupação é com os espaços em branco e a formatação, que é difícil para nós formatarmos.
Inspecionar o código-fonte da página clicando na opção Inspecionar elemento
Esta é outra forma de analisar a página da web. Mas a diferença é que isso resolverá o problema de formatação e espaços em branco no código-fonte da página da web. Você pode implementar isso clicando com o botão direito e selecionando oInspect ou Inspect elementopção do menu. Ele fornecerá informações sobre uma área ou elemento específico dessa página da web.
Diferentes maneiras de extrair dados da página da web
Os métodos a seguir são usados principalmente para extrair dados de uma página da web -
Expressão regular
Eles são linguagens de programação altamente especializadas embutidas em Python. Podemos usá-lo através deremódulo do Python. Também é chamado de RE ou regexes ou padrões de regex. Com a ajuda de expressões regulares, podemos especificar algumas regras para o possível conjunto de strings que queremos corresponder a partir dos dados.
Se você quiser saber mais sobre expressões regulares em geral, acesse o link https://www.tutorialspoint.com/automata_theory/regular_expressions.htme se você quiser saber mais sobre módulo re ou expressão regular em Python, você pode seguir o link https://www.tutorialspoint.com/python/python_reg_expressions.htm .
Exemplo
No exemplo a seguir, coletaremos dados sobre a Índia http://example.webscraping.com depois de combinar o conteúdo de <td> com a ajuda da expressão regular.
import re
import urllib.request
response =
urllib.request.urlopen('http://example.webscraping.com/places/default/view/India-102')
html = response.read()
text = html.decode()
re.findall('<td class="w2p_fw">(.*?)</td>',text)
Resultado
A saída correspondente será como mostrado aqui -
[
'<img src="/places/static/images/flags/in.png" />',
'3,287,590 square kilometres',
'1,173,108,018',
'IN',
'India',
'New Delhi',
'<a href="/places/default/continent/AS">AS</a>',
'.in',
'INR',
'Rupee',
'91',
'######',
'^(\\d{6})$',
'enIN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc',
'<div>
<a href="/places/default/iso/CN">CN </a>
<a href="/places/default/iso/NP">NP </a>
<a href="/places/default/iso/MM">MM </a>
<a href="/places/default/iso/BT">BT </a>
<a href="/places/default/iso/PK">PK </a>
<a href="/places/default/iso/BD">BD </a>
</div>'
]
Observe que na saída acima você pode ver os detalhes sobre o país Índia usando a expressão regular.
Sopa linda
Suponha que desejemos coletar todos os hiperlinks de uma página da web, então podemos usar um analisador chamado BeautifulSoup, que pode ser conhecido com mais detalhes em https://www.crummy.com/software/BeautifulSoup/bs4/doc/.Em palavras simples, BeautifulSoup é uma biblioteca Python para extrair dados de arquivos HTML e XML. Ele pode ser usado com solicitações, porque precisa de uma entrada (documento ou url) para criar um objeto sopa, uma vez que não pode buscar uma página da web por si só. Você pode usar o seguinte script Python para reunir o título da página da web e hiperlinks.
Instalando a bela sopa
Usando o pip comando, podemos instalar beautifulsoup seja em nosso ambiente virtual ou em instalação global.
(base) D:\ProgramData>pip install bs4
Collecting bs4
Downloading
https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89
a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in d:\programdata\lib\sitepackages
(from bs4) (4.6.0)
Building wheels for collected packages: bs4
Running setup.py bdist_wheel for bs4 ... done
Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d
52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1
Exemplo
Observe que, neste exemplo, estamos estendendo o exemplo acima implementado com o módulo Python de solicitações. Nós estamos usandor.text para criar um objeto sopa que será usado posteriormente para buscar detalhes como o título da página da web.
Primeiro, precisamos importar os módulos Python necessários -
import requests
from bs4 import BeautifulSoup
Nesta linha de código a seguir, usamos solicitações para fazer solicitações GET HTTP para o url: https://authoraditiagarwal.com/ fazendo uma solicitação GET.
r = requests.get('https://authoraditiagarwal.com/')
Agora precisamos criar um objeto Soup da seguinte maneira -
soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)
Resultado
A saída correspondente será como mostrado aqui -
<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal
Lxml
Outra biblioteca Python que vamos discutir para web scraping é lxml. É uma biblioteca de análise de HTML e XML de alto desempenho. É comparativamente rápido e direto. Você pode ler mais sobre isso emhttps://lxml.de/.
Instalando lxml
Usando o comando pip, podemos instalar lxml seja em nosso ambiente virtual ou em instalação global.
(base) D:\ProgramData>pip install lxml
Collecting lxml
Downloading
https://files.pythonhosted.org/packages/b9/55/bcc78c70e8ba30f51b5495eb0e
3e949aa06e4a2de55b3de53dc9fa9653fa/lxml-4.2.5-cp36-cp36m-win_amd64.whl
(3.
6MB)
100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 3.6MB 64kB/s
Installing collected packages: lxml
Successfully installed lxml-4.2.5
Exemplo: extração de dados usando lxml e solicitações
No exemplo a seguir, estamos retirando um elemento específico da página da web de authoraditiagarwal.com usando lxml e solicitações -
Primeiro, precisamos importar as solicitações e o html da biblioteca lxml da seguinte forma -
import requests
from lxml import html
Agora precisamos fornecer o url da página da web para o recado
url = 'https://authoraditiagarwal.com/leadershipmanagement/'
Agora precisamos fornecer o caminho (Xpath) a um elemento específico dessa página da web -
path = '//*[@id="panel-836-0-0-1"]/div/div/p[1]'
response = requests.get(url)
byte_string = response.content
source_code = html.fromstring(byte_string)
tree = source_code.xpath(path)
print(tree[0].text_content())
Resultado
A saída correspondente será como mostrado aqui -
The Sprint Burndown or the Iteration Burndown chart is a powerful tool to communicate
daily progress to the stakeholders. It tracks the completion of work for a given sprint
or an iteration. The horizontal axis represents the days within a Sprint. The vertical
axis represents the hours remaining to complete the committed work.