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.