{"id":3065,"date":"2020-11-03T17:34:50","date_gmt":"2020-11-03T20:34:50","guid":{"rendered":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/?p=3065"},"modified":"2025-09-02T14:11:12","modified_gmt":"2025-09-02T17:11:12","slug":"web-scraping-em-python","status":"publish","type":"post","link":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/2020\/11\/03\/web-scraping-em-python","title":{"rendered":"Web Scraping em Python"},"content":{"rendered":"\n<p>Ei pessoal, nessa edi\u00e7\u00e3o do PET Reda\u00e7\u00e3o iremos falar sobre Web Scraping. Constantemente precisamos extrair informa\u00e7\u00f5es de sites para fazer an\u00e1lises e, comumente, isso \u00e9 feito manualmente. Utilizando a t\u00e9cnica de Web Scraping, esse processo se torna muito mais r\u00e1pido e eficiente, automatizado. Ele \u00e9 uma t\u00e9cnica para extrair informa\u00e7\u00f5es importantes de algum site que ser\u00e3o analisadas futuramente. Essas podem auxiliar na tomada de decis\u00f5es, principalmente de marketing. Nesta reda\u00e7\u00e3o, vamos conhecer um pouquinho mais sobre essa t\u00e9cnica e como trabalhar com ela na linguagem Python.<\/p>\n<p>Para trabalharmos com Web Scraping precisamos conhecer o b\u00e1sico das tags HTML, pois estaremos buscando os dados que se encontram nelas. Para esta reda\u00e7\u00e3o, abra o site da <a href=\"https:\/\/www.ufsm.br\/\">Universidade<\/a> e tecle \u201cF12\u201d. Ao fazermos isso, temos acesso ao c\u00f3digo HTML do site e podemos verificar que h\u00e1 tags \u201cdiv\u201d, \u201cspan\u201d, \u201cmain\u201d, dentre outras.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter wp-image-3056 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-1.png\" alt=\"\" width=\"1366\" height=\"725\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-1.png 1366w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-1-300x159.png 300w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-1-1024x543.png 1024w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-1-768x408.png 768w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/p>\n<p>Ao abrirmos o menu de inspe\u00e7\u00e3o da p\u00e1gina em \u201cF12\u201d, podemos ver o menu de op\u00e7\u00f5es na parte superior. Ao clicar no \u00edcone da seta, destacado na figura abaixo, podemos mover o mouse pelos elementos da p\u00e1gina e no menu \u00e0 direita, ser\u00e1 exibido o elemento HTML ao qual ele pertence. Precisaremos desta informa\u00e7\u00e3o quando buscarmos os dados em nosso c\u00f3digo.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-3057 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-2.png\" alt=\"\" width=\"457\" height=\"28\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-2.png 457w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-2-300x18.png 300w\" sizes=\"(max-width: 457px) 100vw, 457px\" \/><\/p>\n<p>Indo para o c\u00f3digo, primeiro precisamos atender alguns requisitos antes de come\u00e7ar a trabalhar com o Python. Precisamos ter instalado o Python 3 e algumas bibliotecas:<\/p>\n<ul>\n<li><strong>Requests, <\/strong>que serve para a execu\u00e7\u00e3o de requisi\u00e7\u00f5es HTTP;<\/li>\n<li><strong>Beautifulsoup, <\/strong>que ser\u00e1 respons\u00e1vel pela extra\u00e7\u00e3o de dados nos arquivos HTML; e<\/li>\n<li><strong>Pandas<\/strong>, que serve para armazenar, limpar e salvar os dados em forma de tabela.<\/li>\n<\/ul>\n<p>Instalando Python 3:<\/p>\n<ul>\n<li>Se voc\u00ea usa <strong>Windows<\/strong>, basta baixar o <a href=\"https:\/\/www.python.org\/downloads\/\">instalador<\/a> e seguir as etapas.<\/li>\n<li>No <strong>Linux<\/strong>, basta usar o comando no terminal:<\/li>\n<\/ul>\n<p><code><em>$ sudo apt-get install python3<\/em><\/code><\/p>\n<p>Instalando as Bibliotecas:<\/p>\n<ul>\n<li><strong>Windows: <\/strong>No cmd (modo administrador) use os comandos:<\/li>\n<\/ul>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <em>$ python -m pip install requests<\/em><\/code><\/p>\n<p><code><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $ python -m pip install beautifulsoup4<\/em><\/code><\/p>\n<p><code><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $ p<\/em>ython -m pip install pandas<\/code><\/p>\n<ul>\n<li><strong>Linux<\/strong>:<\/li>\n<\/ul>\n<p><em><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $ sudo pip3 install requests <\/code><\/em><\/p>\n<p><code><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $ sudo pip3 install beautifulsoup4<\/em><\/code><\/p>\n<p><code><\/code><code><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0$ sudo pip3 install pandas<\/em><\/code><\/p>\n<p>Observa\u00e7\u00e3o: note que voc\u00ea vai precisar do gerenciador de pacotes pip. Se voc\u00ea n\u00e3o tiver, use o comando <code><em>$ sudo apt-get install python3-pip<\/em><\/code><\/p>\n<p>Com tudo ok, podemos prosseguir para o desenvolvimento do c\u00f3digo. O objetivo nesta reda\u00e7\u00e3o \u00e9 buscar os eventos que aparecem na p\u00e1gina inicial do site da Universidade, comentado anteriormente. Nesta reda\u00e7\u00e3o, por motivos de organiza\u00e7\u00e3o, iremos dividir o c\u00f3digo em tr\u00eas arquivos: WebScraper-EventsUFSM.py (o arquivo principal), SearchEvent.py e GetSoup.py. Eles ser\u00e3o explicados ao longo da reda\u00e7\u00e3o.<\/p>\n<p>Iniciando com o arquivo principal, adicionamos as bibliotecas que iremos utilizar. A seguir, como iremos buscar o conte\u00fado HTML a partir da URL do site, adicionamos a URL a uma vari\u00e1vel no c\u00f3digo.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-3058 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-3.png\" alt=\"\" width=\"1086\" height=\"431\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-3.png 1086w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-3-300x119.png 300w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-3-1024x406.png 1024w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-3-768x305.png 768w\" sizes=\"(max-width: 1086px) 100vw, 1086px\" \/><\/p>\n<p>Agora, precisamos utilizar a biblioteca BeautifulSoup para extrair os dados. Essa \u00e9 a fun\u00e7\u00e3o do arquivo GetSoup.py referenciado anteriormente. Novamente, precisamos importar as bibliotecas que iremos utilizar, que, al\u00e9m da BeautifulSoup, inclui a Requests. Observe a imagem abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3059 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-4.png\" alt=\"\" width=\"868\" height=\"528\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-4.png 868w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-4-300x182.png 300w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-4-768x467.png 768w\" sizes=\"(max-width: 868px) 100vw, 868px\" \/><\/p>\n<p>Criamos uma fun\u00e7\u00e3o que ser\u00e1 referenciada no arquivo WebScraper-EventsUFSM.py. Ela recebe como par\u00e2metro a url que definimos anteriormente. Com o m\u00e9todo \u201cget\u201d da biblioteca requests, conseguimos como retorno um objeto que possui o conte\u00fado da p\u00e1gina (content) bem como o estado da requisi\u00e7\u00e3o (status_code), por exemplo. Aproveitando esse retorno, na linha 11 verificamos se houve falha na requisi\u00e7\u00e3o &#8211; se tudo correr certo, retornar\u00e1 o c\u00f3digo 200 e podemos salvar o conte\u00fado da p\u00e1gina, do contr\u00e1rio, precisamos informar que ocorreu um problema (linha 12).<\/p>\n<p>A seguir, estamos utilizando a biblioteca BeautifulSoup para transformar o conte\u00fado que buscamos com o m\u00e9todo \u201cget\u201d para que ele fique mais estruturado como as tags HTML para que possamos manipul\u00e1-lo mais facilmente. Por fim, retornamos esse valor obtido para quem chamou a fun\u00e7\u00e3o.<\/p>\n<p>Falando em quem chamou a fun\u00e7\u00e3o get_soup, vamos voltar ao arquivo WebScraper-EventsUFSM.py. Como \u00e9 poss\u00edvel ver na imagem abaixo, criamos uma vari\u00e1vel \u201csoup\u201d para receber o retorno da fun\u00e7\u00e3o.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3060 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-5.png\" alt=\"\" width=\"692\" height=\"161\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-5.png 692w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-5-300x70.png 300w\" sizes=\"(max-width: 692px) 100vw, 692px\" \/><\/p>\n<p>Agora, tendo o HTML da p\u00e1gina, podemos buscar o trecho que queremos da p\u00e1gina. A fun\u00e7\u00e3o search, que pode ser vista na imagem anterior, se refere ao \u00faltimo arquivo que estamos desenvolvendo: SearchEvent.py. Neste, estamos apenas criando uma fun\u00e7\u00e3o que ir\u00e1 buscar, por meio do m\u00e9todo \u201cfindAll\u201d, da biblioteca BeautifulSoup, todos os elementos que se encaixam na descri\u00e7\u00e3o passada como par\u00e2metro (tag, identifier e desc) e retorn\u00e1-los para o respons\u00e1vel por chamar a fun\u00e7\u00e3o. Na imagem abaixo, podemos ter uma ideia melhor de como isso \u00e9 feito:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3061 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-6.png\" alt=\"\" width=\"740\" height=\"270\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-6.png 740w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-6-300x109.png 300w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/><\/p>\n<p>Observa\u00e7\u00e3o: o m\u00e9todo findAll retorna todas as ocorr\u00eancias dos elementos especificados, diferentemente do m\u00e9todo find, que retorna apenas a primeira.<\/p>\n<p>Para finalizar, voltando ao arquivo principal, criamos um la\u00e7o para formatar as informa\u00e7\u00f5es e, a seguir, salvamos esses dados em um dicion\u00e1rio. Note que a fun\u00e7\u00e3o \u201cformat_text\u201d foi criada apenas para buscar o texto do conte\u00fado e coloc\u00e1-lo com formata\u00e7\u00e3o de t\u00edtulos. O seu corpo pode ser visto na figura 3. Estando o dicion\u00e1rio pronto, utilizamos a biblioteca pandas para salvar esses arquivos em um data frame e exibi-los em formato de tabela.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3062 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-7.png\" alt=\"\" width=\"684\" height=\"401\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-7.png 684w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-7-300x176.png 300w\" sizes=\"(max-width: 684px) 100vw, 684px\" \/><\/p>\n<p>E pronto! Est\u00e1 pronto o seu Web Scraper! Os arquivos comentados nesta reda\u00e7\u00e3o se encontram no <a href=\"https:\/\/github.com\/rarants\/Web-Scraping-em-Python-PET-Redacao\">GitHub<\/a>. Neste link se encontram outros exemplos, como WebScraper-BusSchedule.py, onde os dados s\u00e3o extra\u00eddos de uma tabela (no link), e, por meio da biblioteca pandas, s\u00e3o salvos em um dicion\u00e1rio e tamb\u00e9m como um arquivo json.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3063 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-8.png\" alt=\"\" width=\"692\" height=\"481\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-8.png 692w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-8-300x209.png 300w\" sizes=\"(max-width: 692px) 100vw, 692px\" \/><\/p>\n<p>Outro exemplo, \u00e9 o ExampleClick.py, onde, atrav\u00e9s do Python, \u00e9 simulado um evento de click de mouse. Isso pode ser \u00fatil quando queremos interagir com a p\u00e1gina para buscarmos nossas informa\u00e7\u00f5es.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3064 size-full\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-9.png\" alt=\"\" width=\"904\" height=\"552\" srcset=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-9.png 904w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-9-300x183.png 300w, https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2020\/11\/Web-Scraping-9-768x469.png 768w\" sizes=\"(max-width: 904px) 100vw, 904px\" \/><\/p>\n<p>Como visto nessa reda\u00e7\u00e3o, h\u00e1 muitas possibilidades para se trabalhar com Web Scraping em Python, este \u00e9 apenas o come\u00e7o. Essa t\u00e9cnica est\u00e1 se tornando cada vez mais importante na atualidade e \u00e9 interessante aprend\u00ea-la. Apesar disso, lembre-se de us\u00e1-la com cuidado e responsabilidade, n\u00e3o se esque\u00e7a de estudar os termos de servi\u00e7o do site em que est\u00e1 buscando seus dados nem as leis do local onde o mesmo est\u00e1 hospedado! Bons estudos.<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<p><strong>Refer\u00eancias<\/strong><strong>:<\/strong><\/p>\n<p>https:\/\/medium.com\/data-hackers\/como-fazer-web-scraping-em-python-23c9d465a37f<\/p>\n<p>https:\/\/www.pluralsight.com\/guides\/web-scraping-with-beautiful-soup<\/p>\n<p>http:\/\/www.compjour.org\/warmups\/govt-text-releases\/intro-to-bs4-lxml-parsing-wh-press-briefings\/#extracting-text-from-soup<\/p>\n<p>https:\/\/dicasdepython.com.br\/pandas-como-construir-um-dataframe-a-partir-de-um-dicionario\/<\/p>\n<p>https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.html<\/p>\n<p>https:\/\/medium.com\/machina-sapiens\/raspagem-de-dados-com-python-e-beautifulsoup-1b1b7019774c<\/p>\n<p>https:\/\/pt.stackoverflow.com\/questions\/323349\/como-apertar-o-bot%C3%A3o-de-um-site-em-python<\/p>\n<p style=\"text-align: right\"><strong><br \/>Ra\u00edssa Arantes<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ei pessoal, nessa edi\u00e7\u00e3o do PET Reda\u00e7\u00e3o iremos falar sobre Web Scraping. Constantemente precisamos extrair informa\u00e7\u00f5es de sites para fazer an\u00e1lises e, comumente, isso \u00e9 feito manualmente. Utilizando a t\u00e9cnica de Web Scraping, esse processo se torna muito mais r\u00e1pido e eficiente, automatizado. Ele \u00e9 uma t\u00e9cnica para extrair informa\u00e7\u00f5es importantes de algum site que [&hellip;]<\/p>\n","protected":false},"author":2948,"featured_media":3055,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[124,112],"tags":[74,149],"class_list":["post-3065","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-destaques","category-redacao","tag-linguagem-de-programacao","tag-redacao"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/3065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/users\/2948"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/comments?post=3065"}],"version-history":[{"count":0,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/3065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media\/3055"}],"wp:attachment":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media?parent=3065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/categories?post=3065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/tags?post=3065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}